Java TCP客户端服务器挂起?

时间:2014-02-17 06:55:18

标签: java sockets tcp network-programming serversocket

我目前很难理解为什么我的代码无效。我在下面包含了我的客户端和服务器代码。我已经发现我的问题发生在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();
    } 

   }

 }

3 个答案:

答案 0 :(得分:2)

检查评论

并确保在服务器端的控制台上获得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();
        } 

       }

     }

答案 1 :(得分:2)

你应该在你的PrintWriters上使用autoflush,如下所示:

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

你可以设置一个PROTOCOL来结束这样的沟通:

在您的客户中:

w.println("[END]");

在您的服务器中:

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

希望这会有所帮助:

答案 2 :(得分:2)

两端都在阅读直到EOS,直到之后都没有结束。所以你有一个经典的僵局。您需要重新考虑您的应用程序协议。

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