python多线程套接字分段fau

2024-10-02 10:28:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在编写一个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函数) 然后我可以连接一个客户端脚本,关闭连接并再次打开它。你知道吗


Tags: selfclienttruehostportaddressdefsocket

热门问题