操作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协议对应于应用层, 三者从本质上来说没有可 ...
随机推荐
- vue-cli3.0和element-ui及axios的安装使用
一.利用vue-cli3快速搭建vue项目 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@vue/cli 全局安装的 npm 包,提供了终端里的vue命令( ...
- 【JS】实用/常用函数/Function方法
1.获取日月 时分秒 //获取 月日 getMonth=(time)=>{ var date = new Date(time) <?):(date.getMonth()+) ?'+date ...
- Eclipse导war包忽略node_modules等文件
window7环境下,选择project->Properties->如下图
- idea创建自定义代码块
1.File——>settings 2.找到Editor——>live Templates,点击加号+ 3.创建group或直接创建,我这里创建了一个user组,然后在user组里面添加l ...
- qbittorrent搜索在线插件
https://raw.githubusercontent.com/khensolomon/leyts/master/yts.py https://raw.githubusercontent.com/ ...
- 转:路由 router-view
原文链接: 路由 router-view 路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容.H ...
- laravel框架视图中常用的逻辑结构forlese,foreach,ifelse等
if 和else @if($name === 1) 这个数字是1 @else 这个数字非1 @endif switch @switch($name) @case(1) 变量name == 1 @bre ...
- 嵌入式Linux学习笔记之第二阶段---文件I/O
1.文件IO的四个函数 一些术语: 不带缓冲的I/O: 每个read和write都调用内核中的一个系统调用. 文件描述符: 一个非负整数,对内核而言,所以打开的文件都通过文件描述符引用. ①打开或创建 ...
- 原生 js 录屏功能
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- ELK搜索条件
1.要搜索一个确切的字符串,即精确搜索,需要使用双引号引起来:path:”/app/logs/nginx/access.log” 2.如果不带引号,将会匹配每个单词:uid token 3.模糊搜索: ...