【问题标题】:Java TCP Client Server Hangs Up?Java TCP 客户端服务器挂起?
【发布时间】:2014-02-17 06:55:17
【问题描述】:

我目前很难理解为什么我的代码不起作用。我在下面包含了我的客户端和服务器代码。我发现我的问题发生在 while 循环的某个地方,但我不确定如何解决它,以免卡住。我在论坛上搜索了一段时间,有人说添加换行符可以解决问题,但我仍然遇到问题。

我的主要问题是如何避免流程卡住并且无法正常通信。有人能指出我正确的方向吗?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;


public class My_Client {

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

    Socket s = new Socket("localhost", 5555);

    BufferedReader r = new BufferedReader(new InputStreamReader( 
            s.getInputStream()));

    PrintStream w = new PrintStream(s.getOutputStream());

    w.print("hello world");
    w.print('\n');

    String line;

    while ((line = r.readLine()) != null) {
        System.out.println("Received: " + line);

        //System.out.println("Error");
    }
    w.close();
}
}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

-----------------------------------------------------------------
public class My_Server {

private static final int PORT = 5555;

public static void main(String[] args) {
    try {
        ServerSocket ss = new ServerSocket(PORT); 
        System.out.println("Server Socket Created");

        while (true) {

            System.out.println("Waiting on connection");
            Socket cs = ss.accept(); 
            System.out.println("Client connected");

            BufferedReader r = new BufferedReader(new InputStreamReader( 
                    cs.getInputStream()));
            PrintStream w = new PrintStream(cs.getOutputStream());

            String line;

            while ((line = r.readLine()) != null) {
                w.print(line + "!!!!");  
                w.print('\n');
            }

            System.out.println("Client disconnected");
            r.close();
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

   }

 }

【问题讨论】:

标签: java sockets tcp network-programming serversocket


【解决方案1】:

在 EOS 之前,两端都在读取,并且在那之后都不会关闭。所以你有一个经典的僵局。您需要重新考虑您的应用程序协议。

需要告诉你的PrintStreamPrintWriter自动刷新,或者自己打电话给flush(),但这与上面的错误相比是一个相对较小的问题。

【讨论】:

  • 因此,在查看了某人(Sanjeev)的答案后,建议我从客户端编写一个字符串“[END]”并在服务器中检查它以结束循环,这样就可以了。这是处理此问题的适当方法吗?我可以看到同时读取两侧可能会导致问题,但我想知道这是否是解决此问题的正确方法还是破解?
  • 它会起作用,但不是必需的。您可以只关闭套接字以进行输出,而不是发送特定的应用程序协议消息。这将导致对等方的 readLine() 方法返回 null, 并离开。
【解决方案2】:

您应该像这样在 PrintWriters 上使用 autoflush:

PrintStream w = new PrintStream(cs.getOutputStream(),true);

您可以设置一个协议来结束通信,如下所示:

在您的客户中:

w.println("[END]");

在您的服务器中:

 while (!(line = r.readLine()).equals("[END]")) {

希望这会有所帮助:

【讨论】:

    【解决方案3】:

    检查cmets

    并确保您在服务器端的控制台上获得Client Connected

    CLIENT SIDE
        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStreamReader;
        import java.io.PrintStream;
        import java.net.Socket;
        import java.net.UnknownHostException;
    
    
        public class My_Client {
    
        public static void main(String[] args) throws UnknownHostException, IOException {
    
            Socket s = new Socket("localhost", 5555);
    
            BufferedReader r = new BufferedReader(new InputStreamReader( 
                    s.getInputStream()));
    
            PrintStream w = new PrintStream(s.getOutputStream());
    
            w.print("hello world");
            w.print("\n"); // enter new line
            w.flush();// flush the outputstream
            String line;
    
            while ((line = r.readLine()) != null) {
                System.out.println("Received: " + line);
    
                //System.out.println("Error");
            }
            w.close();
        }
        }
        SERVER SIDE
        ----------------------------------------------------------
        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStreamReader;
        import java.io.PrintStream;
        import java.net.ServerSocket;
        import java.net.Socket;
    
        public class My_Server {
    
        private static final int PORT = 5555;
    
        public static void main(String[] args) {
            try {
                ServerSocket ss = new ServerSocket(PORT); 
                System.out.println("Server Socket Created");
    
                while (true) {
    
                    System.out.println("Waiting on connection");
                    Socket cs = ss.accept(); 
                    System.out.println("Client connected");
    
                    BufferedReader r = new BufferedReader(new InputStreamReader( 
                            cs.getInputStream()));
                    PrintStream w = new PrintStream(cs.getOutputStream());
    
                    String line;
    
                    while ((line = r.readLine()) != null) {
                        w.print(line + "!!!!");  
                        w.print("\n");// entering new line
                    }
    
                    System.out.println("Client disconnected");
                    r.close();
                    w.close();// close w
                }
    
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
    
           }
    
         }
    

    【讨论】:

    • 我尝试刷新输出流并添加 w.close(),但我仍然卡住了。程序永远不会到达 w.close() 并且永远不会退出循环。
    • 你卡在哪里了?服务器端循环还是客户端循环?
    • 我不确定。我怎样才能确定这一点?我尝试在循环中放置一个字符串,以查看某处是否存在无限循环,但没有无限循环,这就是它令人困惑的原因。就像程序一起停止了
    • 你在服务器端打印了Client connected
    • 是的,客户端已连接
    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 2023-03-21
    • 2017-07-10
    • 2017-09-13
    • 1970-01-01
    • 2012-06-19
    • 2019-02-26
    • 2019-02-26
    相关资源
    最近更新 更多