【问题标题】:How do I implement SocketPairs in Python?如何在 Python 中实现 SocketPairs?
【发布时间】: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


【解决方案1】:

引用自Computer Networking: A Top-Down Approach, 7th Edition:

client.py:

from socket import *


serverName = "127.0.0.1"
serverPort = 12000

clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))

sentence = input('Input lowercase sentence: ')
clientSocket.send(sentence.encode())

modifiedSentence = clientSocket.recv(1024)

print('From Server: ', modifiedSentence.decode())

clientSocket.close()

server.py

from socket import *

serverPort = 12000
serverSocket = socket(AF_INET, SOCK_STREAM)

serverSocket.bind(('', serverPort))
serverSocket.listen(1)

print('The server is ready to receive')

while True:
    connectionSocket, addr = serverSocket.accept()
    sentence = connectionSocket.recv(1024).decode()
    capitalizedSentence = sentence.upper()
    connectionSocket.send(capitalizedSentence.encode())
    connectionSocket.close()

【讨论】:

  • 但是socketpairs在哪里呢?有人告诉我我不应该使用同一个套接字来发送/收听
  • @MaritnGe - 您无法在监听套接字上发送或接收任何内容,但您可以在接受的套接字上发送接收。
  • @MaritnGe,我不确定你想要什么,但通常只有一个端口用于监听连接,一旦有连接,服务器将为每个连接创建另一个端口用于交换数据。
猜你喜欢
  • 2017-04-15
  • 2019-07-11
  • 2011-01-22
  • 2017-01-02
  • 2018-11-30
  • 2021-04-12
  • 2020-08-01
  • 2012-08-29
  • 2020-12-04
相关资源
最近更新 更多