在同一台计算机上运行套接字服务器和套接字客户端是否可能?

19
在Java中,可以创建一个套接字服务器和一个套接字客户端。在同一台计算机上,是否可以同时运行套接字服务器实例和从套接字服务器接收数据的套接字/服务器客户端?
例如,套接字服务器运行在60010端口上,套接字客户端正在同一台计算机上通过套接字连接到该端口,或者我需要购买一台新计算机并将其添加到我的网络中吗?如果它具有在TCP/IP层上运行的唯一IP地址和端口号。

2
是的,这绝对是可能的。尝试一下并亲自验证很容易。 - ulmangt
4个回答

23

这是一个简单的可运行示例,可以帮助你入门。它启动了两个线程,一个使用ServerSocket,另一个建立了一个Socket连接。其中一个不断地发送字符串,而另一个则打印它们。

你应该可以直接运行这个类。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketTest {
    public static void main(String[] args) throws IOException {

        startServer();
        startSender();
    }

    public static void startSender() {
        (new Thread() {
            @Override
            public void run() {
                try {
                    Socket s = new Socket("localhost", 60010);
                    BufferedWriter out = new BufferedWriter(
                            new OutputStreamWriter(s.getOutputStream()));

                    while (true) {
                        out.write("Hello World!");
                        out.newLine();
                        out.flush();

                        Thread.sleep(200);
                    }

                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    public static void startServer() {
        (new Thread() {
            @Override
            public void run() {
                ServerSocket ss;
                try {
                    ss = new ServerSocket(60010);

                    Socket s = ss.accept();

                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(s.getInputStream()));
                    String line = null;
                    while ((line = in.readLine()) != null) {
                        System.out.println(line);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

客户端和服务器在不同的进程中是否会存在问题? - Yola

3

是的,您可以在同一台计算机上拥有以下内容:

ServerSocket server = new ServerSocket(60010);
Socket client = server.accept();

其他地方:

Socket socket = new Socket("localhost", 60010);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Hello server");

无法在同一端口创建两个套接字。 - Ismael
2
你不能将两个服务器套接字绑定到同一个端口,但是你可以有多个客户端套接字连接到同一个端口(例如Web服务器)。 - Abdullah Jibaly
在Web服务器中,它是一个服务器套接字...无论如何,如果你这么说,我相信你。根据我的经验,我总是让客户端套接字具有“随机”的端口号。 - Ismael
1
这就是我上面所描述的,一个服务器套接字和一个客户端套接字。它们有什么不同? - Abdullah Jibaly

1

是的,您可以在同一台计算机上运行客户端和服务器。我经常为开发而这样做。但如果您遇到问题,一些路由器可能会出现将数据包转发回自身的问题。尝试在开发中使用本地主机名代替外部IP地址。


1

是的,这完全是可能的。每个操作系统都有一个loopback接口。您可以让多个客户端连接到您计算机上的一个服务器。这种通信是通过回环接口进行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接