加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java UDP套接字 – 数据在服务器端遗留下来

发布时间:2020-12-15 08:46:55 所属栏目:Java 来源:网络整理
导读:我正在使用UDP套接字在 Java中实现一个非常基本的服务器 – 客户端模型,我遇到了一个非常奇怪的问题. 我想做的就是让用户(客户端)向服务器发送消息,然后服务器将打印它. 我有一个例子,但我遗漏了一些东西,因为我有以下问题: 如果客户端将消息“a”发送到服
我正在使用UDP套接字在 Java中实现一个非常基本的服务器 – 客户端模型,我遇到了一个非常奇怪的问题.

我想做的就是让用户(客户端)向服务器发送消息,然后服务器将打印它.

我有一个例子,但我遗漏了一些东西,因为我有以下问题:

如果客户端将消息“a”发送到服务器,则会正确接收该消息.
如果客户端将消息“bbb”发送到服务器,则会正确接收该消息.
如果客户端将消息“c”发送到服务器,则服务器将打印“cbb”作为接收消息.

似乎服务器在收到新消息时会清理某种缓冲区.

这是我正在使用的代码:

服务器

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];
    ......
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读