网络编程:
a.软件
客户端:CS架构 client-->server
浏览器:BS架构 brower-->server
b.如何实现相互通信
需求1:编写两个软件,软件之间相互通信。
需求2:两个人直接连接(网线)
需求3:教室相互通信(交换机)
总结:
1.相互通信本质发送010101010101
2.交换机作用
3.通过ipconfig查看自己的内网IP
4.公网IP,掏钱。
连接实例:
服务端:
import socket #帮助完成网络通信的模块 # 创建服务端socket对象 server = socket.socket() # 绑定IP和端口 server.bind(('192.168.13.155',8000)) # 后边可以等5个人 server.listen(5) # 等待客户端来连接,如果没人来就傻傻的等待。 # conn是客户端和服务端连接的对象(伞),服务端以后要通过该对象进行收发数据。 # addr是客户端的地址信息。 conn,addr = server.accept() # ##############################阻塞 # 通过对象去获取(xxx通过伞给我发送的消息 # 1024表示:服务端通过(伞)获取数据时,一次性最多拿1024字节。 data = conn.recv(1024) print(data) # 服务端通过连接对象(伞)给客户端回复了一个消息。 conn.send(b'stop') # 与客户端断开连接(放开伞) conn.close() # 关闭服务端的服务 server.close()
客户端:
import socket client = socket.socket() # xxx相服务端发起连接请求 # 阻塞,去连接,直接连接成功后才会继续向下走 client.connect(('192.168.13.155',8000)) # 连接上服务端后,相服务端发送消息 client.send(b'hello') # 王晓东等待服务端给他发送消息 data = client.recv(1024) print(data) # 关闭自己 client.close()
文件传输实例:
客户端
import socket import os import json #连接服务端 sock = socket.socket() sock.connect(('127.0.0.1',8800)) while 1: #输入指令 cmd = input('输入命令>>') # put 111.jpg action,filename = cmd.strip().split(' ') #获取文件大小 filesize = os.path.getsize(filename) #编译文件信息字典 file_info = {'action':action, 'filename':filename, 'filesize':filesize, } #将文件信息序列化并传输给服务端 file_info_json = json.dumps(file_info).encode('utf8') sock.send(file_info_json) # 确认服务端接受到了文件信息 code = sock.recv(1024).decode('utf8') if code == '200': # 发送文件数据 with open(filename,'rb') as f: for line in f: sock.send(line) else: print('服务器异常')
服务端
import socket import json #建立服务端连接 sock = socket.socket() sock.bind(('127.0.0.1',8800)) sock.listen(5) while 1: #客户端连接成功打印信息 print('server is working...') conn,addr = sock.accept() while 1: #接受客户端发送的文件信息 data = conn.recv(1024).decode('utf8') file_info = json.loads(data) print('file_info',file_info) # 获得文件信息,并获取字典内对应值 action = file_info.get('action') filename = file_info.get('filename') filesize = file_info.get('filesize') conn.send(b'200') # 接收文件数据 with open('put/'+filename,'wb') as f: recv_data_length = 0 while recv_data_length < filesize: data = conn.recv(1024) recv_data_length += len(data) f.write(data) print('文件总大小:%s,已成功接收%s'%(filesize,recv_data_length)) print('接收成功')
sockerserver模块
#客户端 import socket sk = socket.socket() sk.connect(('127.0.0.1',8899)) while 1: name = input(">>>>:") sk.send(name.encode('utf-8')) # 字节 response = sk.recv(1024) # 字节 print(response.decode('utf-8'))
服务端 import socketserver class Myserver(socketserver.BaseRequestHandler): def handle(self): # 字节类型 while 1: # 针对window系统 try: print("等待信息") data = self.request.recv(1024) # 阻塞 # 针对linux if len(data) == 0: break if data == b'exit': break response = data + b'SB' self.request.send(response) except Exception as e: break self.request.close() # 1 创建socket对象 2 self.socket.bind() 3 self.socket.listen(5) server=socketserver.ForkingUDPServer(("127.0.0.1",8899),Myserver) server.serve_forever()