TCP与UDP协议
一.网络编程
1.为什么要学习网络编程
应用软件的架构
1.C/S
client =====server
2.B/S
browser ===server
在不同的计算机上 一个安装客户端 另一个安装服务端 通过网络来通讯
什么是网络通讯?
要完成通讯必须具备的条件
1.物理链接介质(网络,WIFI,光纤)
2.必须遵循相同的标准
在计算机网络中同样需要具备这两个条件
作为应用软件开发者 不需要关心第一步 重点是通讯的标准(通讯的协议)
网络协议:
open system interconnection
OSI七层模型
二 socket
学习网络编程 其实就在学socket
socket是什么?
翻译过来称为套接字
是对底层 TCP IP UDP 等网络协议进行封装
使得上层的应用程序开发者,不用直接接触者对复杂,丑陋的协议
在程序的言轮,他就是一个封装好的模板!
要完成网络通讯,只需要使用系统提供socket模块就行
TCP和UDP是传输层最常见的协议
主要控制传输数据的方式
TCP的传输方式
优点:通过三次握手来与服务器建立连接
可以保证数据的完整性
a机器给b机器发送数据包 要求b机器必须立即返回一个确认包
a机器会等待一段时间,如果超时还没有收到确认,则重发数据
缺点:传输效率低
使用场景:文字聊天,支付宝转账等,
UDP
传输方式:不需要建立连接,直接发送
缺点: 不能保证数据的完整性
优点: 传输效率比TCP高
使用场景:视频通话,语音通话,UDP
python的socket
在使用socket的时候用户需要关系的是 ip地址,port端口,传输协议TCP/UDP,你要发送的数据data
在写网络编程的时候,必须有两代码,对应客户端的服务器
使用sockett来完成TCP通讯
应该先完成服务器的代码编写
三 TCP服务器
import socket #1.创建一个代表服务器的socket对象 s = socket.socket() #2.绑定端口号和IP地址 1227.0.0.1表示当前这个电脑的ip address = ("127.0.0.1",8080) s.bind(address) print('服务器已启动!') #3.开始监听这个端口 #5表示 可以有5个处于半连接状态的连接 指的不是最大连接数 s.listen(5) print("test") #4.接受连接请求 #该函数时阻塞的 会卡主程序的执行,必须等到有一个客户端进来才能继续执行 #返回元组 第一个代表客户端的socket对象 第二客户端的地址信息 client,c_address = s.accept() print("有一个连接已建立!") print(c_address) #给客户端发送数据 #5.读写数据 #接受数据 res = client.recv(1024) print(res) #6.关闭连接 s.close()
四.TCP客户端
import socket # 1.创建客户端的socket对象 c = socket.socket() # 2.指定服务器的ip和port server_address = ("127.0.0.1",8080) # 3.建立连接 c.connect(server_address) # 4.读写数据 # 发送数据到服务器 c.send("hello 我是客户端!".encode("utf-8")) # 5.关闭连接 c.close()
五.UDP服务器
import socket
1.创建sockket对象
s = socket.socket(type=socket.SOCK_DGRAM)
2.绑定端口和ip
s.bind("127.0.0.1",10000))
while True:
3.接受数据
res = s.recv(1024)
while True:
msg = input(">>>>")
需要获取对方的ip和端口
s.sendto(msg.ecode("utf-8"),("127.0.0.1",10000))
#关闭资源
s.close()
六 UDP客户端
import socket # 1.创建socket对象 c = socket.socket(type=socket.SOCK_DGRAM) while True: msg = input(">>>:") c.sendto(msg.encode("utf-8"),("127.0.0.1",10000)) c.close()
七.聊天的客户端
import socket client = socket.socket() client.connect(("127.0.0.1",65535)) while True: # 发送 client.send(input(">>>:").encode("utf-8")) # 接收 data = client.recv(1024).decode("utf-8") print(data) if len(data) == 0: client.close() break
七.聊天服务器
""" 正常的聊天的程序 客户端发送的数据 先发送到服务器端 服务器端把消息转发给你的目标好友 """ import socket server = socket.socket() server.bind(("127.0.0.1",65535)) server.listen(5) client, c_address = server.accept() while True: data = client.recv(1024).decode("utf-8") print("收到来自客户端的数据:",data) # 如果对方发来一个over 我就关闭连接 if data == "over": client.close() break # 把对方传过来的数据转换为大写 在发回去! client.send(data.upper().encode("utf-8")) # 关闭服务器端 server.close() # 需求 客户端输入cmd命令 发送给服务器执行 服务器执行(subprocess)完后返回 执行结果