ĐẾN một vấn đề tương tự ở đây error: [Errno 10053]
Tôi cũng đã cố gắng điều tương tự và có những lỗi tương tự.
Nếu có một mã đơn giản như thế này để chứng minh lỗi này:
import socket
host = 'localhost'
port = 5001
size = 102400
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
for msg in ['Hello, world','Test','anything goes here']:
s.send(msg)
data = s.recv(size)
print 'Received:', data
s.close()
Nếu bạn tạo một đối tượng ổ cắm và amt nó có thể gửi và echo lại từ máy chủ để xem có bao nhiêu nó thu, nếu bạn thay đổi điều đó, nói 1024 đến 102400 (trong mã này); Có nghĩa là các ổ cắm không nên đóng cửa nhưng một lần nữa trong hệ điều hành Windows của tôi, phía máy chủ tiếp tục nghe và in bất kỳ dữ liệu mà khách hàng gửi nhưng ở phía khách hàng bạn nhận được lỗi này;
Tuy nhiên, nếu khách hàng chỉ có thể kết nối một lần và gửi và nhận chỉ một lần thì đó là cách thiết kế được thiết kế. Thử công trình này mà không có bất kỳ lỗi nào:
for msg in ['Hello, world','Test','anything goes here']:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.send(msg)
data = s.recv(size)
s.close()
print 'Received:', data
Tôi không chắc chắn nếu một đối tượng socket chỉ hoạt động một lần để gửi và nhận dữ liệu.
CẬP NHẬT Tôi nghĩ rằng vấn đề là dung lượng trên mỗi ổ cắm máy khách để nhận dữ liệu theo vùng đệm được cố định; Đó là lý do tại sao đoạn mã thứ hai ở trên hoạt động, do đó tạo các ổ cắm kết nối máy khách mới trên máy chủ. Nhưng cách đó rất nhiều ổ cắm sẽ được sử dụng hết.
Thay vào đó, mã sau đã khắc phục sự cố đó bằng cách kiểm tra kích thước đang được sử dụng hết. Nếu nó vượt quá số tiền nhất định, nó sẽ tạo một ổ cắm mới tại máy khách nhưng đảm bảo rằng thông báo được gửi; Trên thực tế vấn đề là với mã máy chủ nhưng cố định nó.
kích thước = 10
Đây là cách nhanh chóng để thử mã. Tôi chắc chắn bạn sẽ hiểu và tối ưu hóa nó cho tốt hơn!
mã khách hàng:
messag = ['Hello, world', 'Test', 'anything goes here']
def client_to_server(messag,host,port,size):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
countmsg = 0
restmsg = ''
for msg in messag:
strl = tmsg = msg
if len(restmsg):
tmsg = restmsg + ' ' + msg
countmsg = len(tmsg)
if countmsg <= size:
pass
else:
restmsg = tmsg[size:]
tmsg = tmsg[:size]
#s.close()
countmsg = len(tmsg)
#s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#s.connect((host, port))
print 'Sending to server msg {}'.format(tmsg)
s.send(tmsg)
# s.settimeout(1)
try:
data = s.recv(size)
print 'Received:', data
if strl == data:
print strl,data
countmsg = 0
restmsg = ''
except (socket.error), e:
print e.args,e.message
s.close()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.close()
if restmsg:
client_to_server([restmsg],host,port,size)
return
client_to_server(messag,host,port,size)
server Code:
size = 1024 #This has to be bigger than client buf size!
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(backlog)
while True:
#this is what accepts and creates a P2P dedicated client socket per socket
client, address = s.accept()
try:
data = client.recv(size)
while data or 0:
print "Client sent {} | Server sending data to client address {}".format(data, address)
client.send(data)
data = client.recv(size)
else: client.close()
except (socket.error), e:
client.close()
print e.args, e.message
Hãy thử nó ra. Điều này sử dụng cùng một ổ cắm.
điều này có thể giúp: http://stackoverflow.com/a/20421867/2290820 – user2290820