8-2udp和tcp网络编程以及粘包和解决粘包的方法
一 tcp网络编程
server 端 import socket
sk=socket.socket() #实例化一个对象
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#端口可以重用
sk.bind(('127.0.0.1',9100))
sk.listen()#监听
while True:
conn,addr=sk.accept() #阻塞,三次握手完毕
while True:
inp=input('请输入你要发送的消息:')
conn.send(inp.encode('utf-8'))
if inp == 'q': break
ret=conn.recv(1024).decode('utf-8')
if ret == 'q': break
print(ret) conn.close()
sk.close()
client端
1 import socket
sk=socket.socket()
#while True:
sk.connect(('127.0.0.1',9100))
while True:
ret=(sk.recv(1024).decode('utf-8'))
if ret == 'q': break
print(ret)
inp=input('请输入你要发送的消息:')
sk.send(inp.encode('utf-8'))
if inp == 'q': break sk.close()
二 tcp粘包
1 发送方的缓存机制
发送数据时间间隔很短,数据了很小,会合到一起,产生粘包
服务端
#_*_coding:utf-8_*_
from socket import *
ip_port=('127.0.0.1',8080) tcp_socket_server=socket(AF_INET,SOCK_STREAM)
tcp_socket_server.bind(ip_port)
tcp_socket_server.listen(5) conn,addr=tcp_socket_server.accept() data1=conn.recv(10)
data2=conn.recv(10) print('----->',data1.decode('utf-8'))
print('----->',data2.decode('utf-8')) conn.close() 服务端
服务端
#_*_coding:utf-8_*_
import socket
BUFSIZE=1024
ip_port=('127.0.0.1',8080) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
res=s.connect_ex(ip_port) s.send('hello'.encode('utf-8'))
s.send('egg'.encode('utf-8'))
客户端
2接收方的缓存机制
客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)
#_*_coding:utf-8_*_
from socket import *
ip_port=('127.0.0.1',8080) tcp_socket_server=socket(AF_INET,SOCK_STREAM)
tcp_socket_server.bind(ip_port)
tcp_socket_server.listen(5) conn,addr=tcp_socket_server.accept() data1=conn.recv(2) #一次没有收完整
data2=conn.recv(10)#下次收的时候,会先取旧的数据,然后取新的 print('----->',data1.decode('utf-8'))
print('----->',data2.decode('utf-8')) conn.close()
服务端
#_*_coding:utf-8_*_
import socket
BUFSIZE=1024
ip_port=('127.0.0.1',8080) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
res=s.connect_ex(ip_port) s.send('hello egg'.encode('utf-8'))
客户端
三 解决粘包问题
import socket
import struct
sk=socket.socket()
sk.bind(('127.0.0.1',8090))
sk.listen()
conn,addr=sk.accept()
inp=input('>>>:').encode('utf-8')
inp_len=len(inp)#计算用户输入的长度
bytes_msg=struct.pack('i',inp_len)#将数字转换成固定的bytes
conn.send(bytes_msg) #先发送报头的长度4个bytes
conn.send(inp)#在发送报头的字节格式
conn.send(b'alex sb')#最后发送真实内容的字节格式
conn.close()
sk.close()
服务端
import socket
import struct
sk=socket.socket()
sk.connect(('127.0.0.1',8090))
num=sk.recv(4) #先接受bytes的长度
num=struct.unpack('i',num)[0]#提取报文的长度
print(sk.recv(num).decode('utf-8'))
print(sk.recv(10)) sk.close()
客户端
四 udp
udp server端 import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8899))
while True:
msg,addr=sk.recvfrom(1024)
print(msg.decode('utf-8'),addr)
inp=input('>>>:')
if inp=='q':break
sk.sendto(inp.encode('utf-8'),addr)
#print(msg)
sk.close()
udp client import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8899))
while True:
msg,addr=sk.recvfrom(1024)
print(msg.decode('utf-8'),addr)
inp=input('>>>:')
if inp=='q':break
sk.sendto(inp.encode('utf-8'),addr)
#print(msg)
sk.close()
8-2udp和tcp网络编程以及粘包和解决粘包的方法的更多相关文章
- Linux下TCP网络编程与基于Windows下C#socket编程间通信
一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...
- JAVA TCP网络编程学习笔记
一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...
- 简述TCP网络编程本质
基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式,头一次使用这种模式编程需要转换思维模式 .把原来的"主动调用recv()来接收数据,主动调用accept()来接受连接,主动调 ...
- 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
[Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...
- TCP网络编程
TCP网络编程 与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的.客服端:public class TCPClient { /** * @param args * @th ...
- Java - TCP网络编程
Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回 ...
- tcp粘包、解决粘包问题
目录 subproess模块 TCP粘包问题 粘包两种情况 解决粘包问题 struct模块的使用 使用struct模块解决粘包 优化解决粘包问题 上传大文件 服务端 客户端 UDP协议 upd套接字 ...
- TCP网络编程小结
一.套接字编程基础 1.套接字地址结构 通用的地址结构是 struct sockaddr{ unsigned short sa_family; ]; } IPv4的套接字地址结构是 struct in ...
- tcp 网络编程
网络编程同时也是进程间的一种通信:服务器进程和应用进程间的通信. OSI:开放式系统互联 OSI 7层模型: ...
随机推荐
- CSP-S模拟 - 20190916
这是一套题=.= ABC D1DEF D2 过程-Process Before T1 像DP 迷茫…… T2 像二/三分 T3 不知道惹 可以DP($30\%$) During T1 先打个暴力$N^ ...
- sqlserver 2008 R2 安装教程(心得记录)
在这里简单的记录下自己安装sqlserver的过程吧(本人以前安装失败过,然后卸载了,就一直没用,现在由于工具原因,重新安装,过程相对第一次安装会复杂点) 1.首先,把以前安装的注册表的对应c盘的文件 ...
- flask的基本操作
常用的SQLAlchemy字段类型 # coding:utf-8 from flask import Flask from flask_sqlalchemy import SQLAlchemy app ...
- oracle习题-emp表查询练习
emp表查询练习 1 查询emp表的全部记录 Select * from emp; 2 查询出每个雇员的编号.姓名.基本工资 Select empno,ename,sal from emp; 3 查询 ...
- h5滚动页面固定导航
1.需要效果 2.实现方法 (1)原生js实现 document.addEventListener('scroll', function (event) { var scrollDamo = wind ...
- golang数组 排序和查找
package main import "fmt" func BubbleSort(arr *[5]int){ fmt.Println("排序前arr=",(* ...
- C++学习笔记(2)---2.5 C++函数编译原理和成员函数的实现
转载自:http://c.biancheng.NET/cpp/biancheng/view/2996.html点击打开链接 从上节的例子可以看出,对象的内存模型中只保留了成员变量,除此之外没有任何其他 ...
- 继续对dubbo源代码进行maven builder
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/enson16855/article/details/32073981 原文地址:http://dtb ...
- CSS3圆环旋转效果
html结构: <div class="demo"></div> css结构: .demo{ width:250px; height:250px; bord ...
- fusion-io工具--更换fusion-ioSSD无法识别及升级指引
centos6.5系统,(含fusion-io共7块盘)库存的fusion-io卡需要升级固件才能识别 现在只认到6个盘 fdisk -l 2>/dev/null | grep 'Disk /d ...