等待来自客户端读取消息的套接字服务器

时间:2014-10-20 16:11:48

标签: java sockets wait java-io

我在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 个答案:

答案 0 :(得分:4)

您可以执行以下操作:

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();
    }
}

答案 1 :(得分:2)

您可以使用InputStream.read()或InputStream.read(byte [])。两者都将阻止

Here is an example

答案 2 :(得分:1)

  

我希望套接字服务器只在有来自客户端的消息时尝试读取,因为即使没有收到来自客户端的消息,它仍会继续读取,这会输出一堆

echo: null

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

相关问题