3.1 需求描述
需求:在线咨询功能,客户和客服在线交流
分析:1、基于UDP
协议的Socket
网络编程
2、不需要利用IO流实现数据传输
3、每个数据发送单元被统一封装成数据包的方式,发送方将数据包发送到网络中,数据包在网络中去寻找它的目的地。
UDP
基本概念:
DatagramSocket
:用于发送或接收数据包DatagramPacket
:数据包
3.2 一次单向通信
//服务器端编码
public class AskServer {
public static void main(String[] args) throws IOException {
//1.创建DatagramSocket,指定接收数据的端口
DatagramSocket socket = new DatagramSocket(8088);
//2.接收数据包
byte[] buf = new byte[1024]; //接收数据包的大小
int length = buf.length;
DatagramPacket packet = new DatagramPacket(buf,length);
socket.receive(packet);
System.out.println(packet.getAddress());
System.out.println(packet.getPort());
String msg = new String(packet.getData(),"utf-8");
System.out.println("客户端发送的数据:" + msg);
//3.关闭资源
socket.close();
}
}
//客户端编码
public class AskClient {
public static void main(String[] args) throws IOException {
//1.创建DatagramSocket,可以指明接收数据的端口,不指明会自动分配
DatagramSocket socket = new DatagramSocket(9000);
//2.发送数据包
String message = "亲,在吗?";
byte[] buf = message.getBytes();
int length = buf.length;
InetAddress ip = InetAddress.getByName("127.0.0.1");
DatagramPacket packet = new DatagramPacket(buf,length,ip,8088);
socket.send(packet);
//3.关闭资源
socket.close();
}
}
3.3 一次双向通信
//服务器端编码实现
public class AskServer {
public static void main(String[] args) throws IOException {
//1.创建DatagramSocket,指定接收数据的端口
DatagramSocket socket = new DatagramSocket(8088);
//2.接收数据包
byte[] buf = new byte[1024]; //接收数据包的大小
int length = buf.length;
DatagramPacket packet = new DatagramPacket(buf,length);
socket.receive(packet);
String msg = new String(packet.getData(),"utf-8");
System.out.println("客户端发送的数据:" + msg);
//发送数据给客户端
String s = "在的,亲!";
packet.setData(s.getBytes());
packet.setLength(s.getBytes().length);
packet.setAddress(packet.getAddress());
packet.setPort(packet.getPort());
socket.send(packet);
//3.关闭资源
socket.close();
}
}
//客户端编码实现
public class AskClient {
public static void main(String[] args) throws IOException {
//1.创建DatagramSocket,可以指明接收数据的端口,不指明会自动分配
DatagramSocket socket = new DatagramSocket(9000);
//2.发送数据包
String message = "亲,在吗?";
byte[] buf = message.getBytes();
int length = buf.length;
InetAddress ip = InetAddress.getByName("127.0.0.1");
DatagramPacket packet = new DatagramPacket(buf,length,ip,8088);
socket.send(packet);
//接收服务器消息
byte[] bufS = new byte[1024]; //接收数据包的大小
int len = buf.length;
DatagramPacket packetS = new DatagramPacket(bufS,len);
socket.receive(packetS);
String msg = new String(packetS.getData(),"utf-8");
System.out.println("服务器发送的数据:" + msg);
//3.关闭资源
socket.close();
}
}
3.3 多次双向通信
//服务器端编码
public class AskServer {
public static void main(String[] args) throws IOException {
//1.创建DatagramSocket,指定接收数据的端口
DatagramSocket socket = new DatagramSocket(8088);
Scanner input = new Scanner(System.in);
//2.接收数据包
while (true){
byte[] buf = new byte[1024]; //接收数据包的大小
int length = buf.length;
DatagramPacket packet = new DatagramPacket(buf,length);
socket.receive(packet);
String msg = new String(packet.getData(),0,packet.getLength());
System.out.println("客户端发送的数据:" + msg);
if("bye".equals(msg)){
break; //客户端结束交流,关闭服务器
}
//发送数据给客户端
String s = input.nextLine();
System.out.println(s);
packet.setData(s.getBytes());
packet.setLength(s.getBytes().length);
packet.setAddress(packet.getAddress());
packet.setPort(packet.getPort());
socket.send(packet);
}
//3.关闭资源
socket.close();
}
}
//客户端编码
public class AskClient {
public static void main(String[] args) throws IOException {
//1.创建DatagramSocket,可以指明接收数据的端口,不指明会自动分配
DatagramSocket socket = new DatagramSocket(9000);
//2.发送数据包
Scanner input = new Scanner(System.in);
while (true){
String message = input.nextLine();
System.out.println(message);
byte[] buf = message.getBytes();
int length = buf.length;
InetAddress ip = InetAddress.getByName("127.0.0.1");
DatagramPacket packet = new DatagramPacket(buf,length,ip,8088);
socket.send(packet);
if("bye".equals(message)){
break; //客户端关闭交流
}
//接收服务器消息
byte[] bufS = new byte[1024]; //接收数据包的大小
int len = buf.length;
DatagramPacket packetS = new DatagramPacket(bufS,len);
socket.receive(packetS);
String msg = new String(packetS.getData(),"utf-8");
System.out.println("服务器发送的数据:" + msg);
}
//3.关闭资源
socket.close();
}
}