网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块
网络编程协议
1.osi七层模型
应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
2.套接字 socket
有两类,一种基于文件类型,一种基于网络类型
3.Tcp和udp协议
Tcp协议:面向连接,数据可靠,传输效率低,面向字节流
建立连接与断开连接的过程(三次握手,四次挥手)
建立连接(三次握手):
1.客户端先发出消息到服务端,请求连接
2.服务端收到信息后,给客户端反馈一个信息,等待客户端回复
3.客户端收到服务端的反馈信息后,再像服务端发出收到消息,连接建立
断开连接(四次挥手):
1.客户端先发出消息到服务端,请求断开连接
2.服务端先发送一个信息,让客户端进行等待服务端处理通道中的数据
3.服务端处理完通道中的数据,给客户端发送一个信息,表示已经处理完数据,等待客户端回复
4.客户端收到消息后,给服务端发送一个回复信息,服务端收到后,断开连接
tcp服务端
import socket server = socket.socket()
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
ip_port = ("127.0.0.1",8004)
server.bind(ip_port)
server.listen(3) while 1:
conn,addr = server.accept()
while 1:
from_client_msg = conn.recv(1024)
from_client_str = from_client_msg.decode("utf-8")
print(from_client_str)
to_client_msg = input("服务输入")
conn.send(to_client_msg.encode("utf-8"))
tcp客户端
import socket client = socket.socket()
ip_port = ("127.0.0.1",8004)
client.connect(ip_port) while 1:
to_server_msg = input("客户输入")
client.send(to_server_msg.encode("utf-8"))
from_server_msg = client.recv(1024)
print(from_server_msg.decode("utf-8"))
Udp协议:面向无连接,数据不可靠,传输效率高,面向报文
upd服务端
import socket udp_server = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ("127.0.0.1",8007)
udp_server.bind(ip_port) from_client_msg,client_addr = udp_server.recvfrom(1024) udp_server.sendto(b"gun",client_addr)
print(from_client_msg,client_addr)
upd客户端
import socket udp_client = socket.socket(type=socket.SOCK_DGRAM)
ip_port = ("127.0.0.1",8007) udp_client.sendto(b"hello",ip_port) from_server_msg,server_addr = udp_client.recvfrom(1024)
print(from_server_msg,server_addr)
现在多用Tcp协议,这个更安全,但是Tcp长连接有一些问题, 会出现粘包现象, 这种现象是由缓冲区引起的
缓冲区: 将程序和网络解耦
输入缓冲区
输出缓冲区
Import Subprocess
sub_obj = subprocess.Popen(
‘dir’,
shell=True,
stdout=subprocess.PIPE, #正确结果的存放位置
stderr=subprocess.PIPE #错误结果的存放位置
)
4.粘包
两种粘包现象:
1 连续的小包可能会被优化算法给组合到一起进行发送
2 第一次如果发送的数据大小2000B,接收端一次性接受大小为1024B,这就导致剩下的内容会被下一次recv接收到,导致结果错乱
解决粘包的方法:
方案一:
由于双方不知道对方发送数据的长度,导致接收的时候,可能接收不全,或者多接收另外一次发送的信息内容,所以在发送真实数据之前,要先发送数据的长度,接收端根据长度来接收后面的真实数据,但是双方有一个交互确认的过程
方案二:
使用Struct模块,在发送前,把文件的大小打包,做成报头,把报头放在文件真实内容之前;在接收时,对发送过来的文件进行解包,然后打印文件真实内容.
打包:struct.pack(‘i’,长度)
解包:struct.unpack(‘i’,字节)
socketserver模块实现并发
我们之前写的tcp协议的socket是不是一次只能和一个客户端通信,如果用socketserver可以实现和多个客户端通信。它是在socket的基础上进行了一层封装,也就是说底层还是调用的socket。后面我们要写的FTP作业,需要用它来实现并发,也就是同时可以和多个客户端进行通信,多个人可以同时进行上传下载等。
服务端代码
import socketserver class Myserver(socketserver.BaseRequestHandler):
def handle(self):
while 1:
from_client_msg = self.request.recv(1024)
print(from_client_msg.decode("utf-8"))
msg = input("服务")
self.request.send(msg.encode("utf-8")) if __name__ == '__main__':
ip_port = ("127.0.0.1",8001)
server = socketserver.ThreadingTCPServer(ip_port,Myserver)
server.serve_forever()
客户端代码
import socket client = socket.socket()
client.connect(("127.0.0.1",8001)) while 1:
client_msg = input("客户:")
client.send(client_msg.encode("utf-8")) from_server_msg = client.recv(1024)
print(from_server_msg.decode("utf-8"))
网络编程协议(TCP和UDP协议,粘包问题)以及socketserver模块的更多相关文章
- 网络编程:tcp、udp、socket、struct、socketserver
一.TCP.UDP 一.ARP(Address Resolution Protocol)即地址解析协议,用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址. 二.在网络通信中 ...
- python网络编程:TCP通讯模板、粘包及解决方案、自定义报头
一.TCP通讯模板 二.远程CMD程序 三.解决粘包问题 四.解决粘包问题2 一.TCP通讯模板 TCP客户端 import socket c = socket.socket() # 连接服务器 c. ...
- 网络编程协议(TCP和UDP协议,黏包问题)以及socketserver模块
网络编程协议 1.osi七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2.套接字 socket 有两类,一种基于文件类型,一种基于网络类型 3.Tcp和udp协议 ...
- 【网络编程1】网络编程基础-TCP、UDP编程
网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...
- Python网络编程(2)-粘包现象及socketserver模块实现TCP并发
1. 基于Tcp的远程调用命令实现 很多人应该都使用过Xshell工具,这是一个远程连接工具,通过上面的知识,就可以模拟出Xshell远程连接服务器并调用命令的功能. Tcp服务端代码如下: impo ...
- 运输层协议--TCP及UDP协议
TCP及UDP协议 按照网络的五层分级结构来看,TCP及UDP位于运输层,故TCP及UDP是运输层协议.TCP协议--传输控制协议UDP协议--用户数据报协议 多路复用及多路分解 图多路复用及多路分解 ...
- 《Python网络编程》学习笔记--UDP协议
第二章中主要介绍了UDP协议 UDP协议的定义(转自百度百科) UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务 ...
- 网络编程[第二篇]基于udp协议的套接字编程
udp协议下的套接字编程 一.udp是无链接的 不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息, ...
- 网络编程应用:基于UDP协议【实现文件下载】--练习
要求: 基于UDP协议实现文件下载 发送方–请求–接收方发送文件–发送方接收文件 代码: 发送方: package Homework1; import java.io.File; import jav ...
随机推荐
- 《从0到1学习Flink》—— Flink 项目如何运行?
前言 之前写了不少 Flink 文章了,也有不少 demo,但是文章写的时候都是在本地直接运行 Main 类的 main 方法,其实 Flink 是支持在 UI 上上传 Flink Job 的 jar ...
- 利用Cookie保存用户身份信息实现免登录
<%@page import="sun.misc.BASE64Encoder"%> <%@page import="java.util.Base64.E ...
- 三、css 和 js 的装载与执行
一个网站在浏览器端是如何渲染的? 一.html 页面加载渲染的过程. 请求回来最先应该是HTML,从一个字节流转换成字符流,浏览器拿到字符流,然后浏览器端进行相应的词法分析成相应的token,然后不断 ...
- webapp一些样式记录
图片外面的div设置宽高自适应width: 100vw; max-width: 640px; display: block; height: 43.75vw; max-height: 280px; f ...
- vim 粘贴复制操作
原文链接:http://www.cnblogs.com/lansh/archive/2010/08/19/1803378.html vi编辑器有3种模式:命令模式.输入模式.末行模式.掌握这三种模式十 ...
- iOS 力学动画生成器UIKit Dynamics 之碰撞效果讲解
UIKit Dynamic是iOS7 新增的一组类和方法,可赋予UIView逼真的行为和特征,不需要写动画效果那些繁琐的代码,让开发人员能够轻松地改善应用的用户体验.一共有6个可用于定制UIDynam ...
- 梦织未来Windows驱动编程 第04课 驱动相关的数据结构
- git入门使用摘录
无论使用github或者gitlab,第一步都是在本地生产ssh-key,ssh-key作为客户端的身份证存放在user用户的.ssh文件夹下.如果之前没有生产过,需要用ssh-keygen命令生成. ...
- Codeforces Round #324 (Div. 2) A B C D E
A,水题不多说. #include<bits/stdc++.h> using namespace std; //#define LOCAL int main() { #ifdef LOCA ...
- wu2198:难得的波段抄底机会
很好的波段抄底机会 个人浅见看,目前染料股跌出的机会明显,养殖股波段机会明显,芯片.半导体.集成电路.北导.软件.国产操作系统等科技股短线机会不错.另外,大盘指数2856/2806区域的波段操作机会不 ...