TCP Socket低层次网络编程和UDP Socket低层次网
2019-12-22 本文已影响0人
wangyu2488
2019年12月12日
TCP/IP协议的传输层又有两种传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP是面向连接的可靠数据传输协议。
一.TCP Socket低层次网络编程
TCP就像好比电话,电话接通后双方才能通话,在挂断电话之前,电话一直占线。
image.png1.简单聊天工具
1.1服务器端代码
# coding=utf-8
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 8888))
s.listen()
print('服务器启动...')
# 等待客户端连接
conn, address = s.accept()
# 客户端连接成功
print(address)
# 从客户端接收数据
data = conn.recv(1024)
print('从客户端接收消息:{0}'.format(data.decode()))
# 给客户端发送数据
conn.send('你好'.encode()) # conn.send(b'你好')
# 释放资源
conn.close()
s.close()
1.2客户端代码
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
s.connect(('127.0.0.1', 8888))
# 给服务器端发送数据
s.send(b'Hello')
# 从服务器端接收数据
data = s.recv(1024)
print('从服务器端接收消息:{0}'.format(data.decode()))
# 释放资源
s.close()
1.3测试先启动服务器端代码
image.png image.png2.文件上传工具
2.1服务器端
import socket
HOST = ''
PORT = 8888
f_name = 'coco2dxcplus_copy.jpg'
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(10)
print('服务器启动...')
while True:
with s.accept()[0] as conn:
# 创建字节序列对象列表,作为接收数据的缓冲区
buffer = []
while True: # 反复接收数据
data = conn.recv(1024)
if data:
# 接收的数据添加到缓冲区
buffer.append(data)
else:
# 没有接收到数据则退出
break
# 将接收的字节序列对象列表合并为一个字节序列对象
b = bytes().join(buffer)
with open(f_name, 'wb') as f:
f.write(b)
print('服务器接收完成。')
2.2客户端
import socket
HOST = '127.0.0.1'
PORT = 8888
f_name = 'coco2dxcplus.jpg'
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
with open(f_name, 'rb') as f:
b = f.read()
s.sendall(b)
print('客户端上传数据完成。')
2.3印证 先开服务器
image.png image.png二.UDP Socket低层次网络编程
UDP(用户数据报协议)就像日常生活中的邮件投递,是不能保证可靠的寄到目的地.UDP是无连接的,对系统资源的要求较少.UDP可能丢包不保证数据顺序。但是对于网络游戏和在线视频等要求传输快、实时性高,质量可稍差一点的数据传输,UDP还是非常不错的。(优点不会一直占线)
1.简单聊天工具
1.1服务器
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('', 8888))
print('服务器启动...')
# 从客户端接收数据
data, client_address = s.recvfrom(1024)
print('从客户端接收消息:{0}'.format(data.decode()))
# 给客户端发送数据
s.sendto('你好'.encode(), client_address) # 如果数据量很大会多次调用
# 释放资源
s.close()
1.2客户端
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 服务器地址
server_address = ('127.0.0.1', 8888)
# 给服务器端发送数据
s.sendto(b'Hello', server_address)
# 从服务器端接收数据
data, _ = s.recvfrom(1024)
print('从服务器端接收消息:{0}'.format(data.decode()))
# 释放资源
s.close()
1.3测试
image.png image.png2.文件上传工具 上传图片容易丢失,用文件替代
2.1服务器
import socket
HOST = '127.0.0.1'
PORT = 8888
f_name = 'test_copy.txt'
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.bind((HOST, PORT))
print('服务器启动...')
# 创建字节序列对象列表,作为接收数据的缓冲区
buffer = []
while True: # 反复接收数据
data, _ = s.recvfrom(1024)
if data:
flag = data.decode()
if flag == 'bye': # 和客户端约定好的结束符号
break
buffer.append(data)
else:
# 没有接收到数据,进入下次循环继续接收
continue
# 将接收的字节序列对象列表合并为一个字节序列对象
b = bytes().join(buffer)
with open(f_name, 'w') as f:
f.write(b.decode())
print('服务器接收完成。')
2.2客户端
import socket
HOST = '127.0.0.1'
PORT = 8888
f_name = 'test.txt'
# 服务器地址
server_address = (HOST, PORT)
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
with open(f_name, 'r') as f:
while True: # 反复从文件中读取数据
data = f.read(1024)
if data:
# 发送数据
s.sendto(data.encode(), server_address)
else:
# 发送结束标志
s.sendto(b'bye', server_address)
# 文件中没有可读取的数据则退出
break
print('客户端上传数据完成。')
2.3测试
image.png image.png如果您发现本文对你有所帮助,如果您认为其他人也可能受益,请把它分享出去。