2014-10-20 53 views
5

我在Java中,以下套接字服务器,套接字服务器读取

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

public class MiddleSocket { 
    private ServerSocket middleman; 
    private int port = 1027; 
    private Socket client; 


    protected void createSocketServer() 
    { 
     try 
     { 
      middleman = new ServerSocket(port); 
      client = middleman.accept(); 
      middleman.close(); 
      PrintWriter out = new PrintWriter(client.getOutputStream(),true); 
      BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 
      while(true) 
      { 
       System.out.println("echo: " + in.readLine()); 
       out.println("test"); 
      } 
     } 
     catch(IOException e) 
     { 
      System.out.println(e); 
     } 
    } 

} 

它工作正常在它从客户端,一切是如何读取。不过,我想套接字服务器只尝试读取时,有来自客户端的消息,因为在循环它不断,即使没有来自客户端的消息被接收到该读输出一串

echo: null

是否有一些机制缺少wait()让while循环知道坐下来等待,然后在从客户端发送消息读取该消息并且一旦读取该消息并且发送了答复时触发,然后仅仅坐下,直到收到来自客户端的下一条消息?

回答

3

你可以简单地做这样的事情如下:

String line; 
while ((line = in.readLine()) != null) { 
    \\Do stuff 
} 

这应该有预期的行为。

编辑:

这里就是我在注释中使用你的代码在谈论的一个完整的例子:

package javaapplication12; 

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

public class SocketExample { 
    private ServerSocket middleman; 
    private int port = 8080; 
    private Socket client; 


    protected void createSocketServer() 
    { 
     try 
     { 
      while (true){ 
       middleman = new ServerSocket(port); 
       client = middleman.accept(); 
       middleman.close(); 
       PrintWriter out = new PrintWriter(client.getOutputStream(),true); 
       BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
       BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 
       String line; 
       while((line = in.readLine()) != null) 
       { 
        System.out.println("echo: " + line); 
        out.println("test"); 
       } 
      } 
     } 
     catch(IOException e) 
     { 
      System.out.println(e); 
     } 
    } 

    public static void main(String[] args){ 
     SocketExample test = new SocketExample(); 
     test.createSocketServer(); 
    } 
} 
+0

但是我希望循环不能退出,因为我希望Socket服务器始终运行。 – jgr208 2014-10-20 16:19:36

+0

然后你应该循环'.accept'命令,该命令应该处理从连接客户端收到的任何输入,然后关闭连接并等待新连接。我会用一个例子来修改我的答案。 – WillBD 2014-10-20 16:21:20

+0

编辑我的答案,以反映我上面提到的。当然要记住,它一次只能处理一个连接,但这是一个功能性示例。请注意,while(true)围绕代码的不同部分循环,这允许它接受无限数量的连接,但处理每个连接所花的时间有限,这正是您想要的。 – WillBD 2014-10-20 16:30:46

1

我想套接字服务器只尝试时,有一个读来自客户端的消息,因为它在循环中保持读取,即使当没有来自客户端的消息被接收到时,该输出一堆

echo: null 

那是因为你忽略了流的结束,这是null的含义。这并不意味着客户端根本没有消息。这意味着对方已关闭连接。