操作socket笔记
网络编程
1.tcp协议
#tcpserver
#单纯一对一发
tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建tcp套接字 参数(ipv4,tcp)
tcp.bind(('127.0.0.1', 8000)) # 为服务端创建本地绑定信息 参数为元组 '' 代表绑定本地 端口要求int类型
tcp.listen() # listen(n)监听模式 默认套接字变为被动等待为触发
client_socket, clent_socket_address = tcp.accept() # 阻塞 等待客户端连接 返回值为元组 (socket套接字,客户端的地址)
while True:
if client_socket:
print("连接成功!")
print("client_socket:", client_socket)
print("clent_socket_address:", clent_socket_address)
recv = client_socket.recv(1024) # 服务端 接收 1024为接收的最大数据大小
print("-->:", recv.decode('utf-8'))
client_socket.send('这里是rainbol的客户端请求'.encode('utf-8')) # 服务端回复,服务端发送时需要bytes类型
client_socket.close()
tcp.close()
#tcpclient
#客户端
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_socket.connect(('127.0.0.1',8000))
while True:
data = input('-->:')
tcp_socket.send(data.encode('utf-8'))#把字符串转成二进制,并把发送data
recv_data = tcp_socket.recv(1024)# 接收服务端返回的消息
print('-->%s'%recv_data.decode('utf-8'))
tcp_socket.close()
粘包问题
#client
'''
黏包现象:tcp传输过程中基本传输1500字节后就要进行分包处理,发送端默认进行拆包,接收端进行合包 一种是因为发送数据包时,每次发送的包小,因为系统进行优化算法,就将两次的包放在一起发送,减少了资源的重复占用。多次发送会经历多次网络延迟,一起发送会减少网络延迟的次数。因此在发送小数据时会将两次数据一起发送,而客户端接收时,则会一并接收。#即出现多次send会出现黏包 第二种是因为接收数据时,又多次接收,第一次接收的数据量小,导致数据还没接收完,就停下了,剩余的数据会缓存在内存中,然后等到下次接收时和下一波数据一起接收。 为了校验数据的完整 ''' '解决黏包:本质是因为我们在传输时不知道该数据包到底多大,取决于服务端和客户端相互协定如下方式'
import socket
import struct
soc = socket.socket()
soc.connect(('127.0.0.1',9000))
msg = b'hello'
msg_len = struct.pack('i',len(msg))#反正粘包现象,使用struct模块发送tcp数据时一开始告诉服务器发送字节数的大小,struct的i参数可以把8位数字节数以4个字节数类似'/SAD/sadsa/sad/sadasd'先发送给服务端
soc.send(msg_len)
soc.send(msg) msg = b'world'
msg_len = struct.pack('i',len(msg))
soc.send(msg) soc.close()
#server
import socket
import struct
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1',9000))
server.listen()
client_socket, clent_socket_address = server.accept()
get_lens = client_socket.recv(4)#先拿4个字节
get_size = struct.unpack('i',get_lens)[0] #拿到数据长度
msg1 = client_socket.recv(get_size) #再接收所有数据
print(msg1) get_lens = client_socket.recv(4)#先拿4个字节
get_size = struct.unpack('i',get_lens)[0] #拿到数据长度
msg2 = client_socket.recv(get_size)
print(msg2)
2.udp协议
#server
import socket
soc = socket.socket(type=socket.SOCK_DGRAM)#默认tcp如果变成udp要加SOCK_DGRAM
soc.bind(('127.0.0.1',9000))
ret,client_addr = soc.recvfrom(1024)
print(ret)
soc.sendto(b'ok',client_addr)#返回给客户端接收成功
soc.close()
#client
import socket
soc = socket.socket(type=socket.SOCK_DGRAM)
ret = soc.sendto(b'helloworld',('127.0.0.1',9000)) #参数一:想要发送的byte字节,参数二:想要发送给谁的地址
msg = soc.recv(1024)#接收服务端返回结果
print(msg)
soc.close()
操作socket笔记的更多相关文章
- MySQL4.0命令操作学习笔记
声明:下列内容并非原创,仅仅是最近学习笔记整理. -------------------------------------- 进入mysql安装路径bin目录下: 1.开启服务 winmysqlad ...
- socket笔记
参考: http://www.cnblogs.com/dolphinX/p/3460545.html http://www.cnblogs.com/wei2yi/archive/2011/03/23/ ...
- linux c socket笔记 -服务端
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types. ...
- C# Socket笔记
看到这个题目,是不是很眼熟?在博客园里搜下,保证会发现关于这个东东的文章实在是太多了~~~真得是没有写得必要,而且我也有点懒得去琢磨字句.(看到这,肯定得来个转折的了,不然就看不到下文了,不是吗)但是 ...
- python操作socket
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...
- 侠说java8--Stream流操作学习笔记,都在这里了
前言 首次接触到Stream的时候以为它是和InputStream.OutputStream这样的输入输出流的统称. 流和集合的前世今生 概念的差异 在开发中,我们使用最多的类库之一就是集合.集合是一 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:使用hive操作hbase
实验目的 熟悉hive和hbase的操作 熟悉hadoop.hbase.hive.zookeeper的关系 熟练大数据环境的搭建 学会分析日志排除问题 实验原理 1.hive整合hbase原理 前面大 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:分布式及RPC通信简介
实验目的 掌握GOF设计模式的代理模式 了解掌握socket编程.java反射.动态代理 了解NIO.多线程 掌握hadoop的RPC框架使用API 实验原理 1.什么是RPC 在hadoop出现以前 ...
- TCP IP SOCKET 笔记
网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可 ...
随机推荐
- 【C/C++开发】C++库大全
C++特殊限定符(1)--static 当static来修饰类数据成员时,这个类的所有对象都可以访问它.因为值在内存中持续存在,它可以被对象有效共享.这意味着当一个对象改变static数据成员的值时, ...
- eNSP——实现OSPF与ACL综合实验
OSPF与ACL再前几个随笔中提到了,现在我们来做一个实例. 拓扑图: 实验案例要求: 1.企业内网运行OSPF路由协议,区域规划如图所示:2.财务和研发所在的区域不受其他区域链路不稳定性影响:3.R ...
- confluence6.14.1linux安装破解
一.简介 Confluence为团队提供一个协作环境.在这里,团队成员齐心协力,各擅其能,协同地编写文档和管理项目.从此打破不同团队.不同部门以及个人之间信息孤岛的僵局,Confluence真正实现了 ...
- shiro 的session持久化
对于分布式系统,一般都牵扯到Session共享问题,而想实现Session共享,就要实现Session的持久化操作,即是将内存中的Session持久化至缓存数据库. SessionDAO是Shiro提 ...
- 线性表——顺序表的实现与讲解(C++描述)
线性表 引言 新生安排体检,为了 便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这 ...
- 《Mysql - 如何恢复和避免误删除?》
一:误删数据 (如何恢复和避免误删除) - 使用 delete 语句误删数据行: - 使用 drop table 或者 truncate table 语句误删数据表: - 使用 drop databa ...
- 解决idea中maven项目无法读取src/main/java目录下面的配置文件问题
解决idea中maven项目无法读取src/main/java目录下面的配置文件问题 当我们在maven项目中使用Mybatis的时候,需要给Mybatis配置核心xml文件(MyBatis-Conf ...
- STM32之spi管理模式
1)sip管理模式分为:硬件管理和软件管理:主要由NSS .SSI.SSM决定: NSS是芯片上一个实实在在的引脚,SSI和SSM是SPI_CR1控制器里的的位. 值得注意的是:NSS分外部引脚和内部 ...
- php数组与数据栈相关函数
php数组可以用栈的角度来操作,这其中包含了如下函数,array_pop(),array_push,array_shift(),array_unshift(). array_pop()函数 将数组的最 ...
- Python进阶:值传递,引用传递?不存在的,是赋值传递
Python的变量及其赋值 c/c++/c#/java 里面都有值传递,引用传递的概念,在Python中是如何的? 例 a = 1 b = a print(id(a),id(b)) #14072334 ...