如何在Java中使用UDP与多个客户端

时间:2012-10-24 02:34:47

标签: java udp datagram

我有以下情况。

我有一个Server类。 我有一个Client类。 我有一个MultiServerThread类。

当客户端连接到服务器时,服务器会创建一个新的MultiServerThread,它正在处理来自客户端的输入。这样我可以拥有多个客户端。到现在为止还挺好。 连接通过TCP进行。

一个简短的例子:

服务器类:

...
public static void main(String[] args) throws IOException {     
    ServerSocket serverSocket = null;
    boolean listening = true;


    try {
        serverSocket = new ServerSocket(9999);
    } catch (IOException e) {
      System.err.println("Could not listen on port: " +  serverSocket.getLocalPort() + ".");
        System.exit(-1);
    }

    while (listening) {
        new MultiServerThread(serverSocket.accept()).start();
    }
    serverSocket.close();
}
...

客户类:

...
public static void main(String[] args) throws IOException {

    socket = new Socket(hostname, port);
    out = new PrintWriter(socket.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    stdIn = new BufferedReader(new InputStreamReader(System.in));
    String fromServer;
    String fromUser;

    while ((fromServer = in.readLine()) != null) {
        System.out.println("Server: " + fromServer);
        if (fromServer.equals("Bye.")) {
            break;
        }

        fromUser = stdIn.readLine();
        if (fromUser != null) {
            System.out.println("Client: " + fromUser);
            out.println(fromUser);
        }
    }

    out.close();
    in.close();
    stdIn.close();
    socket.close();
}
...

MultiServerThread类:

...
public MultiServerThread(Socket socket) throws SocketException {
    super("MultiServerThread");
    this.socket = socket;
    //   dSocket = new DatagramSocket(4445);
}

public void run() {
    try {
        PrintWriter myOutput = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader myInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        myOutput.println("Connected to client and ready to accept commands.");

        while ((clientInput = myInput.readLine()) != null) {

            //A SIMPLE LOGIN A USER
            if (clientInput.contains("!login")) {

            //save some string given by client into loggedUser
            String loggedUser = clientInput.substring(7);

            }

        myOutput.close();
        myInput.close();
        socket.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

我需要的是:

我需要实现来自服务器的通知,例如用户名是“Bob”。如果用户名是“Bob”,则服务器应该向客户端发出通知“Bob再次来到这里!”。在我的项目/作业中,这应该用Java中的数据报来完成。

因此,如果clientinput是“!login bob”,那么应该将带有消息的数据报包(“Bob再次来到这里!”)发送给客户端。

问题:我应该在何处放入数据报请求的代码?我可以将数据报包请求放入MultiServerThread或客户端吗?

在MultiServerThread中会更容易,因为它已经处理了!login。 在这里:

     if (clientInput.contains("!login")) {
            //save some string given by client into loggedUser
            String loggedUser = clientInput.substring(7);

            //send datagram request to Server???

            }

但这违背了网络原则?

2 个答案:

答案 0 :(得分:0)

您需要通过初始TCP连接将UDP端口号发送到您的客户端。然后,您开始在该端口号上侦听客户端上的UDP数据报。来自服务器的所有其他通信 - >客户端将在这个udp套接字上。这就是你的作业建议

答案 1 :(得分:0)

我得到了它的工作; - )

我在线程和客户端类中定义了一个udp端口... 客户端类获得了带有参数的端口......它将udp端口提供给线程...所以两者都有udp端口;)