如何在Java中连续接收数据包

如何在Java中连续接收数据包,java,udp,chat,packet,datagram,Java,Udp,Chat,Packet,Datagram,我已经编写了一个客户端和服务器,它们目前处于无止境的循环中,允许一次发送和接收一条消息。我需要它能够连续发送/接收消息,而不是一次只能发送一条消息 你知道我该怎么做吗 我对线程还不太熟悉,也不完全确定它们是如何工作的,但我在想也许是线程 客户: 服务器: 你说得对。您应该使用两个线程-一个用于发送,一个用于接收。当数据在接收后等待发送或处理时,您还需要两个缓冲区来存储数据。很可能,您需要FIFO缓冲区(一个简单的双面同步队列)。然后,主线程只能处理向队列读/写数据的操作,而发送/接收线程将在后台

我已经编写了一个客户端和服务器,它们目前处于无止境的循环中,允许一次发送和接收一条消息。我需要它能够连续发送/接收消息,而不是一次只能发送一条消息

你知道我该怎么做吗

我对线程还不太熟悉,也不完全确定它们是如何工作的,但我在想也许是线程

客户: 服务器:
你说得对。您应该使用两个线程-一个用于发送,一个用于接收。当数据在接收后等待发送或处理时,您还需要两个缓冲区来存储数据。很可能,您需要FIFO缓冲区(一个简单的双面同步队列)。然后,主线程只能处理向队列读/写数据的操作,而发送/接收线程将在后台处理其余的操作

  • 发送线程应尝试在循环中从发送队列中读取。队列上的读取操作应该阻塞(暂停线程),直到数据可用
  • 接收线程应该在循环中运行,以从网络读取数据报并将其存储到“已接收”队列中。从网络读取数据报将被阻塞,而存储到队列中将立即返回,除非队列已满
  • 当程序完成时,您必须以某种方式将线程从循环中“断开”。例如,您可以在主线程中将“shouldExit”布尔值设置为true,并在发送/接收线程中检查它。如果不介意,还可以将线程设置为守护程序模式,或者只调用System.exit()

适当调整队列大小。如果太小,消息将丢失和/或线程将被阻塞很多时间。如果太大,将浪费内存。例如,估计(或观察)队列中的平均和最大消息数,并添加安全裕度。

您是正确的。您应该使用两个线程-一个用于发送,一个用于接收。当数据在接收后等待发送或处理时,您还需要两个缓冲区来存储数据。很可能,您需要FIFO缓冲区(一个简单的双面同步队列)。然后,主线程只能处理向队列读/写数据的操作,而发送/接收线程将在后台处理其余的操作

  • 发送线程应尝试在循环中从发送队列中读取。队列上的读取操作应该阻塞(暂停线程),直到数据可用
  • 接收线程应该在循环中运行,以从网络读取数据报并将其存储到“已接收”队列中。从网络读取数据报将被阻塞,而存储到队列中将立即返回,除非队列已满
  • 当程序完成时,您必须以某种方式将线程从循环中“断开”。例如,您可以在主线程中将“shouldExit”布尔值设置为true,并在发送/接收线程中检查它。如果不介意,还可以将线程设置为守护程序模式,或者只调用System.exit()

适当调整队列大小。如果太小,消息将丢失和/或线程将被阻塞很多时间。如果太大,将浪费内存。例如,估计(或观察)队列中的平均和最大消息数,并添加安全裕度。

您已经做到了这一点。应在循环外部创建
DatagramSocket
。否则就很难说出你到底在问什么,你已经在做了。应在循环外部创建
DatagramSocket
。否则就很难说出你到底在问什么。非常感谢你,这个详细的回答绝对是我想要的答案!我不太熟悉线程,因为我在学校才真正开始在编程领域工作,所以我将不得不研究线程,以了解如何编写和实现线程,但我认为,一旦我理解了你的答案,我就有了一个很好的地方去理解一个概念!补充质询。可以声明
DatagramPacket incomingPacket=newdatagrampacket(buf,buf.length)在循环上方,以便重用相同的DatagramPacket对象,而不是在每次迭代中创建一个新对象?非常感谢,这一详细的响应肯定是我想要的答案!我不太熟悉线程,因为我在学校才真正开始在编程领域工作,所以我将不得不研究线程,以了解如何编写和实现线程,但我认为,一旦我理解了你的答案,我就有了一个很好的地方去理解一个概念!补充质询。可以声明
DatagramPacket incomingPacket=newdatagrampacket(buf,buf.length)以便重用相同的DatagramPacket对象,而不是在每次迭代中创建新对象?
import java.io.*;
import java.net.*;

public class ClientChat {

    DatagramSocket Socket;

    public ClientChat(){

    }

    public void createAndListenSocket() throws SocketException, IOException{

        while(true){
            Socket = new DatagramSocket();
            InetAddress IPAddress = InetAddress.getLocalHost();
            System.out.println("Type your message:");
            BufferedReader message = new BufferedReader(new InputStreamReader(System.in));
            byte[] incomingData = new byte[256];
            String sentence = message.readLine();//"Testing from client";
            byte[] data = sentence.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(data, data.length, IPAddress, 9876);
            Socket.send(sendPacket);
            System.out.println("Client: " + sentence);
            DatagramPacket incomingPacket = new DatagramPacket(incomingData, incomingData.length);
            Socket.receive(incomingPacket);
            String reply = new String(incomingPacket.getData());
            System.out.println("Server: " + reply);
            //Socket.close();

        }

    }

    public static void main(String[] args) throws IOException{
        ClientChat client = new ClientChat();
        client.createAndListenSocket();
    }
}
import java.io.*;
import java.net.*;

public class ServerClient {

    public void run() throws Exception{

        DatagramSocket Server = new DatagramSocket(9876);

        while(true){        
            byte[] buf = new byte[1024];   
            DatagramPacket incomingPacket = new DatagramPacket(buf, buf.length);
            Server.receive(incomingPacket);
            String message = new String(incomingPacket.getData());
            System.out.println("Client: " + message);
            System.out.print("Server: ");
            BufferedReader response = new BufferedReader(new InputStreamReader(System.in));
            String reply = response.readLine();
            InetAddress IPAddress = incomingPacket.getAddress();
            int port = incomingPacket.getPort();
            byte[] data = reply.getBytes();
            DatagramPacket replyPacket = new DatagramPacket(data, data.length, IPAddress, port);
            Server.send(replyPacket); 


        }
    }

    public static void main(String[] args) throws Exception {
        ServerClient Server = new ServerClient();
        Server.run();
    }        
}