Похоже, вам может понадобиться запустить его в 2 разных процессах или разделить клиент и сервер на 2 разных потока. Я получил это, чтобы работать на моей коробке Win7 только сейчас:
client.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", 4242))
while True:
line = input("String to send: ")
s.send(line.encode("utf-8"))
server.py:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("0.0.0.0", 0))
s.listen(5)
client, address = s.accept()
while 1:
data = client.recv(1024)
if data:
client.send(data)
print(data.decode("utf-8"))
Результаты:
C: \ Users \ jon \ Desktop> python.exe client.py
Строка для отправки: «Привет!»
Отдельная консоль
C: \ Users \ jon \ Desktop> python server.py
Здравствуйте!
Более подробная информация о FAQ программиста Winsock
Сценарий, который вы используете, висит на sock, addr = listen_socket.accept()
(до истечения времени ожидания, если он установлен с sock.settimeout(x)
). При использовании sock.setblocking(0)
исключение socket.error: [Errno 10035] A non-blocking socket operation could not be completed immediately
генерируется в строке accept()
, и вот что происходит с таймаутом:
def serve(listen_socket, poetry_file, num_bytes, delay):
while True:
print "accepting data"
try:
sock, addr = listen_socket.accept()
except socket.error, e:
print e
else:
print 'Somebody at %s wants poetry!' % (addr,)
send_poetry(sock, poetry_file, num_bytes, delay)
def main():
options, poetry_file = parse_args()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((options.iface, options.port or 0))
sock.listen(5)
sock.settimeout(5)
print 'Serving %s on port %s.' % (poetry_file, sock.getsockname()[1])
serve(sock, poetry_file, options.num_bytes, options.delay)
if __name__ == '__main__':
main()
Результат:
C:\Users\jon\Desktop>python.exe test.py poetry.txt
Serving poetry.txt on port 25355.
accepting data
timed out
accepting data
timed out
accepting data
timed out
accepting data
timed out
accepting data
timed out
accepting data
timed out
accepting data
timed out
accepting data