TCP Client / Server在一个类中

时间:2011-12-10 21:04:14

标签: java sockets tcp

我正在尝试同时编写既是TCP客户端又是TCP服务器的程序,以便在分布式网络中广播消息。在我能够将这些程序的多个实例连接在一起后,我发现我无法从套接字中读取。我简化了实现,但仍然遇到同样的问题。

简化代码如下:

public class Server {
public static void main(String[] args){
    try {
        ServerSocket ssocket = new ServerSocket(1234);
        Socket socket = new Socket("localhost", 1234);
        socket = ssocket.accept();

        String data = "Hello World";
        PrintWriter out;
        out = new PrintWriter(socket.getOutputStream(), true);
        System.out.print("Sending string: '" + data + "'\n");
        out.print(data);
        out.flush();

        BufferedReader in = new BufferedReader(new
                InputStreamReader(((Socket) socket).getInputStream()));
        System.out.print("Received string: '");

        while (!in.ready()) {}
        System.out.println(in.readLine());
        System.out.print("'\n...");
        in.close();
    } catch (UnknownHostException e2) {
        e2.printStackTrace();
    } catch (IOException e2) {
        e2.printStackTrace();
    }
}
}

运行代码时,我收到以下输出:

Sending string: 'Hello World'
Received string: '

为什么我无法读取输入流?

1 个答案:

答案 0 :(得分:1)

变量socket依次指向两个不同的Socket对象:首先,您创建的对象是服务器的客户端。其次,ServerSocket返回的是连接到客户端的那个。当您创建第二个时,您将丢弃对第一个的引用。但是,当您将数据打印到其中一个插槽时,它将显示在另一个插槽上。由于您只能引用两个套接字中的一个,因此您将永远无法观察到正在接收的数据。

如果你要在同一个进程中拥有一个客户端和一个服务器,彼此交谈,你真的需要使用单独的线程。通常在这样的简单程序中,服务器部分创建一个新的线程来为每个连接提供服务。这在这里会很好用。