网络编程
Posted jianxiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程相关的知识,希望对你有一定的参考价值。
两个运行中的程序如何传递信息,通过文件两台机器上的两个运行程序是如何传递信息,通过网络
网卡:是实际存在的硬件
mac地址: 每一块网卡都有一个全球唯一的mac地址
交换机:是连接多台机器的物理设备,只认识mac地址
- 交换机实现arp协议 - 单播 组播 广播 - 通过ip地址获取一台机器的mac地址
协议:两台物理机之间对发送内容,长度等的约束
网关:一个局域网的网络出口,访问局域网之外的区域都需要经过路由器和网关
路由器 :完成局域网与局域网之间的联系
- 能识别ip地址 - 网段 - 网关ip - 访问局域网外部服务器的一个出口ip
ip地址:在网上定位一台机器
- ipv4 - ipv6
port:在网上定位一台机器上的一个服务- 0---65535
tcp协议的特点
- 面向连接的 可靠 全双工通信
- 建立连接:三次握手
- 断开连接:四次挥手
- 建立连接后
- 发送每一条数据后都有回馈
- 为了保证数据的完整性,还有重传机制
- 长连接时:会一直占用双方的端口,对数据的长度没有限制
UDP协议
特点:
- 面向数据的 不可靠 无连接协议
- 可能会丢失数据
- 能够传递的数据的长度是有限的,与传输数据的设置有关
应用场景
- TCP 文件的上传下载(缓存视频,发送邮件)
- UDP 即使通信(QQ,微信)
osi五层协议 |
协议 |
物理设备 |
应用层 |
http https ftp smtp python代码 |
|
传输层 | tcp udp |
四层交换机、四层路由器 |
网络层 | ipv4/ipv5 | 三层交换机 路由器 |
数据链路层 | arp mac地址 | 网卡 交换机 |
物理层 |
socket 套接字
socket 历史
- 基于文件的同一台机器两个服务通信
- 基于网络的多台机器之间的多个服务通信
在python中socket模块完成了socket的功能
socket对于程序员来说,已经是网络操作的底层
tcp基本格式
server.py
import socket sk=socket.socket() #创建对象 sk.bind((‘127.0.0.1‘,9000)) #绑定关系 sk.listen() #监听连接 conn,addr=sk.accept() # 接受用户连接 ret=conn.recv(1024) # 接受客户信息 print(ret) conn.send(b‘hi‘) #发送客户信息 conn.close() sk.close()
client.py
import socket sk=socket.socket() #创建对象创建对象 sk.connect((‘127.0.0.1‘,9000)) #尝试连接服务 sk.send(b‘hello‘) ret=sk.recv(1024) #接受服务端信息 print(ret) sk.close()
修改版
server.py
import socket sk=socket.socket() sk.bind((‘127.0.0.1‘,9000)) sk.listen() print(‘**‘*20) while True: conn,addr=sk.accept() while True: ret=conn.recv(1024).decode(‘utf-8‘) if ret.upper() ==‘Q‘:break print(ret) inp=input(">>>:") conn.send(inp.encode(‘utf-8‘)) if inp.upper() ==‘Q‘:break conn.close() sk.close()
client.py
import socket sk=socket.socket() sk.connect((‘127.0.0.1‘,9000)) while True: inp=input(">>>:") sk.send(inp.encode(‘utf-8‘)) if inp.upper() ==‘Q‘:break ret=sk.recv(1024).decode(‘utf-8‘) if ret.upper() ==‘Q‘:break print(ret) sk.close()
UDP的基本用法
server.py
import socket sk=socket.socket(type=socket.SOCK_DGRAM) sk.bind((‘127.0.0.1‘,9000)) while True: msg,_addr=sk.recvfrom(1024) print(msg.decode(‘utf-8‘)) msg = input(‘>>>‘).encode(‘utf-8‘) sk.sendto(msg,_addr) sk.close()
client.py
import socket sk=socket.socket(type=socket.SOCK_DGRAM) while True: inp=input(‘>>>:‘).encode(‘utf-8‘) sk.sendto(inp,(‘127.0.0.1‘,9000)) ret=sk.recv(1024).decode(‘utf-8‘) print(ret) sk.close()
粘包问题
server.py
import struct import socket sk=socket.socket() sk.bind((‘127.0.0.1‘,9000)) sk.listen() conn,addr=sk.accept() ret=conn.recv(1024) print(ret) # 出现了粘包 #解决粘包 # byte_len=conn.recv(4) # size=struct.unpack(‘i‘,byte_len)[0] # msg1=conn.recv(size) # print(msg1) # byte_len=conn.recv(4) # size=struct.unpack(‘i‘,byte_len)[0] # msg2=conn.recv(size) # print(msg2) sk.close()
client.py
import struct import socket sk=socket.socket() sk.connect((‘127.0.0.1‘,9000)) sk.send(b‘helllo‘) sk.send(b‘word‘) #解决粘包 # msg=b‘helllo‘ # bytes_len=struct.pack(‘i‘,len(msg)) # sk.send(bytes_len) # sk.send(msg) # msg=b‘word‘ # bytes_len=struct.pack(‘i‘,len(msg)) # sk.send(bytes_len) # sk.send(msg) sk.close()
serversocket模块
server.py
import socketserver class Myserver(socketserver.BaseRequestHandler): def handle(self): # 自动触发了handle方法,并且self.request == conn msg = self.request.recv(1024).decode(‘utf-8‘) self.request.send(‘1‘.encode(‘utf-8‘)) msg = self.request.recv(1024).decode(‘utf-8‘) self.request.send(‘2‘.encode(‘utf-8‘)) msg = self.request.recv(1024).decode(‘utf-8‘) self.request.send(‘3‘.encode(‘utf-8‘)) server = socketserver.ThreadingTCPServer((‘127.0.0.1‘,9000),Myserver) server.serve_forever()
client.py
import socket import time sk = socket.socket() sk.connect((‘127.0.0.1‘,9000)) for i in range(3): sk.send(b‘hello,yuan‘) msg = sk.recv(1024) print(msg) time.sleep(1) sk.close()
以上是关于网络编程的主要内容,如果未能解决你的问题,请参考以下文章