TCP中的粘包问题,以及用TCP和UDP实现多次聊天
TCP协议
在连接内多和客户端说几句
#server端
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9001))
sk.listen()
while True
conn,addr = sk.accept()
while True
bad = input('>>>')
conn.send(bad.encode('utf-8'))
if bad.upper() == 'Q':
break
msg = conn.recv(1024).decode('utf-8')
if msg.upper == 'Q':break
print(msg)
conn.close() #挥手 断开连接
sk.close() #归还申请的操作系统资源
#client
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9001))
while True:
msg = sk.recv(1024)
msg2 = msg.decode('utf-8')
if msg2.upper == 'Q':break
print(msg2)
send_msg = input('>>>')
sk.send(send_msg.encode('uft-8'))
if send_msg.upper == 'Q':break
sk.close()
为什么要加while True
- 因为要进行多次通信
sk代表什么?
- sk代表启用的通信服务
conn代表什么?
- conn代表自己的IP地址,和对方的地址和端口
能够接受多个客户端的请求
- 为什么加while True
- 因为在一个客户端断开连接之后不能管不服务,要等待另一个客户端连接
- 怎么退出
- 在接收或者传输的时候先检查是不是要退出,要是退出的话就break
UDP协议
语法:
#server
import socket
sk = socket.socket(tyep = socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9000))
msg,addr = sk.recvfrom(1024)
print(msg.decode('utf-8'))
msg = input('>>>')
sk.sendto(msg.encode('utf-8'),addr)
#client
import socket
sk = socket.socket(type = socket.SOCK_DGRAM)
server = ('127.0.0.1',9000)
while True:
msg = input('>>>')
if msg.upper == 'Q':break
sk.sendto(msg.encode('utf-8'),server)
msg = sk.recv(1024).decode('utf-8')
if msg.upper() == 'Q':break
print(msg)
涉及到的新方法
- type = socket.SOCK_DGRAM 在开启socket方法的时候加上这段代码,表示就是用UDP协议
- recvfrom:在server端接收信息的时候用recvfrom就可以把客户机的IP地址获取到
和TCP协议的区别
- 它可以同时建立多个连接,当一个连接断开后不会影响其他连接
粘包现象
- TCP协议的特点
- 多条消息之间没有边界,并且还有一大堆优化算法
- 什么叫做粘包
- 多条数据粘在一起
- 为什么会出现粘包
- 发送端:两条消息都很短,发送的间隔时间也非常短
- 接收端:多条消息由于没有及时接收,而在接收方的缓存短堆在一起导致粘包
- 怎么处理
#server
import struct
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9001))
sk.listen()
conn,addr = sk.accept()
msg1 = input('>>>').encode()
msg2 = input('>>>').encode()
blen = struct.pack('i',len(msg1))
conn.send(blen)
conn.send(msg1)
conn.send(msg2)
sk.close()
#cilent
import struct
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9001))
length = sk.recv(4)
length = struct.unpack('i',length)[0]
msg1 = sk.recv(length)
msg2 = sk.recv(1024)
print(msg1.decode('utf-8'))
print(msg2.decode('utf-8'))
sk.close()
什么叫自定义协议
- 在网络传输的时候,人为的为它定制一个协议,让它遵守此项协议
struct模块怎么用
- struct.pack()#将一个数字转换为4个字节的数
- struct.unpack()#将一个4个字节的数,转化回原来的数
osi五层协议
- 应用层
- 传输层
- tcp协议:效率低 面向连接、可靠、全双工的通信
- 三次握手
- 客户端向服务器端发送syn请求
- 服务器端向客户端回复ack并发送syn请求
- 客户端接收到的请求之后再回复ack表示建立连接
- 由客户端的connect + 服务端的 close
- 四次挥手
- 客户端向服务端发送fin请求
- 服务端回复ack确认
- 服务端向客户端发送fin请求
- 客户端回复ack
- 由客户端的close和服务端的close
- 三次握手
- udp协议:效率高 无连接的、不可靠
- 四层交换机,四层路由器
- tcp协议:效率低 面向连接、可靠、全双工的通信
- 网络层
- IP协议(ipv4,ipv6)
- 路由器、三层交换
- 数据链路层
- arp协议,地址解析协议 通过IP找到mac地址
- 物理层
TCP中的粘包问题,以及用TCP和UDP实现多次聊天的更多相关文章
- python socket的应用 以及tcp中的粘包现象
1,socket套接字 一个接口模块,在tcp/udp协议之间的传输接口,将其影藏在socket之后,用户看到的是socket让其看到的. 在tcp中当做server和client的主要模块运用 #s ...
- 第二十八天- tcp下的粘包和解决方案
1.什么是粘包 写在前面:只有TCP有粘包现象,UDP永远不会粘包 1.TCP下的粘包 因为TCP协议是面向连接.面向流的,收发两端(客户端和服务器端)都要有成对的socket,因此,发送端为了将多个 ...
- Netty 中的粘包和拆包
Netty 底层是基于 TCP 协议来处理网络数据传输.我们知道 TCP 协议是面向字节流的协议,数据像流水一样在网络中传输那何来 "包" 的概念呢? TCP是四层协议不负责数据逻 ...
- python中TCP协议中的粘包问题
TCP协议中的粘包问题 1.粘包现象 基于TCP实现一个简易远程cmd功能 #服务端 import socket import subprocess sever = socket.socket() s ...
- tcp协议传输中的粘包问题
什么是粘包问题 tcp是流体协议. 其nagle算法会将数据量较小. 并且发送间隔时间较短的多个数据包合并为一个发送. 网络传输的时候是一段一段字节流的发送. 在接收方看来根本不知道字节流从何开始. ...
- Linux 网络编程详解五(TCP/IP协议粘包解决方案二)
ssize_t recv(int s, void *buf, size_t len, int flags); --与read相比,只能用于网络套接字文件描述符 --当flags参数的值设置为MSG_P ...
- TCP通讯处理粘包详解
TCP通讯处理粘包详解 一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据.TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU的往往小于在应用处理的 ...
- Netty(三) 什么是 TCP 拆、粘包?如何解决?
前言 记得前段时间我们生产上的一个网关出现了故障. 这个网关逻辑非常简单,就是接收客户端的请求然后解析报文最后发送短信. 但这个请求并不是常见的 HTTP ,而是利用 Netty 自定义的协议. 有个 ...
- 什么是 TCP 拆、粘包?如何解决(Netty)
前言 记得前段时间我们生产上的一个网关出现了故障. 这个网关逻辑非常简单,就是接收客户端的请求然后解析报文最后发送短信. 但这个请求并不是常见的 HTTP ,而是利用 Netty 自定义的协议. 有个 ...
随机推荐
- opencart源码解析之 index.php
//访问index.php,安全过滤.加载配置文件.核心启动文件.函数库.类库 //转载请注明: http://blog.csdn.net/dabao1989/article/details/2122 ...
- Emgu-WPF学习使用-识别二维码的位置
原文:Emgu-WPF学习使用-识别二维码的位置 参考链接:http://blog.csdn.net/gaobobo138968/article/details/47663607 我完全参 ...
- VS发布到IIS Express外网Debug(如微信开发)
主要效果是本机调试网站,将网站发布到某域名(如m16758r728.iok.la),可以进入VS断点,不必再用远程调试!!! 环境 VS2015windows 10操作系统花生壳(可以用其他内网穿透的 ...
- WPF MessageBox 添加确认取消按钮 并判断
很简单的功能随笔 if (System.Windows.MessageBox.Show("您确定要删除吗?", "提示:", MessageBoxButton. ...
- 第0001题 : 产生随机数(顺便读random模块官方文档)
看这个之前我准备先看一下random模块的官方文档... 在整个随机模块中, 最基础的就是random, 它产生一个 [0.0, 1.0)的浮点数. 这个模块下所有的函数实际上是绑定在一个叫做ran ...
- Qt MVC设计模式(五篇)
http://blog.csdn.net/qq_19672579/article/details/46952675http://blog.csdn.net/qq_19672579/article/de ...
- UBUTUN 通过蓝牙连接Hoary和诺基亚手机
通过蓝牙连接Hoary和诺基亚手机 这个how to已经用Hoary.诺基亚6630和一个道尔芯片(Dongle)蓝牙(Usb蓝牙)测试过了.通过这个How to,你可以:-通过蓝牙,从你的电脑发送文 ...
- Win8Metro(C#)数字图像处理--2.22二值图像膨胀
原文:Win8Metro(C#)数字图像处理--2.22二值图像膨胀 [函数名称] 二值图像膨胀函数DilationProcess(WriteableBitmap src) [算法说明] 膨胀 ...
- WPF WindowChrome 自定义窗口
1.wpf自定义窗口: WindowChrome类描述:https://msdn.microsoft.com/zh-cn/library/system.windows.shell.windowchro ...
- 在 .pro里加入 QMAKE_CXXFLAGS += /MP 将并行编译(VC),加快编译速度(姚冬的办法),或者-j4参数(MinGW)
但是只对VC编译器有效果. 另外还可以自己设置stdafx.h文件 http://www.zhihu.com/question/23045749 C:\Qt\Qt5.6.2_static\bin\qm ...