简单的Java服务器/客户端不工作?

问题描述:

我有一个基本的服务器和用Java编写的客户端。这是我在互联网上看到的代码,并进行了一些修改以适应我的需求。现在的事情是,我基本上是从客户端发送消息到服务器。这条消息将是“你好”。服务器检查端口6789是否有包含单词“hello”的消息,如果是,则必须获取某个目录中所有文件/子目录的名称。这些名字中的第一个被发送回客户端,客户端将其打印出来。我已经打开了端口6789,并将消息从客户端发送到服务器完美地工作。服务器收到它并执行必要的操作,但不会将数据发送回客户端。我不知道客户端是否没有收到它,或者服务器是否没有发送它。这里有两个代码:简单的Java服务器/客户端不工作?

客户

String sentence = "hello"; 
    Socket clientSocket = new Socket("localhost", 6789); 
    DataOutputStream outToServer = new DataOutputStream(
      clientSocket.getOutputStream()); 
    outToServer.writeBytes(sentence + '\n'); 
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
      clientSocket.getInputStream())); 
    System.out.println(inFromServer.readLine()); 
    clientSocket.close(); 

服务器

String sentence; 
    ServerSocket welcomeSocket = new ServerSocket(6789); 

    while (true) { 
     Socket connSocket = welcomeSocket.accept(); 
     BufferedReader inFromClient = new BufferedReader(
       new InputStreamReader(connSocket.getInputStream())); 
     sentence = inFromClient.readLine(); 
     if (sentence.contains("hello")) { 
      File dir = new File("D:/ServerMap/"); 
      String[] children = dir.list(); 
      if (children == null) { 
       JOptionPane.showMessageDialog(frame, 
         "Either no directory or it doesn't exist"); 
      } else { 
       DataOutputStream outToClient = new DataOutputStream(
         connSocket.getOutputStream()); 
       outToClient.writeBytes(children[0]); 
       JOptionPane.showMessageDialog(frame, children[0]); 
      } 
     } 
    } 

我通过单独导出运行的JAR文件执行服务器和客户端被编译并在Eclipse中运行。

只是为了澄清我的问题:客户端向服务器发送“hello” - >服务器接收到消息并且它包含“hello”,因此if-statement返回true - >服务器检查指定目录中的文件名并找到一对 - >服务器发回它找到的第一个文件名 - >客户端应该接收文件的名称和它在Eclipse控制台打印(这是行不通的部分)

有什么建议?

PS:这是在本地主机上全部完成。它在1台计算机上完成,Windows 7 x64,端口6789已打开(在我手动打开它之前根本没有任何工作),这就是它。

您应该清空从客户端的输出流中的数据在服务器:

outToClient.writeBytes(children[0] + "\n"); 
outToClient.flush(); 
// etc. 
+2

还,服务器需要一个换行符添加到写调用,因为客户端调用'readLine'。 – jtahlborn 2012-07-21 13:54:08

+0

的确,在测试中实际上没有换行符 – Reimeus 2012-07-21 13:58:06

的问题是,你的客户正在等待一个换行符“\ n”是服务器不发送。在客户端,你有inFromServer.readLine(),并在服务器端,您有outToClient.writeBytes(儿童[0]),所以你必须将其更改为outToClient.writeBytes(儿童[0] +“\ n”)由建议Reimeus。来自BufferedReader类的readLine方法阻塞,直到它读取“\ n”。