2016-02-17 40 views
1

最近我在看socket通信,在看了几个教程之后,我发现了类似的东西。如何使套接字通信?

public class Server{ 

    public static void main(String[] args) throws IOException, InterruptedException { 
     ServerSocket server = new ServerSocket(9999); 
     Socket socket = server.accept(); 
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     String message = ""; 
     int ch = -1; 
     while((ch=in.read())!= -1){ 
      message+=ch; 
     } 
    // String message = in.readLine(); 
     System.out.println("RECEIVED "+message); 
     out.write("RESPONSE "+message+"\n"); 
     out.flush(); 

     System.out.println("NEW MESSAGE SEND"); 
     Thread.sleep(3000); 
     System.out.println("CLOSE"); 
     server.close(); 
    } 

} 

public class Client { 

    public static void main(String[] args) throws UnknownHostException, IOException { 
     Socket socket = new Socket("127.0.0.1", 9999); 
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

     out.write("MESSAGE\n"); 
     out.flush(); 
     System.out.println("SEND MESSAGE"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     System.out.println(in.readLine()); 
     socket.close(); 
    } 

} 

后运行此代码,Client日志"SEND MESSAGE"而服务器挂起in.read()并且不接收任何消息。 任何人都可以帮我解释我做错了什么吗?

+2

您是否按照[官方教程](https://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html)? –

+0

@ GermannArlington是的。否则,他无法在其周围包装“BufferedReader”。 – EJP

+0

@GermannArlington这是错的。 'BufferedReader'不需要'InputStream'作为参数。 –

回答

3

您的服务器正在从套接字读取,直到流结束。流的结束仅在对等关闭连接时发生。此时您将无法发送回复。你需要重新考虑你的协议。对于一个简单的例子,你可以一次一个地读和写行,就像你在客户端一样。

+0

我接受你的答案,因为它给了我提示,并且有些想法正在发生,但实际上使用方法'println'而不是'write'解决了我的问题。 – user902383

+0

实际上'write(“MESSAGE \ n”)'和'println(“MESSAGE”)'没有区别,实际上你的问题是你一直在读取输入直到流结束而不是一行。 – EJP

+0

你是对的,我只是看着执行,也许我做了别的事,昨天已经太迟了。谢谢。 – user902383