Java TCP 服务器无法接收来自多个客户端的消息

德赫鲁博

我要最简单的解释。我的 Java TCP 项目有一个服务器和三个客户端。

服务器有一个 ClientThread。每个客户端都有一个 ServerThread 和一个 UserThread。

工作流程是:
1. 客户端(例如,client_0)的 UserThread 获取用户输入,然后向服务器发送消息。
2. 服务器的 ClientThread 捕获来自 client_0 的消息,并将另一条消息发送到不同客户端(例如,client_1)的 ServerThread。
3、client_1的ServerThread再发回一条消息给运行在服务器端的ClientThread;

第 3 步的消息未到达服务器。

总共有 3 个客户端,比如 client_0、client_1 和 client_2。
最初的想法是,如果 client_0 请求服务器,则服务器与 client_1 和 client_2 通信。这就是if(i==cid) continue;服务器中 for 循环中的行的原因但是,如果我注释掉这一行,服务器将与 client_0 通信(这在语义上是不必要的)并且不会发生消息传递问题。之后服务器与client_1通信,问题再次出现。

服务器可以接收来自客户端(client_0)的 ServerThread 的消息,该客户端从其 UserThread 发送原始请求(msgToServer.println("get list");)以启动整个过程。但是 Server 无法从任何其他客户端的 ServerThread 获取消息,即使它可以向其他客户端发送消息并且所有客户端程序都是相同的,并且所有 ServerThreads 和 UserThreads 应该以相同的方式工作。怎么可能?

服务器:

package serverftp;
import java.io.*;
import java.net.*;

public class ServerFTP {

    static String[] id = {"cp 1","cp 2","cp 3"};
    static String[] pass = {"123","456","789"};

    static BufferedReader[] msgFromClient = new BufferedReader[3];
    static PrintWriter[] msgToClient = new PrintWriter[3];
    static InputStream[] fileFromClient = new InputStream[3];
    static OutputStream[] fileToClient = new OutputStream[3];

    public static void main(String[] args) throws Exception {
        ServerSocket welcome = new ServerSocket(6789);

        // connecting the three clients
        for(int i=0; i<3; i++) {
            System.out.println("Waiting for Client "+i);
            Socket clientSocket;
            clientSocket = welcome.accept();

            while(true) {
                System.out.println("Connecting Client "+i);

                BufferedReader fromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                PrintWriter toClient = new PrintWriter(clientSocket.getOutputStream(),true);

                // get id pass from client
                String clientId = fromClient.readLine();
                System.out.println(clientId);
                String clientPass = fromClient.readLine();
                System.out.println(clientPass);

                // check id pass and feedback
                if(clientId.equals(id[i]) && clientPass.equals(pass[i])) {
                    toClient.println("ok");

                    msgFromClient[i] = fromClient;
                    msgToClient[i] = toClient;
                    fileFromClient[i] = clientSocket.getInputStream();
                    fileToClient[i] = clientSocket.getOutputStream();

                    break;
                } else {
                    toClient.println("error");
                }
            }

            ClientThread ct = new ClientThread(i);
            ct.start();
            System.out.println("Client "+i+" connected!");
        }

        welcome.close();
    }

}

class ClientThread extends Thread {
    int cid;
    String msg;

    public ClientThread(int client_id) {
        cid = client_id;

        try {
            // telling client it's serial
            ServerFTP.msgToClient[cid].println(Integer.toString(cid));
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public void run() {
        while(true) {
            try {
                // get request from receiver
                msg = ServerFTP.msgFromClient[cid].readLine();
                if(msg.equals("get list")) {
                    System.out.println(cid+" "+msg);

                    msg = ServerFTP.msgFromClient[cid].readLine();
                    System.out.println(cid+" "+msg);

                    for(int i=0; i<3; i++) {
                        if(i==cid) continue;

                        // send sender request for file list
                        ServerFTP.msgToClient[i].println("give list");
                        System.out.println("request sent to client "+i);

                        // get file count from sender
                        msg = ServerFTP.msgFromClient[i].readLine();
                        System.out.println("file count caught!!!"); // THIS LINE NEVER EXECUTES
                        System.out.println("File count "+msg);
                    }
                }
            } catch(Exception ex) {
                ex.printStackTrace();
            }
        }
    }
}


该线路System.out.println("file count caught!!!");永远不会被调用。

客户:

package clientftp_1;
import java.io.*;
import java.net.*;

public class ClientFTP_1 {

    static String[] allPaths = {   "...path...\\client_1_folder",
                            "...path...\\client_2_folder",
                            "...path...\\client_3_folder"};

    public static void main(String[] args) throws Exception {
        InetAddress inetAddress = InetAddress.getLocalHost();
        Socket server = new Socket(inetAddress,6789);
        int myId;

        // login phase
        BufferedReader fromUser = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader fromServer = new BufferedReader(new InputStreamReader(server.getInputStream()));
        PrintWriter toServer = new PrintWriter(server.getOutputStream(),true);
        InputStream getFile = server.getInputStream();
        OutputStream sendFile = server.getOutputStream();
        while(true) {
            System.out.println("id: ");
            String msg = fromUser.readLine();
            toServer.println(msg);            

            System.out.println("password: ");
            msg = fromUser.readLine();
            toServer.println(msg);

            msg = fromServer.readLine();
            if(msg.equals("ok")) {
                System.out.println("Connection Successful!");
                myId = Integer.parseInt(fromServer.readLine());
                System.out.println("Client serial is: "+myId);
                System.out.println("Folder path is: "+allPaths[myId]);
                break;
            } else {
                System.out.println("Error! Try again please.");
            }
        }

        ServerThread st = new ServerThread(allPaths[myId],fromUser,fromServer,toServer,getFile,sendFile);
        st.start();
        UserThread ut = new UserThread(allPaths[myId],fromUser,fromServer,toServer,getFile,sendFile);
        ut.start();
    }
}

class ServerThread extends Thread {
    String folderPath;
    String msg;
    BufferedReader msgFromServer,msgFromUser;
    PrintWriter msgToServer;
    InputStream fileFromServer;
    OutputStream fileToServer;
    public ServerThread(String path,BufferedReader fromUser,BufferedReader fromServer,PrintWriter toServer,InputStream getFile,OutputStream sendFile) throws Exception {
        folderPath = path;
        msgFromUser = fromUser;
        msgFromServer = fromServer;
        msgToServer = toServer;
        fileFromServer = getFile;
        fileToServer = sendFile;
    }

    @Override
    public void run() {
        System.out.println("Server Thread Started");
        while(true) {
            try {
                // receive request
                msg = msgFromServer.readLine();
                System.out.println("request received from server");
                if(msg.equals("give list")) {
                    // get filenames
                    File folder = new File(folderPath);
                    File[] fileList = folder.listFiles();
                    int cnt = fileList.length;
                    System.out.println("count calculated");

                    // sned file count to server
                    msgToServer.println(Integer.toString(cnt));
                    System.out.println("count sent to server"); // THIS LINE PRINTS
                }
            } catch(Exception ex) {
                ex.printStackTrace();
            }
        }
    }
}

class UserThread extends Thread {
    String folderPath;
    String msg;
    BufferedReader msgFromServer,msgFromUser;
    PrintWriter msgToServer;
    InputStream fileFromServer;
    OutputStream fileToServer;
    public UserThread(String path,BufferedReader fromUser,BufferedReader fromServer,PrintWriter toServer,InputStream getFile,OutputStream sendFile) throws Exception {
        folderPath = path;
        msgFromUser = fromUser;
        msgFromServer = fromServer;
        msgToServer = toServer;
        fileFromServer = getFile;
        fileToServer = sendFile;
    }

    @Override
    public void run() {
        System.out.println("USer Thread Started");
        while(true) {
            try {
                // input from user
                msg = msgFromUser.readLine();
                if(msg.equals("get list")) {
                    // send request to server
                    msgToServer.println("get list");
                    msgToServer.println("fahim list");
                }
            } catch(Exception ex) {
                ex.printStackTrace();
            }
        }
    }
}

该行System.out.println("count sent to server");已打印。这意味着之前的消息发送行已经执行没有问题。

我知道服务器中的登录系统很愚蠢。但是对于这项工作来说“还可以”。上面解释的一切都发生在所有客户端都连接并登录到服务器之后。

德赫鲁博

我想我已经找到了问题所在。我对客户端程序的 ServerThread 和 UserThread 使用了相同的套接字。因此,当 ServerThread 尝试响应服务器时,消息很可能会通过同一套接字发送到服务器中正在侦听消息的另一个不同线程(认为消息来自 UserThread)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TCP 服务器未收到来自 TCP 客户端的消息 (Java)

来自分类Dev

TCP 客户端(java)没有收到来自 TCP 服务器的消息(C#)

来自分类Dev

直到客户端断开连接,Java TCP服务器才接收数据包

来自分类Dev

Python(服务器)从 Java(客户端)在单独的行中接收数据..(TCP)

来自分类Dev

TCP服务器和客户端Java

来自分类Dev

TCP服务器和客户端Java

来自分类Dev

Java TCP 客户端/服务器套接字

来自分类Dev

Erlang服务器,Java客户端-TCP消息被拆分了吗?

来自分类Dev

朱莉娅中的TCP客户端和Java中的TCP服务器

来自分类Dev

Java服务器-多客户端TCP连接I / O

来自分类Dev

为什么此Java TCP客户端/服务器不起作用?

来自分类Dev

TCP Java服务器,Python客户端字符串不相等

来自分类Dev

Java中的TCP客户端和C中的服务器

来自分类Dev

从Java游戏服务器到客户端的TCP和UDP连接

来自分类Dev

TCP 服务器以数据包结构发送文件(到非 Java 客户端)

来自分类Dev

TCP 客户端不接收返回服务器的消息

来自分类Dev

使用Java从服务器发送文件后,TCP无法接收文本消息

来自分类Dev

在 TCP Client 中接收来自服务器的消息并在 TextView 中设置

来自分类Dev

无法在TCP客户端服务器中接收完整文件

来自分类Dev

Java(客户端)和C#(服务器)TCP套接字。和服务器从客户端读取无限的最后数据

来自分类Dev

如何让 TCP 服务器处理多个客户端?

来自分类Dev

Java套接字:检查客户端是否能够从服务器接收消息

来自分类Dev

Java-客户端从服务器接收空白消息,但仅通过网络

来自分类Dev

Java套接字:检查客户端是否能够从服务器接收消息

来自分类Dev

简单的 Rust TCP 服务器和客户端不接收消息并且永远不会终止

来自分类Dev

从Java Server到Android客户端:无法接收TCP数据包

来自分类Dev

让TCP客户端搜索TCP服务器

来自分类Dev

让TCP客户端搜索TCP服务器

来自分类Dev

使 raspberryPi 接收来自 tcp 客户端和 gpio 引脚的请求

Related 相关文章

  1. 1

    TCP 服务器未收到来自 TCP 客户端的消息 (Java)

  2. 2

    TCP 客户端(java)没有收到来自 TCP 服务器的消息(C#)

  3. 3

    直到客户端断开连接,Java TCP服务器才接收数据包

  4. 4

    Python(服务器)从 Java(客户端)在单独的行中接收数据..(TCP)

  5. 5

    TCP服务器和客户端Java

  6. 6

    TCP服务器和客户端Java

  7. 7

    Java TCP 客户端/服务器套接字

  8. 8

    Erlang服务器,Java客户端-TCP消息被拆分了吗?

  9. 9

    朱莉娅中的TCP客户端和Java中的TCP服务器

  10. 10

    Java服务器-多客户端TCP连接I / O

  11. 11

    为什么此Java TCP客户端/服务器不起作用?

  12. 12

    TCP Java服务器,Python客户端字符串不相等

  13. 13

    Java中的TCP客户端和C中的服务器

  14. 14

    从Java游戏服务器到客户端的TCP和UDP连接

  15. 15

    TCP 服务器以数据包结构发送文件(到非 Java 客户端)

  16. 16

    TCP 客户端不接收返回服务器的消息

  17. 17

    使用Java从服务器发送文件后,TCP无法接收文本消息

  18. 18

    在 TCP Client 中接收来自服务器的消息并在 TextView 中设置

  19. 19

    无法在TCP客户端服务器中接收完整文件

  20. 20

    Java(客户端)和C#(服务器)TCP套接字。和服务器从客户端读取无限的最后数据

  21. 21

    如何让 TCP 服务器处理多个客户端?

  22. 22

    Java套接字:检查客户端是否能够从服务器接收消息

  23. 23

    Java-客户端从服务器接收空白消息,但仅通过网络

  24. 24

    Java套接字:检查客户端是否能够从服务器接收消息

  25. 25

    简单的 Rust TCP 服务器和客户端不接收消息并且永远不会终止

  26. 26

    从Java Server到Android客户端:无法接收TCP数据包

  27. 27

    让TCP客户端搜索TCP服务器

  28. 28

    让TCP客户端搜索TCP服务器

  29. 29

    使 raspberryPi 接收来自 tcp 客户端和 gpio 引脚的请求

热门标签

归档