网络编程
- 网络:
- 网络协议:一套规则
- 网络模型:
- 七层模型
- 物理层:网线,水晶头等
- 数据链路层:
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
- 四层模型- 时间应用
- 链路层
- 网络
- 传输层
- 应用层
- 七层模型
- 每一层都有相应的协议负责交换信息或者协同工作
- TCP/IP协议族
- IP地址:负责在网路上唯一定位一个机器
- IP地址分ABCDE类
- 是由四个数字段组成,每个数字段的取值是0~255
- 192.168.xxx.xxx:局域网IP
- 127.0.0.1:本机
- IPv4,IPv6
- 端口
- 范围:0-65535
- 知名端口: 0-1023
- 非知名端口:1024-65535
TCP/UDP协议
- UDP协议:非安全的面向链接的传输
- 安全性差
- 大小限制64kb
- 没有顺序
- 速度快
- TCP
- 基于链接的通信
SOCKET编程
- socket(套接字):是一个网络通信的端点,能实现不同主机的进程通信。
- 通过IP+端口定位对方发送消息的通信机制
- 分为UDP和TCP
UDP编程
# -*- coding:utf-8 -*-
"""
Server段流程
1、建立socket
2、
3、
4、
"""
import socket
def serverFunc():
# 1、建立socket
# socket.AF_INET :使用IPv4协议族
# socket.SOCK_DGRAM: 使用UDP通信
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2、绑定IP的端口
# 地址是一个tuple类
address = ("127.0.0.1", 8989)
sock.bind(address)
# 3\接收对方消息
# 等待方式为死等
# recvfrom接收的返回值是一个tuple,前一项表示数据,后一项表示地址
# 参数的含义是缓冲区大小
data, address = sock.recvfrom(500)
print(data)
print(type(data))
# 4\发送过来的数据是bytes格式,必须通过解码才能得到str格式
# decode默认解码格式utf-8
text = data.decode()
print(text)
print(type(text))
# 返回消息
req = "I am not wtt"
# 发送消息 默认编码utf-8
data = req.encode()
sock.sendto(data, address)
if __name__ == '__main__':
print("Starting Server ....")
serverFunc()
print("Start SUEESS!")
Starting Server ....
# -*- coding:utf-8 -*-
import socket
def clientFunc():
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
text = "I LOve wtt"
data = text.encode()
sock.sendto(data, ('127.0.0.1', 8989))
data, address = sock.recvfrom(200)
data = data.decode()
print(data)
if __name__ == '__main__':
clientFunc()
TCP编程
- 面向链接的传输,即每次传输之前需要建立一个链接
- 客户端和服务端两个程序需要编写
Server端编写流程
- 1、建立socket负责具体通信,这个socket其实只负责接受对方的请求
- 2、绑定IP和端口
- 3、监听接入的访问socket
- 4、接收访问的socket,可以理解接收访问即建立一个通讯的链接通路
- 5、 接收对方的发送内容,利用接收到的socket接收内容
- 6、如果有必要,给对方发送返回信息
- 7、关闭链接通路
Client端编程
- 1、建立通信socket
- 2、链接对方,请求跟对方建立通路
- 3、发送内容到对方服务器
- 4、接收对方的反馈
- 5、关闭链接通路
# -*- coding:utf-8 -*-
"""
Server段流程
"""
import socket
def serverFunc():
# 1、建立socket
# socket.AF_INET :使用IPv4协议族
# socket.SOCK_DGRAM: 使用UDP通信
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、绑定IP的端口
# 地址是一个tuple类
address = ("127.0.0.1", 8989)
sock.bind(address)
# 3、监听接入的访问socket
sock.listen()
while True:
# 4、接收访问的socket
# accept 返回的元祖第一个元素赋值给skt,第二个赋值给address
skt, address = sock.accept()
# 5、接收对方发送的消息,利用socket接收内容
# 500代表接收使用的buffersize
msg = skt.recv(500)
# 接收到的是bytes格式内容
# 想得到str格式的,需要进行解码
msg = msg.decode()
rst = "Received msg:{0} from {1}".format(msg, address)
print(rst)
# 6、如果有必要,给对方发送返回消息
skt.send(rst.encode())
# 7、关闭链接
skt.close()
if __name__ == '__main__':
print("Starting Server ....")
serverFunc()
print("Start SUEESS!")
# -*- coding:utf-8 -*-
import socket
def tcp_clt():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('127.0.0.1', 8989)
sock.connect(address)
msg = "djksajdaskd你撒的d"
sock.send(msg.encode())
ret = sock.recv(500)
print(ret.decode())
sock.close()
if __name__ == '__main__':
tcp_clt()