网络编程 水深无声 2021-10-01 06:36 372阅读 0赞 当一台电脑中两个程序进行交互式,可以通过一个文件来交流: 故:同一台机器上的两个程序之间的通讯就需要依赖文件 如图: ![1419718-20180913203209927-697057863.png][] 当两台或者多台电脑进行交流时,可以通过交换机来进行交流。 故;两台机器之间的两个程序之间的通讯就需要依赖网络 ![1419718-20180913203515106-1701528424.png][] 当不在一台交换机上的两台电脑的交互时,需要用到路由器 ![1419718-20180913203759808-2058500642.png][] 交换机 :负责一个网络内的多台机器之间的信息交换 网卡 :身份证 mac地址 计算机在网络上的身份证 mac地址 :16进制的数 全球唯一 区域性 ip地址 4位的点分十进制数 IPV4 192.168.10.xxx IPV6 6位的点分十进制数 0.0.0.0.0.0 - 255.255.255.255.255.255 127.0.0.1 :本地回环地址 本机的地址 0.0.0.0 : ip地址的、回环地址的所有的用户都能找到你这台机器 局域网 网关ip 不同局域网之间通信依赖的ip地址 子网掩码 判断两个ip地址是否在同一个网段内 网段 局域网的概念 外网ip 我们谁都能访问 内网ip 从外部不能访问,只能在内部环境中互相访问 外网ip永远不会和内网ip冲突? 端口: 端口的概念 —— 帮助你找到一个应用 每一个网络服务都会占用计算机上的一个端口 计算机上的端口范围 0-65535 在同一时刻 同一台计算机上 不同的网络应用 占用的端口一定是不同的 osi七层模型 应用层 http、https 传输层 TCP、UDP协议 网络层 ip协议 数据链路层 arp协议 物理层 ![1419718-20180913205507643-1490733162.png][] ### 理解socket ### Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中, Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用 户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 ![1419718-20180913210014564-161884782.png][] **tcp协议与udp协议** tcp 面向连接的 可靠的 但是慢 tcp协议 两个应用之间要想通信 必须先建立连接 然后基于连接来通信 比较重要的文件 邮件的发送 下载安装包 udp 无连接的 快 能够发送的信息长度是有限的 快 但 不可靠 不能发送过长的数据 即时通讯类的程序 ![1419718-20180913210243342-2115745237.png][] socket的初始 基于tcp协议的socket的应用 Server段 import socket sk = socket.socket() # 初始化一个对象 sk.bind(('127.0.0.1',9000)) # 把地址绑定到socket sk.listen() # 监听链接 conn,addr = sk.accept() # 接受客户端链接 msg = conn.recv(1024) # 接受客户端信息 print(msg.decode('utf-8')) # 打印 conn.send('你好'.encode('utf-8')) # 向客户端发送信息 conn.close() # 关闭客户端 sk.close() # 关闭服务器 Client端 import socket sk = socket.socket() sk.connect(('127.0.0.1',9000)) sk.send('哈哈'.encode('utf-8')) msg = sk.recv(1024) print(msg.decode('utf-8')) sk.close() 基于UDP协议的socket应用 Server端 import socket sk = socket.socket(type = socket.SOCK_DGRAM) sk.bind(('127.0.0.1',9000)) msg,addr = sk.recvfrom(1024) print(addr,msg.decode('utf-8')) sk.sendto('再见'.encode('utf-8'),addr) sk.close() Client端 import socket sk = socket.socket(type= socket.SOCK_DGRAM) sk.sendto('你好'.encode('utf-8'),('127.0.0.1',9000)) msg,addr = sk.recvfrom(1024) print(addr,msg.decode('utf-8')) sk.close() 大文件的上传 Server端 import socket import time sk = socket.socket() sk.bind(('127.0.0.1',9000)) sk.listen() conn,addr = sk.accept() filename = conn.recv(1024) print('>>>',filename.decode('utf-8')) with open(filename,'wb') as f: countent = conn.recv(4096) f.write(countent) conn.close() sk.close() Client端 import socket import time sk = socket.socket() sk.connect(('127.0.0.1',9000)) sk.send('答案'.encode('utf-8')) time.sleep(0.1) with open('D:\骑士计划\第二次测试\答案','rb') as f: countent = f.read() print('大小>>>',len(countent)) sk.send(countent) sk.close() 大文件的下载 Server端 import os import socket sk = socket.socket() sk.bind(('127.0.0.1',9000)) sk.listen() conn,addr = sk.accept() # 先传文件名 file_path =r'D:\Users\Seus.mp4' filename = os.path.basename(file_path) conn.send(filename.encode('utf-8')) # 再传文件 file_size = os.path.getsize(file_path) with open(file_path,'rb') as f : while file_size: countent = f.read(1024) file_size -= len(countent) conn.send(countent) conn.close() sk.close() Client端 import socket # 下载 sk = socket.socket() sk.connect(('127.0.0.1',9000)) filename = sk.recv(1024) filename = filename.decode('utf-8') print('--->',filename) with open(filename,'wb') as f : while True: content = sk.recv(1024) if content: f.write(content) else: break sk.close() 时间的更新 Server端 import time import socket sk = socket.socket(type= socket.SOCK_DGRAM) sk.bind(('127.0.0.1',9001)) while True: msg,addr = sk.recvfrom(1024) fmt_time = time.strftime(msg.decode('utf-8')) sk.sendto(fmt_time.encode('utf-8'),addr) sk.close() # fmt_time = time.strftime('%Y-%m-%d %H:%M:%S') # print(fmt_time) # 这样可以得到格式化时间 Client端 import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.sendto('%Y-%m-%d %H:%M:%S'.encode('utf-8'),('127.0.0.1',9001)) msg,_ = sk.recvfrom(1024) print(msg.decode('utf-8')) sk.close() 解决粘包问题 Server端 import socket import struct sk = socket.socket() sk.bind(('127.0.0.1',9090)) sk.listen() conn,addr = sk.accept() while True: s = input('>>>').encode('utf-8') pack_num = struct.pack('i',len(s)) conn.send(pack_num) conn.send(s) conn.close() sk.close() Client端 import socket import struct sk = socket.socket() sk.connect(('127.0.0.1',9090)) while True: pack_num = sk.recv(4) num = struct.unpack('i',pack_num)[0] print(num) ret = sk.recv(num) print(ret.decode('utf-8')) sk.close() 转载于:https://www.cnblogs.com/youhongliang/p/9643316.html [1419718-20180913203209927-697057863.png]: /images/20210724/7e0a624dc0f14595bccb8114308b1584.png [1419718-20180913203515106-1701528424.png]: /images/20210724/fc4f1c17156e483487dd94fc93dfd1bb.png [1419718-20180913203759808-2058500642.png]: /images/20210724/215cad6f02f4437d9d5af0aaac314005.png [1419718-20180913205507643-1490733162.png]: /images/20210724/a0ddde6464434ff2a717ffc8f01cad4c.png [1419718-20180913210014564-161884782.png]: /images/20210724/22c7fd33028d4c2b97fd88fd7d141f68.png [1419718-20180913210243342-2115745237.png]: /images/20210724/046c685552544db59f7891f108715ffe.png
还没有评论,来说两句吧...