首页 文章

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

提问于
浏览
0

我有一个客户端和一个服务器 . 客户端绑定特定端口上的套接字,服务器将新端口发送回客户端,客户端应绑定新端口号上的新套接字 .

从主服务器线程开始,我启动一个线程,在服务器准备就绪并且正在侦听新端口时向客户端发送消息,以便客户端可以尝试连接到新端口 . 来自子线程的管道不会将消息发送到客户端 . 所以客户端和服务器都冻结了,这似乎是一个僵局,但我不确定 . 客户端中的这行代码: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);

                }
            }

1 回答

  • 0

    客户端中的 readLine() 是阻塞调用,等待行尾字符

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

    你不是't sending an end of line character. You'在服务器中使用 DataOutputStream 并发送原始字节 .

    不要在服务器中使用 DataOutputStream ;我真的不知道你在寻找什么 . 只需将端口号作为带有行尾字符的文本发送即可 .

相关问题