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

时间:2017-11-29 22:26:14

标签: 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 = 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()

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()

1 个答案:

答案 0 :(得分:0)

您必须向客户端发送退出消息'q^'以关闭客户端。

警告: 不建议在socket中使用Unicode作为字符串编码。可以在服务器/客户端中接收部分Unicode字符,从而导致UnicodeDecodeError被提升。

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

<强> server.py:

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()

<强> 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()

    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()