python之socket编程
例子1:
service端:
"""file: service.pysocket service"""import socketimport threadingimport timeimport sysdef socket_service():try:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 防止socket server重启后端口被占用(socket.error: [Errno 98] Address already in use)s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)s.bind(('127.0.0.1', 6666))s.listen(10)except socket.error as msg:print(msg)sys.exit(1)print('Waiting connection...')while 1:conn, addr = s.accept()t = threading.Thread(target=deal_data, args=(conn, addr))t.start()def deal_data(conn, addr):print('Accept new connection from {0}'.format(addr))conn.send(('Hi, Welcome to the server!').encode())while 1:data = conn.recv(1024)print('{0} client send data is {1}'.format(addr, data.decode()))#b'\xe8\xbf\x99\xe6\xac\xa1\xe5\x8f\xaf\xe4\xbb\xa5\xe4\xba\x86'time.sleep(1)if data == 'exit' or not data:print('{0} connection close'.format(addr))conn.send(bytes('Connection closed!'),'UTF-8')breakconn.send(bytes('Hello, {0}'.format(data),"UTF-8"))#TypeError: a bytes-like object is required, not 'str'conn.close()if __name__ == '__main__':socket_service()import socketimport sysdef socket_client():try:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect(('127.0.0.1', 6666))except socket.error as msg:print(msg)sys.exit(1)print(s.recv(1024))#目的在于接受:Accept new connection from (...while 1:data = input('please input work: ').encode()s.send(data)print('aa',s.recv(1024))if data == 'exit':breaks.close()if __name__ == '__main__':socket_client()例子二:
###服务器端server.pyimport socketimport osimport sysimport structdef socket_service_image():try:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# s.bind(('127.0.0.1', 6666))s.bind(('127.0.0.1', 6666))s.listen(10)except socket.error as msg:print(msg)sys.exit(1)print("Wait for Connection.....................")while True:sock, addr = s.accept() # addr是一个元组(ip,port)deal_image(sock, addr)def deal_image(sock, addr):print("Accept connection from {0}".format(addr)) # 查看发送端的ip和端口while True:fileinfo_size = struct.calcsize('128sq')print('fileinfo_size is',fileinfo_size)buf = sock.recv(fileinfo_size) # 接收图片名print('buf is ',buf)if buf:filename, filesize = struct.unpack('128sq', buf)print('filename ,filesize is',filename.decode(),filesize )fn = filename.decode().strip('\x00')print('fn is ',fn)new_filename = os.path.join('./','new_' + fn) # 在服务器端新建图片名(可以不用新建的,直接用原来的也行,只要客户端和服务器不是同一个系统或接收到的图片和原图片不在一个文件夹下)recvd_size = 0fp = open(new_filename, 'wb')while not recvd_size == filesize:if filesize - recvd_size > 1024:data = sock.recv(1024)recvd_size += len(data)else:data = sock.recv(1024)recvd_size = filesizeprint('data is',data)fp.write(data) # 写入图片数据fp.close()sock.close()breakif __name__ == '__main__':socket_service_image()'''Fuction:客户端发送图片和数据Date:Author:mxh'''###客户端client.pyimport socketimport osimport sysimport structdef sock_client_image():while True:try:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect(('127.0.0.1', 6666)) # 服务器和客户端在不同的系统或不同的主机下时使用的ip和端口,首先要查看服务器所在的系统网卡的ip# s.connect(('127.0.0.1', 6666)) #服务器和客户端都在一个系统下时使用的ip和端口except socket.error as msg:print(msg)print(sys.exit(1))filepath = input('input the file: ') # 输入当前目录下的图片名 xxx.jpgfhead = struct.pack(b'128sq', bytes(os.path.basename(filepath), encoding='utf-8'),os.stat(filepath).st_size) # 将xxx.jpg以128sq的格式打包s.send(fhead)fp = open(filepath, 'rb') # 打开要传输的图片while True:data = fp.read(1024) # 读入图片数据if not data:print('{0} send over...'.format(filepath))breaks.send(data) # 以二进制格式发送图片数据s.close()# break #循环发送if __name__ == '__main__':sock_client_image()IO多路复用
服务端:sk1 = socket.socket()sk1.bind(("127.0.0.1",8001))sk1.listen()inpu = [sk1,]while True:r_list,w_list,e_list = select.select(inpu,[],[],1)for sk in r_list:if sk == sk1:conn,address = sk.accept()inpu.append(conn)else:try:ret = str(sk.recv(1024),encoding="utf-8")sk.sendall(bytes(ret+"hao",encoding="utf-8"))except Exception as ex:inpu.remove(sk)客户端import socketobj = socket.socket()obj.connect(('127.0.0.1',8001))while True:inp = input("Please(q\退出):\n>>>")obj.sendall(bytes(inp,encoding="utf-8"))if inp == "q":breakret = str(obj.recv(1024),encoding="utf-8")print(ret)服务端:import socketsk1 = socket.socket()sk1.bind(("127.0.0.1",8001))sk1.listen()inputs = [sk1]import selectmessage_dic = {}outputs = []while True:r_list, w_list, e_list = select.select(inputs,[],inputs,1)print("正在监听的socket对象%d" % len(inputs))print(r_list)for sk1_or_conn in r_list:if sk1_or_conn == sk1:conn,address = sk1_or_conn.accept()inputs.append(conn)message_dic[conn] = []else:try:data_bytes = sk1_or_conn.recv(1024)data_str = str(data_bytes,encoding="utf-8")sk1_or_conn.sendall(bytes(data_str+"好",encoding="utf-8"))except Exception as ex:inputs.remove(sk1_or_conn)else:data_str = str(data_bytes,encoding="utf-8")message_dic[sk1_or_conn].append(data_str)outputs.append(sk1_or_conn)for conn in w_list:recv_str = message_dic[conn][0]del message_dic[conn][0]conn.sendall(bytes(recv_str+"好",encoding="utf-8"))for sk in e_list:inputs.remove(sk)客户端:import socketobj = socket.socket()obj.connect(('127.0.0.1',8001))while True:inp = input("Please(q\退出):\n>>>")obj.sendall(bytes(inp,encoding="utf-8"))if inp == "q":breakret = str(obj.recv(1024),encoding="utf-8")print(ret)
目录 返回
首页
