网络编程-TCP/UDP
基本概念
- IP地址:在互联网上定位一部计算机
- 192.168.000.000:局域网IP
- 127.0.0.1:指本机
- 端口:本机中各个软件的编码
- 范围0-65535
- 知名端口:预留端口,一般0-1023
- 非知名端口:不是预留端口,1024-65535
TCP/UDP协议
- SOCKET编程
- 通过IP加端口的定位方式,发送消息的机制
- socket(套接字):是一个网络通讯的端点,能实现不同主机的进程通信,网络大多基于socket通信
- 分为UDP和TCP
- 客户端CLIENT
- 服务器端SERVER
- TCP:安全的面向连接的传输
- 安全
- 速度慢
- UDP:非安全的不面向连接的传输
- 安全性差
- 大小限制65kb
- 没顺序
- 速度快
- 即使通讯一般用UDP
UDP编程
- Server端流程
- 建立socket,socket是负责具体通信的一个实例
- 绑定IP地址和PORT
- 接受对方发送内容
- 给对方反馈,非必须
- Client端流程
- 建立socket
- 发送内容到服务器
- 接受服务器给定的反馈内容
-服务器端
import socket
#建立socket连接
#socket.AF_INET(IPV4协议族)或AF_UNIX
#socket.SOCK_DGRAM(面向非链接UDP)或SOCK_STREAM(面向链接TCP)
s_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#地址为tuple类型
#此处用host = socket.gethostname()获取本机名代替127.0.0.1也可
addr = ("127.0.0.1", 9550)
s_sock.bind(addr)
#.recvfrom()返回的是一个tuple类型,第一个为接收内容,第二个为对方的地址
#参数值为缓冲区大小
#data是bytes格式,必须通过解码,才能得到str格式内容
js_data, df_addr = s_sock.recvfrom(500)
#解码data信息.decode()默认是utf-8编码
jm_data = js_data.decode("utf-8")
print(jm_data)
#要给对方发送的消息
fs_data = "你是谁啊?~~~"
#编码消息,接受的编码和发送的编码必须一致
bm_data = fs_data.encode("utf-8")
#发送编码
#.sendto()是UDP .send()是TCP
s_sock.sendto(bm_data, df_addr)
s_sock.close()
- 客户端
import socket
#建立连接
s_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#要发送的信息
fs_data = "你好啊~~"
#编码消息
bm_data = fs_data.encode("utf-8")
#发送信息
addr = ("127.0.0.1", 9550)
s_sock.sendto(bm_data, addr)
#接收消息
js_data, addr = s_sock.recvfrom(500)
#解码消息
jm_data = js_data.decode("utf-8")
print(jm_data)
s_sock.close()
TCP编程
- Server端的流程
- 建立socket,可以理解为只是负责接受对方请求
- 绑定端口及地址
- 监听接入的访问socket
- 接受访问的socket,可以理解为真正的建立连接
- 接收消息
- 给对方反馈,如果有必要
- 关闭链接
- Client端的流程
- 建立socket通信
- 请求和对方建立通路
- 发送信息
- 接收反馈,如果有必要
- 关闭链接
- 服务器端
import socket
s_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
addr = ("127.0.0.1", 9550)
s_sock.bind(addr)
s_sock.listen()
while True:
#接收客户端建立连接的请求,并建立通讯链路
#返回值 第一个为真正建立的链路 第二个为对方地址
rel_sock, addr = s_sock.accept()
#接收信息
#500是接收的最大数据量
js_data = rel_sock.recv(500)
#解码
jm_data = js_data.decode("utf-8")
print(jm_data, addr)
#编码
fs_data = "你是谁啊? ~~"
bm_data = fs_data.encode("utf-8")
#发送
rel_sock.send(bm_data)
rel_sock.close()
- 客户端
import socket
s_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#通过服务器的IP,和服务器建立连接
fwq_addr = ("127.0.0.1", 9550)
s_sock.connect(fwq_addr)
#编码信息
fs_data = "你好啊~~"
bm_data = fs_data.encode("utf-8")
#发送信息
s_sock.send(bm_data)
#接收信息
js_data = s_sock.recv(500)
#解码信息
jm_data = js_data.decode("utf-8")
print(jm_data)
s_sock.close()