【问题标题】:I Have a UDP Server and Client , now how to let them continuously send/recieve?我有一个 UDP 服务器和客户端,现在如何让它们连续发送/接收?
【发布时间】:2018-03-27 09:05:45
【问题描述】:

正如简短的标题所说,我有一个 UDP 服务器和客户端。服务器目前有 3 种方法,一种是打开套接字并接收数据包。 next 读取数据包并打印信息。最后根据用户输入创建一个响应包。

我将在此处包含我的服务器代码,因为我认为如果我可以在使服务器能够发送和接收方面获得帮助,我也可以将我的新知识转换到客户端!

import java.net.*;
import java.io.*;

public class ServerChat {

DatagramSocket Server = null;
byte[] buf = new byte[1024];     
DatagramPacket incomingPacket = new DatagramPacket(buf, buf.length);


//Opens the socket to receive the packet
public void createAndListen() throws SocketException, IOException{
    Server = new DatagramSocket(9876);     
    Server.receive(incomingPacket);
}

//Simply converts the packet to a string and then prints the message

public void read(){
    String message = new String(incomingPacket.getData());
    System.out.println("Client: " + message);
}


//This methhod will allow the user to print a message to be sent back to the client

public void send() throws IOException{
    System.out.print("Server: ");

    //Receiving input

    BufferedReader response = new BufferedReader(new InputStreamReader(System.in));
    String reply = response.readLine();

    //Getting recipent information

    InetAddress IPAddress = incomingPacket.getAddress();
    int port = incomingPacket.getPort();
    byte[] data = reply.getBytes();

    //Crafting and sending the packet

    DatagramPacket replyPacket = new DatagramPacket(data, data.length, IPAddress, port);
    Server.send(replyPacket);  

}




public static void main(String[] args) throws IOException {
    ServerChat Server = new ServerChat();
    Server.createAndListen();
    Server.read();
    Server.send();


}

感谢您的帮助! 快速编辑,因为重读似乎不清楚;服务器确实启动并监听,然后接收到客户端发送的数据包,并可以响应。在一次发送和接收之后,客户端和服务器都关闭了,这就是我试图阻止的,我希望它们保持打开状态以再次通信。我知道 UDP 不是连续连接,所以我认为我更需要服务器能够持续接收和发送数据包。

编辑 2:我重新编写了我的客户端以在端口上进行连续循环监听,它一次只能处理一条消息。现在我只需要它连续发送/接收!不过,当我从多种不同的方法更改为带有 while 循环的一种方法时,将对此发表不同的帖子。

【问题讨论】:

  • 您需要发布您当前的代码。如果您在循环中接收并在循环中发送,则您必须获得连续的吞吐量。很明显你没有正确地做到这一点。

标签: java server udp client chat


【解决方案1】:

首先,您必须: - 将 createAndListen() 拆分为两个方法:套接字必须只初始化一次,并且必须在 receive() 上循环。 - 然后重新编写你的代码和方法。

main 
    init socket     // only once
    while(some-condition)     // receive loop
        receive()   // this is a blocking method
        reply()     // and send()
    close socket
end

之后会有一些重大改进添加到您的代码中,以使其更加高效和健壮。查看 Google 以获取有关 Java Socket 编程和良好实践的优秀材料。

【讨论】:

  • 我实际上对我的服务器端进行了重新编程,以完全按照您所说的去做,我在循环外初始化套接字,然后进行循环接收和发送。它将它限制为一次只接收一条消息并回复一条消息,您对我如何能够连续发送和接收有任何想法吗?
  • 只要接收方能够以发送方发送的速率处理传入消息,您就应该能够以适当的速率接收数据包。对于您的测试,设置您的“客户端”以适当的速率发送(放置一些 sleep() 或坚持请求-回复以进行同步),当然当您处理传入时不要询问用户输入(这会阻止您的程序!)消息。下一步通常是将缓慢或阻塞执行的消息处理和派生动作包装到线程中。例如。将繁重的逻辑“提交”到执行器服务的线程池。
  • 此外,为了获得更高的性能,您还必须考虑非阻塞 IO (NIO) 和 Netty 等框架。但我认为这还为时过早。我建议您尝试自己了解更多,因为这些主题可以成为整个课程或书籍的主题。首先关注 Blocking-IOs(经典的方式,通常对于简单的用例来说足够了)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 2021-12-04
  • 2012-03-27
  • 2020-10-10
  • 1970-01-01
相关资源
最近更新 更多