网络通信,是 C/S 模式,需要编写 客户端和服务器端的代码, 服务器端需要指定端口号, 客户端需要指定 服务器的ip地址和端口号,这样才能保持连接通信, 网络通信,需要先开启服务端,才能启动客户端。
还需要了解一点, 客户端的输入,连接的是服务器端的输出, 客户端的输出,连接的是服务器端的输入。
一. UDP 通信所需要用到的类
一.一 DatagramSocket 类
这是服务器端的类, 需要指定接口。
一.一.一 构造方法
一.一.一.一 方法
一.一.一.二 演示
@Test public void conTest(){ try { //绑定的是本机 DatagramSocket datagramSocket=new DatagramSocket(9999); } catch (SocketException e) { e.printStackTrace(); } try { //绑定到指定的服务器 InetAddress inetAddress=InetAddress.getByName("localhost"); DatagramSocket datagramSocket=new DatagramSocket(9999,inetAddress); } catch (UnknownHostException e) { e.printStackTrace(); }catch (SocketException e) { e.printStackTrace(); } }
一.一.二 其他常用方法
发送时和接收数据时,发送和接收的是一个对象, DatagramPacket, 这个对象里面封装了真正的通信数据。
一.二 DatagramPacket
数据封装包。
一.二.一 构造方法
一.二.一.一 方法
一.二.一.二 演示
@Test public void packetConTest(){ //定义的是byte 字节 byte[] bytes=new byte[1024]; //第一种,从客户端接收数据 DatagramPacket datagramPacket=new DatagramPacket(bytes,0,1024); InetAddress inetAddress= null; try { inetAddress = InetAddress.getByName("localhost"); } catch (UnknownHostException e) { e.printStackTrace(); } //第二种,接收固定 主机 DatagramPacket datagramPacket1=new DatagramPacket(bytes,0,1024,inetAddress,6666); //第三种, 在客户端发送数据到服务器端 DatagramPacket datagramPacket2=new DatagramPacket(bytes,0,1024,new InetSocketAddress("localhost",6666)); }
一.二.二 其他方法
二. 演示各种 UDP 通信
二.一 单条字符串数据
二.一.一 客户端
@Test public void send1Test() throws Exception{ //1. 定义客户端 System.out.println("------------发送方开始发送单条数据--------------"); //客户端端口 DatagramSocket datagramSocket=new DatagramSocket(6666); //2. 准备数据 String content="你好啊,我是两个蝴蝶飞"; //3. 将数据转换成字节数据 byte[] bytes=content.getBytes("UTF-8"); //4. 封装进包 InetAddress inetAddress=InetAddress.getByName("localhost"); //服务器为 localhost,端口为 9999 DatagramPacket datagramPacket=new DatagramPacket(bytes,0,bytes.length,inetAddress,9999); //发送数据 datagramSocket.send(datagramPacket); //关闭流 datagramSocket.close(); }
二. 演示各种 UDP 通信
二.一 单条字符串数据
二.一.一 客户端
@Test public void send1Test() throws Exception{ //1. 定义客户端 System.out.println("------------发送方开始发送单条数据--------------"); //客户端端口 DatagramSocket datagramSocket=new DatagramSocket(6666); //2. 准备数据 String content="你好啊,我是两个蝴蝶飞"; //3. 将数据转换成字节数据 byte[] bytes=content.getBytes("UTF-8"); //4. 封装进包 InetAddress inetAddress=InetAddress.getByName("localhost"); //服务器为 localhost,端口为 9999 DatagramPacket datagramPacket=new DatagramPacket(bytes,0,bytes.length,inetAddress,9999); //发送数据 datagramSocket.send(datagramPacket); //关闭流 datagramSocket.close(); }
二.一.二 服务器端
@Test public void send1Test() throws Exception{ //1. 定义服务器 System.out.println("---------------服务器启动成功,接收单条数据----------------"); DatagramSocket datagramSocket=new DatagramSocket(9999); //2. 设置数据,封装到 bytes字节数据, 这个数组可能是不够用的。 byte[] bytes=new byte[1024]; //能接收的大小,并不是实际接收的大小 DatagramPacket datagramPacket=new DatagramPacket(bytes,0,bytes.length); //3. 阻塞式接收传递过来的数据 datagramSocket.receive(datagramPacket); //4. 获取接收的数据, 是真实的数据。 byte[] content=datagramPacket.getData(); int len=datagramPacket.getLength(); System.out.println("接收的长度是:"+len+",接收的内容是:"+new String(content,0,len)); //5 关闭流 datagramSocket.close(); }
二.一.三 运行程序
先打开服务器端,
一直在阻塞式接收客户端
再打开客户端
这个时候,再查看一下服务器端