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

Posted

技术标签:

【中文标题】是否可以在同一台机器上运行套接字服务器和套接字客户端?【英文标题】:Is it possible to run a socket server and socket client on the same machine? 【发布时间】:2012-04-21 13:56:49 【问题描述】:

在 java 中可以创建一个套接字服务器和一个套接字客户端,是否可以在同一台机器上同时运行一个套接字服务器实例和一个从套接字服务器接收数据的套接字/服务器客户端?

例如,套接字服务器在端口 60010 上运行 并且套接字客户端正在通过套接字连接到该端口的同一台机器上运行,还是我需要一台新机器并将其添加到我的网络中?如果它在 TCP/IP 层上运行有唯一的 IP 地址和端口号。

【问题讨论】:

是的,这绝对是可能的。自己试试看很容易。 【参考方案1】:

这里有一个简单的可运行示例来帮助您入门。它启动两个线程,一个带有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();
    

【讨论】:

那么,如果客户端和服务器处于不同的进程中会不会有问题?【参考方案2】:

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

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");

【讨论】:

你不能在同一个端口上创建 2 个套接字 你不能将两个服务器套接字绑定到同一个端口,但你可以让多个客户端套接字连接到同一个端口(就像在 Web 服务器中一样)。 在网络服务器中,它是一个服务器套接字...无论如何,如果你这么说,我相信你。根据我的经验,我总是让客户端套接字具有“随机”端口号。 就是我上面说的,一个Server Socket和一个client socket。那有什么不同?【参考方案3】:

是的,您可以在同一台机器上运行客户端和服务器。我一直这样做是为了发展。但是,如果您遇到问题,则某些路由器在将数据包转发回自己时会遇到问题。尝试使用 localhost 而不是您的外部 IP 进行开发。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于是否可以在同一台机器上运行套接字服务器和套接字客户端?的主要内容,如果未能解决你的问题,请参考以下文章

RPC over TCP 与同一台机器上的多个客户端

Python:套接字 - 从同一台PC运行服务器和客户端

用于 Windows 和 Linux 的同一台机器上的套接字

TCP 套接字通信被破坏

在 Windows 上获取对等套接字的 PID

Java 客户端/服务器套接字损坏的管道