6

我对编程比较陌生,正在尝试自学套接字编程。根据我的理解,如果一个进程(比如服务器进程)需要通过网络与另一个进程(比如客户端进程)通信,那么两个端点都需要一个套接字。

如果我的服务器和客户端进程在同一台机器上,那么为什么我需要套接字,因为流或数据报没有通过网络传输?它在同一台机器内。有人可以澄清一下原因吗?

4

5 回答 5

11

那么同一台机器上的两个进程如何在使用套接字的情况下进行通信呢?

...

没错,套​​接字是两个进程进行通信的一种方式,无论是通过网络还是在同一台机器内。您可以在同一台机器内发明其他通信机制(并且有很多),但如果套接字已经完美地服务于这个目的,为什么?

于 2013-05-09T11:27:04.397 回答
3

如果您确定它们将始终在同一台机器上,那么就不需要套接字。

同一台机器上的进程之间还有其他数据共享机制,例如通过文件共享。但是套接字通过提供抽象使其对用户来说无论是在同一台机器上还是在不同的机器上都是透明的,因此如果您可能需要在不同的机器上使用它,那么套接字是一个好方法。

于 2013-05-09T11:32:15.407 回答
1

您使用的是什么操作系统?如果是 Windows,那么你有所有这些来做 IPC

Windows 支持以下进程间通信 (IPC) 机制:

  • 剪贴板
  • 通讯
  • 数据复制
  • DDE
  • 文件映射
  • 邮槽
  • 管道
  • RPC
  • Windows 套接字

在继续之前,让我们知道您的操作系统,我们可以为您提供一些有关进程间通信的线索。

于 2013-05-09T11:40:44.407 回答
0

套接字使用 TCP 提供两台计算机之间的通信机制。客户端程序在其通信结束时创建一个套接字并尝试将该套接字连接到服务器。

建立连接后,服务器在通信结束时创建一个套接字对象。客户端和服务器现在可以通过写入和读取套接字进行通信。

java.net.Socket 类表示一个套接字,java.net.ServerSocket 类为服务器程序提供了一种机制来监听客户端并与它们建立连接。

使用套接字在两台计算机之间建立 TCP 连接时会发生以下步骤:

The server instantiates a ServerSocket object, denoting which port number communication is to occur on.

The server invokes the accept() method of the ServerSocket class. This method waits until a client connects to the server on the given port.

After the server is waiting, a client instantiates a Socket object, specifying the server name and port number to connect to.

The constructor of the Socket class attempts to connect the client to the specified server and port number. If communication is established, the client now has a Socket object capable of communicating with the server.

On the server side, the accept() method returns a reference to a new socket on the server that is connected to the client's socket.

建立连接后,可以使用 I/O 流进行通信。每个套接字都有一个 OutputStream 和一个 InputStream。客户端的OutputStream 连接到服务器的InputStream,客户端的InputStream 连接到服务器的OutputStream。

TCP 是双向通信协议,因此可以同时跨两个流发送数据。以下有用的类提供了一套完整的方法来实现套接字。

于 2013-05-09T11:27:19.257 回答
0

不同进程之间有多种通信方式,套接字就是其中之一。

与往常一样,需要权衡取舍。

有更快、资源成本更低的 IPC 方法。其中一些方法会增加额外的代码复杂性,如果使用不当,可能会给您的应用程序添加可能的错误。

套接字的主要好处是它们是透明的。如果您后来决定希望一个或多个进程在另一台机器上运行,则不必更改代码。

于 2013-05-09T11:34:35.047 回答