利用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()
STRIVE FOR PROGRESS,NOT FOR PERFECTION