1

我有以下情况。

我有一个服务器类。我有一个客户课程。我有一个 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 中的数据报来完成。

因此,如果客户端输入是“!login bob”,则应将带有消息(“Bob 又来了!”)的数据报包发送到客户端。

问题:我应该把数据报请求的代码放在哪里?我可以将数据报包请求放入 MultiServerThread 或 Client 中吗?

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

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

            //send datagram request to Server???

            }

但这有悖于联网原则吗?

4

2 回答 2

0

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

于 2012-10-26T23:35:42.433 回答
0

我让它工作了;-)

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

于 2012-11-04T01:08:30.417 回答