我对编程比较陌生,并且正在尝试自学socket编程。根据我的理解,如果进程(比如服务器进程)需要通过网络与另一个进程(比如客户端进程)通信,则两个端点都需要一个套接字。
如果我的服务器和客户端进程在同一台机器上,那么为什么我需要套接字,因为流或数据报没有通过网络?它在同一台机器上。有人可以澄清一下这个原因吗?
答案 0 :(得分:9)
那么同一台机器上的两个进程如何在没有的情况下使用套接字进行通信?
...
没错,套接字是两个进程通信的一种方式,无论它是通过网络还是通过同一台机器。你可以发明在同一台机器内进行通信的其他机制(并且有很多),但为什么如果套接字已经完全可以满足这个目的呢?
答案 1 :(得分:3)
如果您确定它们将始终位于同一台机器中,则不需要插座。
在同一台机器上的进程之间还有其他数据共享机制,例如通过文件共享。但是套接字通过提供抽象使得它对用户来说是透明的,无论它是在同一台机器上还是在不同的机器上,所以如果可能需要它在不同的机器上,套接字是一种好方法。
答案 2 :(得分:1)
您使用的操作系统是什么?如果它是Windows,那么你有所有这些做IPC
Windows支持以下进程间通信(IPC)机制:
在继续之前,请告诉我们您的操作系统,我们可以为您提供有关进程间通信的一些线索。
答案 3 :(得分: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是双向通信协议,因此可以同时跨两个流发送数据。有以下有用的类提供了完整的方法来实现套接字。
答案 4 :(得分:0)
有几种方法可以在不同进程之间进行通信,套接字就是其中之一。
一如既往,需要权衡利弊。
有更快,更少资源的方法来进行IPC。其中一些方法会增加额外的代码复杂性,如果使用不当,可能会给应用程序增加可能的错误。
套接字的主要好处是它们是透明的。如果您以后决定要在另一台计算机上运行一个或多个进程,则不必更改代码。