一  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网络编程以及粘包和解决粘包的方法的更多相关文章

  1. Linux下TCP网络编程与基于Windows下C#socket编程间通信

    一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...

  2. JAVA TCP网络编程学习笔记

    一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...

  3. 简述TCP网络编程本质

    基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式,头一次使用这种模式编程需要转换思维模式 .把原来的"主动调用recv()来接收数据,主动调用accept()来接受连接,主动调 ...

  4. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

  5. TCP网络编程

    TCP网络编程  与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的.客服端:public class TCPClient { /**     * @param args     * @th ...

  6. Java - TCP网络编程

    Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回 ...

  7. tcp粘包、解决粘包问题

    目录 subproess模块 TCP粘包问题 粘包两种情况 解决粘包问题 struct模块的使用 使用struct模块解决粘包 优化解决粘包问题 上传大文件 服务端 客户端 UDP协议 upd套接字 ...

  8. TCP网络编程小结

    一.套接字编程基础 1.套接字地址结构 通用的地址结构是 struct sockaddr{ unsigned short sa_family; ]; } IPv4的套接字地址结构是 struct in ...

  9. tcp 网络编程

    网络编程同时也是进程间的一种通信:服务器进程和应用进程间的通信. OSI:开放式系统互联 OSI 7层模型:                                               ...

随机推荐

  1. jnhs-netbeans maven Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.4.1:clean (default-clean) on project

    w 无法完成清理 出现这种错误,通常是由于启动了另一个tomcat 进程或者运行的javaw.exe进程,导致报错. 直接运行工程启动后再清理就好了 或者 重启大法

  2. web前端开发必备技术

    1.Vue.js是什么? Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注 ...

  3. IntelliJ IDEA包层级结构显示方式

    在开发的过程中,程序结构增多,通过树状结构看包结构目录,更加舒适. Idea默认情况下是不分层级展示包结构的 点击设置标志按钮,如下图所示 去掉Hide Empty Middle Packages的勾 ...

  4. 如何制作可以在 MaxCompute 上使用的 crcmod

    之前我们介绍过在 PyODPS DataFrame 中使用三方包.对于二进制包而言,MaxCompute 要求使用包名包含 cp27-cp27m 的 Wheel 包.但对于部分长时间未更新的包,例如 ...

  5. BZOJ1455罗马游戏

    左偏树裸题. 题面描述让人意识到了平面几何的重要性. //Achen #include<algorithm> #include<iostream> #include<cs ...

  6. Laravel 精选资源大全

    原文链接  必备品 文档:Documentation API:API Reference 视频:Laracasts 新闻:Laravel News 中文文档 Laravel学院– Laravel 5. ...

  7. 001. 注释过的boot.s

    从网上搜罗一个很详细注释的boot.s版本,加了小小一点点自己的理解,不太多. 用 as86, ld86 可以编译,   ubuntu下可以通过 apt install bin86 来安装好像. ; ...

  8. 统计Linux下的CPU状态信息

    def cpu(): all_cpus=[] with open('e:/cpu.txt') as f: core={} for line in f.readlines(): ab=line.spli ...

  9. WPF 触发器例子

    WPF的触发器很强大,这里简单附上触发器的一个小例子,分别用XMAL和CS代码来实现一个功能,鼠标悬停在button上时改变字体颜色 1.XMAL代码如下: <Window x:Class=&q ...

  10. 使用 store 来优化 React 组件

    在使用 React 编写组件的时候,我们常常会碰到两个不同的组件之间需要共享状态情况,而通常的做法就是提升状态到父组件.但是这样做会有一个问题,就是尽管只有两个组件需要这个状态,但是因为把状态提到了父 ...