首先是一些基础知识:
本机的IP地址:172.0.0.1
端口号的范围为0~65535之间(2个字节),0~1023是用于知名网络服务和应用,所以最好不要用0~1023这些端口号
TCP:传输控制协议(Transmission Control Protocol)面向连接的通信协议
UDP:用户数据报协议(User Datagram Protocol)无连接的通信协议
Socket是网络驱动层提供给应用程序编程的接口和一种机制
可以把Socket比作是一个码头,应用程序将货物运送到码头,就完成了货物的运送。在另一边,应用程序只需等货物到达码头后将货物取走就可以了。
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,并告知对应的IP和端口
位于java.net包中
DatagramSocket类用于UDP通信
ServerSocket类用于TCP通信的服务器端
Socket类用于TCP通信的服务器和客户端
构造方法
----public DatagramSocket() (用于先发送的时候不用指定端口号,会自动选择一个没有用过的端口号)
----public DatagramSocket(int port) (如果要接受数据,那就必须指定一个明确的端口号)
----public DatagramSocket(int port,InetAddress laddr) (如果一个计算机上有多个IP地址的话,那就还需指定一个明确的IP地址……)
----close方法(释放掉DatagramSocket的资源之后,端口号可以重新被其他网络资源所使用)
----send(DatagramPacket p)方法(用于发送UDP数据包)
----receive(DatagramPacket p)方法(用于接受UDP数据包)
如果把DatagramSocket比作是码头,那么DatagramPacket可以看作是发送和接受数据的集装箱
构造方法
----public DatagramPacket(byte[] buff,int length) (buff代表缓冲区,length代表缓冲区的大小,在接受数据时使用,不用指定IP地址和端口)
----public DatagramPacket(byte[] buff,int length,InetAddress address,int port) (address和port代表目标计算机的IP地址和端口,在发送数据时使用)
----getAddress,getPort,getData,getLength方法
InetAddress是一个用于表示计算机IP地址的一个类
----getByName() 静态方法,返回实例
----getHostAddress() 返回IP地址字符串,形如“192.168.0.1”
字符串与字节数组之间的双向转换
UDP接受程序必须先启动才能接受到UDP发送程序所发送的内容
解决发送中文字符串的问题
发送程序:
1 import java.net.DatagramPacket;
2 import java.net.DatagramSocket;
3 import java.net.InetAddress;
4
5 public class UdpSend {
6 public static void main(String[] args) throws Exception {
7 DatagramSocket ds=new DatagramSocket();
8 String info="Hello World!";
9 ds.send(new DatagramPacket(info.getBytes(),info.length(),InetAddress.getByName("115.173.172.98"),3000));
10 ds.close();
11 }
12 }
接收程序:
1 import java.net.DatagramPacket;
2 import java.net.DatagramSocket;
3
4 public class UdpRecv {
5 public static void main(String[] args) throws Exception {
6 DatagramSocket ds=new DatagramSocket(3000);
7 DatagramPacket dp=new DatagramPacket(new byte[1024],1024);
8 ds.receive(dp);
9 System.out.println(new String(dp.getData(),0,dp.getLength()));
10 System.out.println("from:"+dp.getAddress().getHostAddress()+":"+dp.getPort());
11 ds.close();
12 }
13 }
以上程序只能用来传送英文字符,如果要传送中文的话,需把发送程序中的info.length()改成info.getBytes().length,因为中文占两个字节。