2015-07-19 57 views
1

我想在Eclipse中使用java做一个简单的服务器和客户端程序,但每当我运行程序两个控制台输出null。我不知道为什么会发生这种情况。我读到一个常见的问题是我已经创建了一个服务器实例,并且正在尝试创建另一个实例,但我相信那不是问题。我也读过,我可能没有root访问权限,并且需要使用高于1024的端口,所以我做了,而且我仍然有同样的错误。Java套接字测试返回空值

Server代码:

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

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

    public void run() throws Exception { 
     ServerSocket SvrSocket = new ServerSocket(1025); 
     SvrSocket.setReuseAddress(true); 
     Socket socket = SvrSocket.accept(); 
     InputStreamReader Ir = new InputStreamReader(socket.getInputStream()); 
     BufferedReader Br = new BufferedReader(Ir); 

     String message = Br.readLine(); 
     System.out.println(message); 

     if (message != null) { 
      System.out.println("Message succesfully sent and recieved!"); 
     } 
    } 
} 

客户端代码:

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

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

    public void run() throws Exception { 
     Socket socket2 = new Socket("localhost", 1025); 
     PrintStream Ps = new PrintStream(socket2.getOutputStream()); 
     Ps.println("Hello Server"); 
     InputStreamReader Ir = new InputStreamReader(socket2.getInputStream()); 
     BufferedReader Br = new BufferedReader(Ir); 

     String message = Br.readLine(); 
     System.out.println(message); 
    } 
} 
+1

这里没有'套接字测试'。您的客户**打印**为空,因为它正在从已经被对等关闭的连接中读取而没有发送任何内容。 – EJP

+1

尽管存在缺陷,但我不确定为什么这是一个可怕的问题......它具有易于编译的代码,并且至少是从未使用套接字编程的人的症状。 – Makoto

+0

你的代码的一些注意事项:Java中的类名应该使用[PascalCase](https://pl.wikipedia.org/wiki/PascalCase)和变量shoud使用[camelCase](https://en.wikipedia.org/wiki /骆驼香烟盒)。 – Turing85

回答

3

从我可以告诉,你的代码工作正常。您的客户打印null的原因是由于它未收到任何输入本身

让我们来描述一下你在高层沟通的场景。

你有两个程序;服务器和客户端。服务器正在主动侦听对它的任何输入,并且客户端将输入发送到服务器。这个过程(迄今为止)是单向的,而且我们拥有代码结构的方式,我们只会向服务器写任何东西。

现在,您有两个与套接字通信的渠道:输入和输出。回想一下,我们正在向服务器发送数据,并且服务器没有向客户端发送任何数据。这意味着:

  • 服务器应该只关心输入,并没有任何与输出
  • 客户端应该只关心输出,而不是与输入输入。

这就是说,这个代码在客户端是多余的:

InputStreamReader Ir = new InputStreamReader(socket2.getInputStream()); 
BufferedReader Br = new BufferedReader(Ir); 

String message = Br.readLine(); 
System.out.println(message); 

这样做的原因是,你的客户没有进来给它的任何输入,因此任何消息说突然显示出来确实是一件奇怪的事情。

+0

感谢您的建议,如果我删除了这些代码行,我的程序能否按预期工作? – programmer

+0

您不会再从客户端获得null(服务器不会在我的环境中输出null)。 – Makoto

+0

服务器在任何环境中都不打印空。它包含一个测试,以防止它做到这一点。 – EJP