2015-03-02 59 views
0

这是一个愚蠢的新手问题,我知道。但是,在互联网上,TCP服务器只有可怕的例子。像这样:如何让我的TCP服务器不断接收数据?

try { 
    Socket skt = new Socket("localhost", 1332); 
    BufferedReader in = new BufferedReader(new 
    InputStreamReader(skt.getInputStream())); 
    System.out.print("Received string: '"); 

    while (!in.ready()) {} 
    System.out.println(in.readLine()); // Read one line and output it 
    System.out.print("'\n"); 
    in.close(); 
} catch(Exception e) { 
    System.out.print("Whoops! It didn't work!\n"); 
} 

我该如何处理多个客户端,并且能够不断地接收数据而不是仅仅关闭输入流?

在因特网上没有简单的代码片段。

+0

您的示例无法处理多个客户端,因为它不是服务器,而是客户端。但是互联网充满了Client-Server的例子。事实上,Java教程很可能在网络下包含一个示例。 – Kayaman 2015-03-02 11:50:07

+0

是的,但他们都是愚蠢的教程,只需要一个客户端,并在第一次接收数据后关闭套接字。你有什么好建议吗? – Joehot200 2015-03-02 11:56:15

+0

您可能还想阅读官方教程的其余部分。 http://docs.oracle.com/javase/tutorial/networking/ – Kayaman 2015-03-02 11:59:48

回答

1

您显示的代码是针对客户端,这是一个与服务器进行特定会话对话的应用程序。

对于服务器(如here),您可以使用输入特定端口号的ServerSocket。套接字监听端口,每次有人想要连接都会创建一个连接。该连接是服务器与客户端进行通信的某种会话。

服务器的小例子,因此是一样的东西:

class TCPServer { 

    public static void main(String argv[]) throws Exception { 
     int port = 8081; 
     ServerSocket waiting = new ServerSocket(port); 

     while(true) { 
      Socket socket = waiting.accept(); //wait until a client shows up 
      new SessionHandler(socket).start();//create new handler with the socket 
      //start listening again 
     } 
     } 
} 

所以你在while循环使得从你收到一个客户端的连接的那一刻,你再等一个运行.accept

而作为SessionHandler

class SessionHandler extends Thread { 

    private Socket socket; 

    public SessionHandler (Socket socket) { 
     this.socket = socket; 
    } 

    public void run() { 
     //handle the session using the socket (example) 
     BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
     DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
     //read input from inFromClient, write to outToClient 
    } 

} 

现在的工业TCP服务器上,这个故事是科西嘉稍微复杂一点的:你会使用线程池以防止服务器得到太多的工作,等

相关问题