利用Python编写TCP客户端以及多线程TCP服务器端

服务器端代码:

import socket
import json
import sys
import optparse
import threading

class TCPServer:
    def __init__(self,port):
        self.port = port
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.bind(('', self.port))
        self.server_socket.listen(5)
        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        print("Waiting for connection")
    

    def reliable_send(self, client_socket, data):
        json_data = json.dumps(data)
        client_socket.send(json_data.encode('utf-8'))
    
    def reliable_recv(self,client_socket):
        received_data = ""
        while True:
            try:
                received_data = received_data + client_socket.recv(1024).decode('utf-8')
                return json.loads(received_data)
            except ValueError:
                continue
    

    def client_handler(self,client_socket):
        while True:
            recv_data = self.reliable_recv(client_socket)
            print(recv_data)
            if recv_data.strip() == 'q':
                break
            send_data = input("#~ ")
            self.reliable_send(client_socket,send_data)


    
    def run(self):
        while True:
            
            client_socket, client_address = self.server_socket.accept()
            print("Connected from %s:%d" % (client_address[0], client_address[1]))
            t = threading.Thread(target=self.client_handler, args=(client_socket,))
            t.start()

def get_params():
    parser = optparse.OptionParser('Usage: <Program>  -p port')
    parser.add_option('-p','--port', dest='port', type='int', help='Specify port')
    options, args = parser.parse_args()
    if options.port is None:
        print(parser.usage)
        sys.exit(0)
    return options.port


def banner():
    banner = """
        ******************************************************************
        ******************************************************************
                         Mulithread TCP Server by Jason Wong V1.0
        ******************************************************************
        ******************************************************************
    """
    print(banner)


if __name__ == "__main__":
    banner()
    port = get_params()
    tcp_server = TCPServer(port)
    tcp_server.run()

客户端代码:

import socket
import json
import sys
import optparse

class UDPClient:
    def __init__(self, target, port):
        self.target = target
        self.port = port
        self.client_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        print("Connecting to TCP server: %s %d" % (self.target, self.port))
        self.client_s.connect((self.target, self.port))

    def reliable_send(self, data):
        json_data = json.dumps(data)
        self.client_s.send(json_data.encode('utf-8'))
    
    def reliable_recv(self):
        received_data = ""
        while True:
            try:
                received_data = received_data + self.client_s.recv(1024).decode('utf-8')
                return json.loads(received_data)
            except ValueError:
                continue
            

    def run(self):
        while True:
            command = input("$~ ")
            self.reliable_send(command)
            if command == 'q':
                break
            print(self.reliable_recv())
        self.client_s.close()


def get_params():
    parser = optparse.OptionParser('Usage: <Program> -t target -p port')
    parser.add_option('-t', '--target', dest='target', type="string", help="Specify IP address of target")
    parser.add_option('-p','--port', dest='port', type='int', help='Specify port')
    options, args = parser.parse_args()
    if options.target is None or options.port is None:
        print(parser.usage)
        sys.exit(0)
    return options.target, options.port


def banner():
    banner = """
        ******************************************************************
        ******************************************************************
                          TCP Client by Jason Wong V1.0
        ******************************************************************
        ******************************************************************
    """
    print(banner)


if __name__ == "__main__":
    banner()
    target, port  = get_params()
    udpclient = UDPClient(target, port)
    udpclient.run()

 

posted @ 2022-05-01 13:28  Jason_huawen  阅读(467)  评论(0编辑  收藏  举报