Java 客户端-服务器应用程序管道无法在子线程上工作

标签 java

我有一个客户端和一个服务器。客户端在特定端口上绑定(bind)一个套接字,服务器向客户端发回一个新端口,客户端应在新端口号上绑定(bind)一个新套接字。

从主服务器线程中,我启动一个线程,一旦服务器准备好并正在监听新端口,该线程就会向客户端发送消息,以便客户端可以尝试连接到新端口。子线程的管道未将消息发送到客户端。 所以客户端和服务器都卡住了,这似乎是一个僵局,但我不确定。这行代码在客户端:System.out.println("FROM SERVER: "+ inMsg_rport);没有执行。

服务器代码:

class server
            {
                public static void main(String argv[]) throws Exception
                {
                    String newPort;
                    ServerSocket serverSocket = null;
                    Socket clientSocket = null;
                    try
                    {
                        serverSocket = new ServerSocket(5555);
                        clientSocket = serverSocket.accept();

                        DataOutputStream serverOut =
                        new DataOutputStream(clientSocket.getOutputStream());
                        int r_port = 5556;
                        Thread appThread = new Thread(new serverApp(serverOut, r_port));
                        appThread.start();
                    }
                    catch(IOException e)
                    {
                        System.out.println(e);
                    }
                }

                static class serverApp implements Runnable
                {
                    DataOutputStream serverOut;
                    int nPort;
                    public serverApp(DataOutputStream servO, int r_port)
                    {
                        this.serverOut = servO;
                        this.nPort = r_port;
                    }
                    @Override
                    public void run()
                    {
                        ServerSocket serverSocket = null;
                        Socket clientSocket = null;

                        try
                        {
                            serverSocket = new ServerSocket(nPort);
                            serverOut.writeBytes(sr_port);
                            clientSocket = serverSocket.accept();
                        }
                        catch(IOException e)
                        {
                            System.out.println(e);
                        }
                    }
                }
            }

客户端代码:

            class client {
                public static void main(String argv[]) throws Exception
                {
                    String serverIp = argv[0]; 
                    String msg = argv[2];
                    int port = Integer.parseInt(argv[1]);

                    Socket clientSocket = new Socket(InetAddress.getByName(serverIp), port);

                    BufferedReader clientIn =
                    new BufferedReader(new
                    InputStreamReader(clientSocket.getInputStream()));

                    String inMsg_rport = clientIn.readLine();
                    System.out.println("FROM SERVER: " + inMsg_rport);
                    int r_port = Integer.parseInt(inMsg_rport);
                    clientSocket.close();
                    System.out.println("Closed connection");

                   Socket new_clientSocket = new Socket(InetAddress.getByName(serverIp), r_port);

                }
            }

最佳答案

客户端中的

readLine() 是一个阻塞调用,等待行尾字符

http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#readLine ()

您没有发送行尾字符。您在服务器中使用 DataOutputStream 并发送原始字节。

不要在服务器中使用DataOutputStream;我认为这并不是您真正想要的。只需将端口号作为带有行尾字符的文本发送即可。

关于Java 客户端-服务器应用程序管道无法在子线程上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12904336/

相关文章:

java - 如何配置用于 Jersey REST 调用的最大并发线程数?

java - 在tomcat服务器中运行war文件时出错

java - 我如何将绘图线放入 JInternalFrame 内部

java - 使用 Sejda 合并 PDF 失败并显示流输出

java - 获取和使用应用程序传递的 InputStream

Java SocketServer 正在接受来自 Socket 客户端的输入,但 Socket 客户端未接收来自 SocketServer 的输入

java - 使用 Map 值更新 mongodb,该值包含 JAVA 中 '$' 的键

java - JAutodoc - 添加方法参数的数据类型

java - 如何访问 ANTLR 词法分析器 token

java - 使用 GSON 和 RETROFIT 反序列化复杂的 JSON 对象