Это не Python, а «сеть» и, конечно же, не «многопоточность». Вам нужно либо направлять клиентов на разные порты, либо создавать новый исходящий сокет для каждого нового клиентского соединения.
Поскольку у вас есть несколько сокетов, очень эффективный подход - сидеть на select
и ждать входящих вызовов.
Для идентификации клиентов также необходимо сохранить ссылку на локальные адреса, используемые новыми сокетами для связи с сервером.
Ваш код переработан, чтобы открыть socket
для каждого нового входящего клиентского соединения. Никаких гарантий, потому что это связано с сетевым тестированием на сценарий (ваш), который неизвестен.
Для очень надежной реализации вы должны добавить проверку на наличии ошибок, удаление гнезда для подключения ушедшего ...
import select
import socket
import sys
localPort, remoteHost, remotePort = sys.argv[1].split(':')
try:
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('', localPort))
except:
fail('Failed to bind on port ' + str(localPort))
localaddr = s.getsockname() # (localhost, localport)
remaddr = (remoteHost, remotePort)
sys.stderr.write('Ready.\n')
allsockets = [server]
proxysocks = dict()
origins = dict()
while True:
toread, _, _ = select.select(allsockets, [], [])
s = toread[0] # 1st socket available to read
data, orig = s.recvfrom(32768) # data, (remhost,remport)
dest = s.getsockname() # (localhost, localport)
if dst == localaddr: # client -> localserver
try:
p = proxysocks[orig] # find proxy sock
except KeyError: # new client connection
proxysocks[orig] = p = socket.socket(socket.AF_INET,
socket.SOCK_DGRAM)
proxyaddr = p.getsockname() # keep local address of new socket
origins[proxyaddr] = orig # link proxyaddr -> clientaddr
allsockets.append(p) # make it "selectable"
p.sendto(remaddr, data) # send to server
else: # server -> proxyaddr
s.sendto(origins[dstaddr])
Мне очень жаль, но я новичок в Python. Не могли бы вы привести мне пример, как это сделать? – juggernawt