如果服务器和客户端进程在同一台机器上,那么套接字的作用是什么?

6

我相对来说是编程新手,正在尝试自学socket编程。据我了解,如果一个进程(比如服务器进程)需要通过网络与另一个进程(比如客户端进程)通信,则两端都需要一个socket。

如果我的服务器和客户端进程在同一台机器上,那么为什么我需要sockets呢?因为流或数据报没有经过网络,它们在同一台机器上。请问有人可以澄清这个原因吗?


1
因为套接字API是跨平台、强大、快速和轻量级的。如果数据量较小,那么Unix域套接字在性能方面几乎是最优的选择,在这种情况下,上下文切换比基于共享内存的解决方案多一次复制的成本更为显著。 - Nicholas Wilson
5个回答

11

那么,如果不使用套接字,同一台计算机上的两个进程如何进行通信?

...

没错,套接字是两个进程进行通信的一种方式,无论是在网络上还是在同一台计算机上。你可以发明其他机制来实现同一台计算机内部的通信(而且有很多种),但是如果套接字已经完美地实现了该目的,为什么要这样做呢?


好的,deceze。我一直以为套接字只用于网络通信。谢谢你提供的信息。 - Subi Puthalath

3

如果你确定它们永远会在同一台机器上,那么就不需要使用 sockets。

在同一台机器上的进程之间有其他数据共享机制,例如通过文件共享。但是,sockets提供了一个抽象层,使用户无论是在同一台机器上还是在不同的机器上都能够透明地使用,因此如果你可能需要在不同的机器上使用,sockets是一个很好的选择。


1

你使用的是什么操作系统?如果是Windows,则可以使用以下这些进行进程间通信:

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

在继续之前,请告诉我们您的操作系统,我们可以为您提供有关进程间通信的一些提示。


我正在使用Linux(Ubuntu 10.10)。 - Subi Puthalath

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流进行通信。每个套接字都有一个输出流和一个输入流。客户端的输出流连接到服务器的输入流,客户端的输入流连接到服务器的输出流。

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


4
1)这并没有真正回答问题 2)套接字不需要基于TCP。 - deceze

0

在不同进程之间进行通信有几种方法,其中之一是使用套接字。

像往常一样,这里存在权衡取舍。

有更快、资源消耗较少的方式来进行IPC。其中一些会增加额外的代码复杂性,如果使用不当,可能会给您的应用程序带来潜在的错误。

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


谢谢Karoly。所以你的意思是套接字也可以用作其他IPC(进程间通信)的目的,比如共享内存、通过文件共享。但是在网络上,唯一的机制就是使用套接字。我的结论是正确的吗? - Subi Puthalath
正确。但是我关注了不同的角度。使用套接字,你可以进行本地和远程通信。 - Karoly Horvath
如果您不介意的话,能否告诉我您当时想要传达给我的具体意思。 - Subi Puthalath

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