1在socket中怎么实现一个服务器端同时跟好几个客服端进行通信呢,在socketserver中实现了socket+并发的功能
#------服务器端-------
import socketserver
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
print ("服务端启动...")
while True:
conn = self.request
print (self.client_address)
while True:
client_data=conn.recv(1024)
print (str(client_data,"utf8"))
print ("waiting...")
server_response=input(">>>")
conn.sendall(bytes(server_response,"utf8"))
# conn.sendall(client_data)
conn.close()
# print self.request,self.client_address,self.server
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1',8098),MyServer)
server.serve_forever()
#----客户端------ import socket ip_port = ('127.0.0.1',8098) sk = socket.socket() sk.connect(ip_port) print ("客户端启动:") while True: inp = input('>>>') sk.sendall(bytes(inp,"utf8")) server_response=sk.recv(1024) print (str(server_response,"utf8")) if inp == 'exit': break sk.close()
2、利用socket实现文件的上传和下载
import socket import struct import json import subprocess import os class MYTCPServer: address_family = socket.AF_INET socket_type = socket.SOCK_STREAM allow_reuse_address = False max_packet_size = 8192 coding = 'utf-8' request_queue_size = 5 server_dir = 'file_upload' def __init__(self, server_address, bind_and_activate=True): """Constructor. May be extended, do not override.""" self.server_address = server_address self.socket = socket.socket(self.address_family, self.socket_type) if bind_and_activate: try: self.server_bind() self.server_activate() except: self.server_close() raise def server_bind(self): """Called by constructor to bind the socket. """ if self.allow_reuse_address: self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.socket.bind(self.server_address) self.server_address = self.socket.getsockname() def server_activate(self): """Called by constructor to activate the server. """ self.socket.listen(self.request_queue_size) def server_close(self): """Called to clean-up the server. """ self.socket.close() def get_request(self): """Get the request and client address from the socket. """ return self.socket.accept() def close_request(self, request): """Called to clean up an individual request.""" request.close() def run(self): while True: self.conn, self.client_addr = self.get_request() print('from client ', self.client_addr) while True: try: head_struct = self.conn.recv(4) if not head_struct: break head_len = struct.unpack('i', head_struct)[0] head_json = self.conn.recv(head_len).decode(self.coding) head_dic = json.loads(head_json) # print(head_dic) # head_dic={'cmd':'put','filename':'a.txt','filesize':123123} cmd = head_dic['cmd'] if hasattr(self, cmd): func = getattr(self, cmd) func(head_dic) except Exception: break # {'cmd': cmd, 'filename': os.path.basename(filename), 'filesize': None,'message':None} def get(self,args): file_path = os.path.normpath(os.path.join( self.server_dir, args['filename'] )) print('文件的位置',os.path.abspath(file_path)) if not os.path.exists(file_path): args['message'] = 'file not exists' else: filesize = os.path.getsize(file_path) args['filesize'] = filesize print(args) head_json = json.dumps(args) head_json_bytes = bytes(head_json, encoding=self.coding) head_struct = struct.pack('i', len(head_json_bytes)) self.conn.send(head_struct) self.conn.send(head_json_bytes) if args['message'] : print('下载文件不存在,请重新输入') return send_size = 0 with open(file_path, 'rb') as f: for line in f: self.conn.send(line) send_size += len(line) else: print('down successful') print('发送文件的大小', send_size) def put(self, args): file_path = os.path.normpath(os.path.join( self.server_dir, args['filename'] )) print('文件存储的位置',os.path.abspath(file_path)) filesize = args['filesize'] recv_size = 0 print('----->', file_path) with open(file_path, 'wb') as f: while recv_size < filesize: recv_data = self.conn.recv(self.max_packet_size) f.write(recv_data) recv_size += len(recv_data) print('recvsize:%s filesize:%s' % (recv_size, filesize)) tcpserver1 = MYTCPServer(('127.0.0.1', 8080)) tcpserver1.run()
import socket import struct import json import os class MYTCPClient: address_family = socket.AF_INET socket_type = socket.SOCK_STREAM allow_reuse_address = False max_packet_size = 8192 coding = 'utf-8' request_queue_size = 5 def __init__(self, server_address, connect=True): self.server_address = server_address self.socket = socket.socket(self.address_family, self.socket_type) if connect: try: self.client_connect() except: self.client_close() raise def client_connect(self): self.socket.connect(self.server_address) def client_close(self): self.socket.close() def run(self): while True: inp = input(">>: ").strip() if not inp: continue l = inp.split() cmd = l[0] if hasattr(self, cmd): func = getattr(self, cmd) func(l) def get(self,args): cmd = args[0] filename = args[1] if os.path.isfile(filename): print('file:%s 已经存在' % filename) return head_dic = {'cmd': cmd, 'filename': os.path.basename(filename), 'filesize': None,'message':None} head_json = json.dumps(head_dic) head_json_bytes = bytes(head_json, encoding=self.coding) head_struct = struct.pack('i', len(head_json_bytes)) self.socket.send(head_struct) self.socket.send(head_json_bytes) head_struct = self.socket.recv(4) head_len = struct.unpack('i', head_struct)[0] head_json = self.socket.recv(head_len).decode(self.coding) head_dic = json.loads(head_json) print(head_dic) recv_size = 0 print('----->', filename) filesize = head_dic['filesize'] if filesize: with open(filename, 'wb') as f: while recv_size < filesize: recv_data = self.socket.recv(self.max_packet_size) f.write(recv_data) recv_size += len(recv_data) print('recvsize:%s filesize:%s' % (recv_size, filesize)) print('down successful') else: print(head_dic['message']) return def put(self, args): cmd = args[0] filename = args[1] if not os.path.isfile(filename): print('file:%s is not exists' % filename) return else: filesize = os.path.getsize(filename) head_dic = {'cmd': cmd, 'filename': os.path.basename(filename), 'filesize': filesize} print(head_dic) head_json = json.dumps(head_dic) head_json_bytes = bytes(head_json, encoding=self.coding) head_struct = struct.pack('i', len(head_json_bytes)) self.socket.send(head_struct) self.socket.send(head_json_bytes) send_size = 0 with open(filename, 'rb') as f: for line in f: self.socket.send(line) send_size += len(line) print(send_size) else: print('upload successful') client = MYTCPClient(('127.0.0.1', 8080)) client.run()
人生苦短,我用cnblog