使用UDP模拟客户端和服务端聊天,但是客户端发送一条消息之后就不能再连续发了,只能等服务端响应之后才能接着发送第二条,怎么解决这个问题啊?求大牛讲解?
下面是源码
服务端
public class Server {
public static void main(String[] args) throws IOException {
Scanner scanner=new Scanner(System.in);
//服务端(接收方)的端口
DatagramSocket ds=new DatagramSocket(8886);
System.out.println("服务端已经启动!");
while(true) {
//准备收数据
byte[] b=new byte[1024];
DatagramPacket dp=new DatagramPacket(b, b.length);
//开始收 收到的是字节数组
ds.receive(dp);
System.out.println(new String(dp.getData(),0,dp.getLength()));
System.out.println("对方IP地址:"+dp.getAddress()+" "+"端口:"+dp.getPort());
//发数据
//准备数据
String s=scanner.next();
byte[] buf=s.getBytes();
//打包
DatagramPacket dp2=new DatagramPacket(buf, buf.length,dp.getAddress(),dp.getPort());
ds.send(dp2);
if("bye".equals(s)) {
break;
}
}
ds.close();
}
}
客户端
public class Client {
public static void main(String[] args) throws SocketException, IOException {
Scanner scanner=new Scanner(System.in);
//发数据
DatagramSocket ds=new DatagramSocket(9999);//客户端的端口号是9999
System.out.println("客户端已经启动,开始聊天吧?!");
while(true) {
String s=scanner.next();
byte[] buf=s.getBytes();
DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"),8886);
ds.send(dp);
byte[] buf2=new byte[1024];
DatagramPacket dp2=new DatagramPacket(buf2, buf2.length);
ds.receive(dp2);
System.out.println("对方IP地址:"+dp2.getAddress()+" "+"端口:"+dp2.getPort());
String str=new String(dp2.getData(),0,dp2.getLength());
System.out.println(str);
if("bye".equals(str)) {
break;
}
}
ds.close();
}
}
那是因为你的代码中发送完成后是在当前流程中继续读取响应内容的,如果想继续发送而不受接收的影响可以另起一个线程去收消息:
而且这里你的结束条件是接收到 bye 后停止循环的。调整代码如下:
public class Client {
private static DatagramSocket ds = null;
//通信标识
private static volatile boolean isBye = false;
public static void main(String[] args) throws SocketException, IOException {
Scanner scanner=new Scanner(System.in);
//发数据
ds=new DatagramSocket(9999);//客户端的端口号是9999
startReceiveThread();
System.out.println("客户端已经启动,开始聊天吧?!");
while(!isBye) {
String s=scanner.next();
byte[] buf=s.getBytes();
DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"),8886);
ds.send(dp);
}
ds.close();
scanner.close();
}
public static void startReceiveThread() {
Runnable receiveTask = ()->{
while(true) {
byte[] buf2=new byte[1024];
DatagramPacket dp2=new DatagramPacket(buf2, buf2.length);
try {
ds.receive(dp2);
System.out.println("对方IP地址:"+dp2.getAddress()+" "+"端口:"+dp2.getPort());
String str=new String(dp2.getData(),0,dp2.getLength());
System.out.println("Received info:"+str);
if("bye".equals(str)) {
isBye = true;
break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
new Thread(receiveTask).start();
}
}