简体   繁体   English

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

[英]Server Loop Using Python Sockets and Threading module

I am making server-client communication in python using sockets and threading module. 我正在使用套接字和线程模块在python中进行服务器-客户端通信。 I connect client to server, send some data, receive some data, but the problem is, I can send only two messages. 我将客户端连接到服务器,发送一些数据,接收一些数据,但是问题是,我只能发送两条消息。 After those, the server is not reciving my packets. 在那之后,服务器不再接收我的数据包。 Can someone tell me what's wrong? 有人可以告诉我怎么了吗? Thanks in advance. 提前致谢。

Server.py: 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 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()

You have to send exit message 'q^' to client too to close client. 您也必须向客户端发送退出消息'q^'以关闭客户端。

Warning: Using Unicode as encoding for string is not recommended in socket. 警告:不建议在套接字中使用Unicode作为字符串编码。 A partial Unicode character may be received in server/client resulting in UnicodeDecodeError being raised. 服务器/客户端中可能会接收到部分Unicode字符,从而引发UnicodeDecodeError

Code for server using threads is: 服务器使用线程的代码是:

server.py: 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: 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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM