2016-04-21 81 views
0

我正在学习Java套接字编程,而且我非常积极,我的代码是正确的,但由于某种原因服务器和客户端不通信。我不太确定他们是否连接。这是我迄今为止所做的。Java客户端/服务器套接字问题

服务器:

public static void main(String[] args) throws Exception 
{ 
    Main_Server server = new Main_Server(); 
    server.run(); 
} 

public void run() throws Exception 
{ 
    ServerSocket server = new ServerSocket(444); //Port 
    Socket sSocket = server.accept(); 

    BufferedReader bfr = new BufferedReader(new InputStreamReader(sSocket.getInputStream())); 

    String clientMessage = bfr.readLine(); 
    System.out.println("Client: "+clientMessage); 

    if (clientMessage != null) 
    { 
     PrintStream ps = new PrintStream(sSocket.getOutputStream()); 
     ps.println("Message Received."); 
    } 
} 

客户:

public static void main(String[] args) throws Exception 
{ 
    Client_One client = new Client_One(); 
    client.run(); 
} 

public void run() throws Exception 
{ 
    Socket clientSocket = new Socket("localhost", 444); 

    PrintStream ps = new PrintStream(clientSocket.getOutputStream()); 
    ps.println("Hello, server."); 

    BufferedReader bfr = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
    String serverMessage = bfr.readLine(); 
    System.out.println("Server: "+serverMessage); 
} 

于是我运行服务器和第一客户端后(我目前使用NetBeans IDE 8.1)。程序运行,只是坐在那里,但之后没有任何反应。为什么是这样?我只有两个空的控制台。 谢谢你的时间。

+0

看起来乍一看。 444是一个特权端口号,使用大于1023的端口来确保这不是问题。 (Davide的答案听起来像是一个可能的解决方案。) – markspace

+0

@markspace谢谢你,我已经尝试了4444。但再次感谢您的提示:) –

回答

0

如果您使用缓冲区,您需要flush it或close它,否则如果缓冲区未满,数据将保留在缓冲区中。关闭它也可以,因为从javadoc中可以看到关闭一个流也会刷新它。

从OutputStream中的javadoc你可以看到什么清洗手段:

刷新此输出流,并势力任何缓冲的输出字节被写出

注意:还记得当你完成使用它们时关闭输入和输出流,否则你仍然没有正确地关闭使用内存的资源。

+0

非常感谢!真正有用的先生:) –

相关问题