我目前正在编写一个python套接字服务器,它工作正常,但有一个大问题:
首先是代码
import socket
import threading
class ThreadedServer(object):
def __init__(self, host, port):
self.host = host
self.port = port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
self.sock.bind((self.host, self.port))
def listen(self):
self.sock.listen(6)
while True:
client, address = self.sock.accept()
client.settimeout(20)
threading.Thread(target=self.listenToClient, args=(client, address)).start()
def listenToClient(self, client, address):
size = 1024
while True:
try:
data = client.recv(size)
if data:
response = data
client.send(response)
print(response)
else:
raise
except:
client.close()
return False
if __name__ == "__main__":
while True:
port_num = input("Port: ")
try:
port_num = int(port_num)
break
except ValueError:
pass
ThreadedServer(ipaddress, port_num).listen()
关键是要有一个socket服务器,可以同时监听多个客户机。你知道吗
虽然我可以用另一个python程序连接到这个套接字,但是一旦插座关闭()命令发出或客户端程序退出。你知道吗
分段故障(堆芯倾倒)
我假设问题出在python代码的多线程处理上,但是不幸的是,我无法确定我必须做哪些更改才能阻止客户端关闭套接字或退出客户端程序。许多stackoverflow答案都是直接指向C,而不是python。你知道吗
任何想法都将不胜感激
更新:
将listen函数重写为:
def listen(self):
# self.sock.listen(6)
while True:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind((self.host, self.port))
self.sock.listen(6)
client, address = self.sock.accept()
client.settimeout(20)
threading.Thread(target=self.listenToClient, args=(client, address)).start()
不幸的是没有帮助
更新2:
在单个线程中运行进程是有效的(意思是:我替换穿线。穿线(只需调用listenToClient函数) 然后我可以连接一个客户端脚本,关闭连接并再次打开它。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐