使用Python套接字和线程模块的服务器循环

使用Python套接字和线程模块的服务器循环,python,multithreading,sockets,Python,Multithreading,Sockets,我使用套接字和线程模块在python中进行服务器-客户机通信。我将客户端连接到服务器,发送一些数据,接收一些数据,但问题是,我只能发送两条消息。之后,服务器就不再接收我的数据包了。有人能告诉我怎么了吗?提前谢谢 Server.py: import socket from threading import Thread class Server: def __init__(self): self.host = '127.0.0.1' self.port

我使用套接字和线程模块在python中进行服务器-客户机通信。我将客户端连接到服务器,发送一些数据,接收一些数据,但问题是,我只能发送两条消息。之后,服务器就不再接收我的数据包了。有人能告诉我怎么了吗?提前谢谢

Server.py:

import socket
from threading import Thread


class Server:
    def __init__(self):
        self.host = '127.0.0.1'
        self.port = 9999
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind((self.host, self.port))
        self.server.listen(5)
        self.threads = []

        self.listen_for_clients()

    def listen_for_clients(self):
        print('Listening...')
        while True:
            client, addr = self.server.accept()
            print('Accepted Connection from: '+str(addr[0])+':'+str(addr[1]))
            self.threads.append(Thread(target=self.handle_client, args=(client, addr)))
            for thread in self.threads:
                thread.start()

    def handle_client(self, client_socket, address):
        client_socket.send('Welcome to server'.encode())
        size = 1024
        while True:
            message = client_socket.recv(size)
            if message.decode() == 'q^':
                print('Received request for exit from: '+str(address[0])+':'+str(address[1]))
                break
            else:
                print('Received: '+message.decode()+' from: '+str(address[0])+':'+str(address[1]))

        client_socket.send('Received request for exit. Deleted from server threads'.encode())
        client_socket.close()

if __name__=="__main__":
    main = Server()
import socket
from threading import Thread


class Server:
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind((self.host, self.port))
        self.server.listen(5)

    def listen_for_clients(self):
        print('Listening...')
        while True:
            client, addr = self.server.accept()
            print(
                'Accepted Connection from: ' + str(addr[0]) + ':' + str(addr[1])
            )
            Thread(target=self.handle_client, args=(client, addr)).start()

    def handle_client(self, client_socket, address):
        size = 1024
        while True:
            try:
                data = client_socket.recv(size)
                if 'q^' in data.decode():    
                    print('Received request for exit from: ' + str(
                        address[0]) + ':' + str(address[1]))
                    break

                else:
                    # send getting after receiving from client
                    client_socket.sendall('Welcome to server'.encode())

                    print('Received: ' + data.decode() + ' from: ' + str(
                        address[0]) + ':' + str(address[1]))

            except socket.error:
                client_socket.close()
                return False

        client_socket.sendall(
            'Received request for exit. Deleted from server threads'.encode()
        )

        # send quit message to client too
        client_socket.sendall(
            'q^'.encode()
        )
        client_socket.close()


if __name__ == "__main__":
    host = '127.0.0.1'
    port = 9999
    main = Server(host, port)
    # start listening for clients
    main.listen_for_clients()
import socket
import sys, time


def main():
    target_host = '127.0.0.1'
    target_port = 9999

    try:
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error:
        print('Could not create a socket')
        time.sleep(1)
        sys.exit()

    try:
        client.connect((target_host, target_port))
    except socket.error:
        print('Could not connect to server')
        time.sleep(1)
        sys.exit()

    online = True
    while online:
        data = input()
        client.sendall(data.encode())
        while True:
            message = client.recv(4096)
            if 'q^' in message.decode():
                client.close()
                online = False
                break

            print('[+] Received: ' + message.decode())
            break  # stop receiving


# start client
main()
Client.py

import socket
import sys, time

def main():
    target_host = '127.0.0.1'
    target_port = 9999

    try:
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error:
        print('Could not create a socket')
        time.sleep(1)
        sys.exit()

    try:
        client.connect((target_host, target_port))
    except socket.error:
        print('Could not connect to server')
        time.sleep(1)
        sys.exit()

    while True:
        data = input()
        client.send(data.encode())
        message = client.recv(4096)
        print('[+] Received: '+ message.decode())

main()

您还必须向客户端发送退出消息
'q^'
,才能关闭客户端

警告: 不建议在套接字中使用Unicode作为字符串编码。服务器/客户端中可能会接收到部分Unicode字符,导致引发
UnicodeDecodeError

使用线程的服务器代码为:

server.py:

import socket
from threading import Thread


class Server:
    def __init__(self):
        self.host = '127.0.0.1'
        self.port = 9999
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind((self.host, self.port))
        self.server.listen(5)
        self.threads = []

        self.listen_for_clients()

    def listen_for_clients(self):
        print('Listening...')
        while True:
            client, addr = self.server.accept()
            print('Accepted Connection from: '+str(addr[0])+':'+str(addr[1]))
            self.threads.append(Thread(target=self.handle_client, args=(client, addr)))
            for thread in self.threads:
                thread.start()

    def handle_client(self, client_socket, address):
        client_socket.send('Welcome to server'.encode())
        size = 1024
        while True:
            message = client_socket.recv(size)
            if message.decode() == 'q^':
                print('Received request for exit from: '+str(address[0])+':'+str(address[1]))
                break
            else:
                print('Received: '+message.decode()+' from: '+str(address[0])+':'+str(address[1]))

        client_socket.send('Received request for exit. Deleted from server threads'.encode())
        client_socket.close()

if __name__=="__main__":
    main = Server()
import socket
from threading import Thread


class Server:
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind((self.host, self.port))
        self.server.listen(5)

    def listen_for_clients(self):
        print('Listening...')
        while True:
            client, addr = self.server.accept()
            print(
                'Accepted Connection from: ' + str(addr[0]) + ':' + str(addr[1])
            )
            Thread(target=self.handle_client, args=(client, addr)).start()

    def handle_client(self, client_socket, address):
        size = 1024
        while True:
            try:
                data = client_socket.recv(size)
                if 'q^' in data.decode():    
                    print('Received request for exit from: ' + str(
                        address[0]) + ':' + str(address[1]))
                    break

                else:
                    # send getting after receiving from client
                    client_socket.sendall('Welcome to server'.encode())

                    print('Received: ' + data.decode() + ' from: ' + str(
                        address[0]) + ':' + str(address[1]))

            except socket.error:
                client_socket.close()
                return False

        client_socket.sendall(
            'Received request for exit. Deleted from server threads'.encode()
        )

        # send quit message to client too
        client_socket.sendall(
            'q^'.encode()
        )
        client_socket.close()


if __name__ == "__main__":
    host = '127.0.0.1'
    port = 9999
    main = Server(host, port)
    # start listening for clients
    main.listen_for_clients()
import socket
import sys, time


def main():
    target_host = '127.0.0.1'
    target_port = 9999

    try:
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error:
        print('Could not create a socket')
        time.sleep(1)
        sys.exit()

    try:
        client.connect((target_host, target_port))
    except socket.error:
        print('Could not connect to server')
        time.sleep(1)
        sys.exit()

    online = True
    while online:
        data = input()
        client.sendall(data.encode())
        while True:
            message = client.recv(4096)
            if 'q^' in message.decode():
                client.close()
                online = False
                break

            print('[+] Received: ' + message.decode())
            break  # stop receiving


# start client
main()
client.py:

import socket
from threading import Thread


class Server:
    def __init__(self):
        self.host = '127.0.0.1'
        self.port = 9999
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind((self.host, self.port))
        self.server.listen(5)
        self.threads = []

        self.listen_for_clients()

    def listen_for_clients(self):
        print('Listening...')
        while True:
            client, addr = self.server.accept()
            print('Accepted Connection from: '+str(addr[0])+':'+str(addr[1]))
            self.threads.append(Thread(target=self.handle_client, args=(client, addr)))
            for thread in self.threads:
                thread.start()

    def handle_client(self, client_socket, address):
        client_socket.send('Welcome to server'.encode())
        size = 1024
        while True:
            message = client_socket.recv(size)
            if message.decode() == 'q^':
                print('Received request for exit from: '+str(address[0])+':'+str(address[1]))
                break
            else:
                print('Received: '+message.decode()+' from: '+str(address[0])+':'+str(address[1]))

        client_socket.send('Received request for exit. Deleted from server threads'.encode())
        client_socket.close()

if __name__=="__main__":
    main = Server()
import socket
from threading import Thread


class Server:
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind((self.host, self.port))
        self.server.listen(5)

    def listen_for_clients(self):
        print('Listening...')
        while True:
            client, addr = self.server.accept()
            print(
                'Accepted Connection from: ' + str(addr[0]) + ':' + str(addr[1])
            )
            Thread(target=self.handle_client, args=(client, addr)).start()

    def handle_client(self, client_socket, address):
        size = 1024
        while True:
            try:
                data = client_socket.recv(size)
                if 'q^' in data.decode():    
                    print('Received request for exit from: ' + str(
                        address[0]) + ':' + str(address[1]))
                    break

                else:
                    # send getting after receiving from client
                    client_socket.sendall('Welcome to server'.encode())

                    print('Received: ' + data.decode() + ' from: ' + str(
                        address[0]) + ':' + str(address[1]))

            except socket.error:
                client_socket.close()
                return False

        client_socket.sendall(
            'Received request for exit. Deleted from server threads'.encode()
        )

        # send quit message to client too
        client_socket.sendall(
            'q^'.encode()
        )
        client_socket.close()


if __name__ == "__main__":
    host = '127.0.0.1'
    port = 9999
    main = Server(host, port)
    # start listening for clients
    main.listen_for_clients()
import socket
import sys, time


def main():
    target_host = '127.0.0.1'
    target_port = 9999

    try:
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error:
        print('Could not create a socket')
        time.sleep(1)
        sys.exit()

    try:
        client.connect((target_host, target_port))
    except socket.error:
        print('Could not connect to server')
        time.sleep(1)
        sys.exit()

    online = True
    while online:
        data = input()
        client.sendall(data.encode())
        while True:
            message = client.recv(4096)
            if 'q^' in message.decode():
                client.close()
                online = False
                break

            print('[+] Received: ' + message.decode())
            break  # stop receiving


# start client
main()

对于self.threads中的线程:
每次服务器从客户端获得连接时,都会启动self.threads中的线程。这不是你想要的。使用这个:
Thread(target=self.handle\u client,args=(client,addr)).start()
@xaav我早就用过了,希望for循环能改变一些东西。