3、Socket(UDP传输) **Socket就是为网络服务提供的一种机制。 **通信的两端都有Socket。 **网络通信其实就是Socket间的通信。 **数据在两个Socket间通过IO传输。 **玩Socket主要就是记住流程,代码查文档就行 (1)UDP传输:DatagramSocket与DatagramPacket **发送端: 建立DatagramSocket服务; 提供数据,并将数据封装到字节数组中; 创建DatagramPacket数据包,并把数据封装到包中,同时指定IP和接收端口 通过Socket服务,利用send方法将数据包发送出去; 关闭DatagramSocket和DatagramPacket服务。 **接收端: 建立DatagramSocket服务,并监听一个端口; 定义一个字节数组和一个数据包,同时将数组封装进数据包; 通过DatagramPacket的receive方法,将接收的数据存入定义好的数据包; 通过DatagramPacke关闭t的方法,获取发送数据包中的信息; 关闭DatagramSocket和DatagramPacket服务。 DatagramSocket与DatagramPacket方法摘要: *****DatagramSocket 构造方法: DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。 DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。 DatagramSocket(int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。 方法摘要: void close() 关闭此数据报套接字。 InetAddress getInetAddress() 返回此套接字连接的地址。 InetAddress getLocalAddress() 获取套接字绑定的本地地址。 int getPort() 返回此套接字的端口。 void receive(DatagramPacket p) 从此套接字接收数据报包。 void send(DatagramPacket p) 从此套接字发送数据报包。 ****DatagramPacket 构造方法: DatagramPacket(byte[] buf, int length) 构造 DatagramPacket,用来接收长度为 length 的数据包。 DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 InetAddress getAddress() 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。 byte[] getData() 返回数据缓冲区。 int getLength() 返回将要发送或接收到的数据的长度。 int getPort() 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。 代码示例: ****发送端: class UDPSend { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(); byte[] buf = "这是UDP发送端".getBytes(); DatagramPacket dp = new DatagramPacket( buf,buf.length,InetAddress.getByName("192.168.1.253"),10000); ds.send(dp); ds.close(); } } ****接收端 class UDPRece { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(10000); byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); ds.receive(dp);//将发送端发送的数据包接收到接收端的数据包中 String ip = dp.getAddress().getHosyAddress();//获取发送端的ip String data = new String(dp.getData(),0,dp.getLength());//获取数据 int port = dp.getPort();//获取发送端的端口号 sop(ip+":"+data+":"+port); ds.close(); } } 需求1:UDP键盘录入数据,并发送给接收端 发送端: class UDPSend { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(); BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); String line = null; while((line = bufr.readLine())!=null) { if("886".equals(line)) break; byte[] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket( buf,buf.length,InetAddress.getByName("192.168.1.253"),10000); ds.send(dp); } ds.close(); } } 接收端: class UDPRece { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(10000); while(true) { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); ds.receive(dp);//将发送端发送的数据包接收到接收端的数据包中 String ip = dp.getAddress().getHosyAddress();//获取发送端的ip String data = new String(dp.getData(),0,dp.getLength());//获取数据 int port = dp.getPort();//获取发送端的端口号 sop(ip+":"+data+":"+port); ds.close(); } } } |