【发布时间】:2021-04-03 13:39:54
【问题描述】:
到目前为止,我一直在使用套接字。一个用于发送和接收的套接字。有人告诉我这是愚蠢的,但是我无法从头开始找到在客户端和服务器上使用套接字对的正确方法。我会给出我目前的方式,希望有人能告诉我如何用这个来做socketpairs。顺便说一下使用TCP。
#client
import socket
my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = "127.0.1.1"
port = 22222
my_socket.connect((ip, port))
#server
import socket
import multiprocessing
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip_address = socket.gethostbyname(hostname)
port = 22222
s.bind((ip_address, port))
s.listen(20)
connections=[]
connection_threads=[]
while True:
clientsocket, address = s.accept()
#does this create a new socket for every incoming connection by the way?
new_client = client.Client(address, clientsocket)
connections.append(new_client)
new_process = multiprocessing.Process(target=client_butler.connect_client, args=(new_client,))
new_process.start()
connection_threads.append(new_process)
我的最终目标是服务器为每个客户端提供一个套接字对。我知道这可能不是一个好的实现,因为它完全忽略了错误处理等,但我会在未来考虑这一点,因为我要做的就是自学这个。所以问题是,我如何将其转化为使用套接字对?
我遇到的问题:
- 如何在我的客户端中通过
my_socket.connect连接套接字对? - 如果我只是单独连接两个套接字,我如何在服务器中“重新组装”这对插座
- 我这样做是正确的,还是完全错误的方法?
另外:我检查了this,但即使我可以复制代码并且它会起作用,我也不知道为什么它会起作用,这不是我想要的,我不希望这个工作我也想从中学习。
谢谢!
【问题讨论】:
-
由于连接是双向的,通常只使用一个。一个命令连接和一个或多个数据连接也很常见。
-
@MaritnGe:发送和监听是两个不同的套接字,发送和接收不是。监听只是接受新连接,而不是交换实际数据。
-
@MaritnGe:确切地说,一个用于listen+accept的服务器套接字,每个accept返回一个新的连接套接字,用于与连接的客户端进行实际数据交换。
-
@MaritnGe - 该答案适用于与自身通信的程序(并且通常与子进程一起使用)。在客户端/服务器应用程序中,有一对套接字 - 一个在客户端连接,一个在服务器中接受。在单个应用程序中,
socket.socketpair执行相同的操作,但在单个进程中。socketpair是监听/连接/接受握手的快捷方式,完全绕过 TCP 堆栈。
标签: python sockets tcp python-sockets