Java UDP套接字 – 数据在服务器端遗留下来
我正在使用UDP套接字在
Java中实现一个非常基本的服务器 – 客户端模型,我遇到了一个非常奇怪的问题.
我想做的就是让用户(客户端)向服务器发送消息,然后服务器将打印它. 我有一个例子,但我遗漏了一些东西,因为我有以下问题: 如果客户端将消息“a”发送到服务器,则会正确接收该消息. 似乎服务器在收到新消息时会清理某种缓冲区. 这是我正在使用的代码: 服务器 import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPServer { public static void main(String args[]) throws Exception { byte[] receive_data = new byte[256]; int recv_port; DatagramSocket server_socket = new DatagramSocket(5000); System.out.println("Server - Initialized server. Waiting for client on port 5000"); while (true) { // System.out.println("Server - Listening for connections..."); DatagramPacket receive_packet = new DatagramPacket(receive_data,receive_data.length); server_socket.receive(receive_packet); String data = new String(receive_packet.getData()); InetAddress IPAddress = receive_packet.getAddress(); recv_port = receive_packet.getPort(); if (data.equals("q") || data.equals("Q")) { System.out.println("Server - Exiting !"); break; } else { System.out.println("Server - Client from IP " + IPAddress + " @ port " + recv_port + " said : " + data + " (length: " + receive_packet.getLength() + ")"); } } } } 客户 public class UDPClient { public static void main(String args[]) throws Exception { byte[] send_data = new byte[256]; BufferedReader infromuser = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket client_socket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName("localhost"); System.out.println("Client - Initialized the client..."); while (true) { System.out.print("Client - Type Something (q or Q to quit): "); String data = infromuser.readLine(); if (data.equals("q") || data.equals("Q")) { System.out.println("Client - Exited !"); DatagramPacket send_packet = new DatagramPacket(send_data,send_data.length,IPAddress,5000); System.out.println("Client - Sending data : <" + data + ">"); client_socket.send(send_packet); break; } else { send_data = data.getBytes(); DatagramPacket send_packet = new DatagramPacket(send_data,5000); System.out.println("Client - Sending data : <" + data + ">"); client_socket.send(send_packet); } } client_socket.close(); } } 我认为错误是微不足道的,但我在网络编程方面的技能是有限的,因此我不知道究竟是什么. 为了说清楚,我在不同终端上的同一台机器(mac)上运行服务器和客户端,以防它无论如何都会影响情况. 任何帮助将不胜感激. 编辑 ……我回来回答我自己的问题. String data = new String(receive_packet.getData()); 同 String data = new String(receive_packet.getData(),receive_packet.getLength()); 一切顺利. 仅供将来参考,以及可能遇到同样问题的人:) 解决方法
在第一次调用时,这就是receive_data的样子:
-------------- |"a"| | | -------------- 在你的第二个电话: -------------- |"b"|"b"| "b" | notice that the "a" in data_receive was overwritten -------------- 在第三次通话时,您只发一封信, -------------- |"c"|"b"| "b" | -------------- 发生这种情况是因为在发送到服务器的消息之间仍然存在receive_data数组中的数据,一种简单的方法就是初始化接收循环内部的新数组.这样,每次收到消息时,您都会有一个新阵列等着您. while (true) { byte[] receive_data = new byte[256]; ...... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |