初识socket之TCP协议
TCP服务端、客户端(基础版本)
# 这是服务端
import socket
server = socket.socket() # 买手机
server.bind(('127.0.0.1', 8080)) # 插手机卡 bind((IP,PORT))
server.listen(5) # 开机 半连接池
conn, addr = server.accept() # 待机等待接电话
data = conn.recv(1024) # 接听别人说话 只接收1024个字节 bytes
print(data)
conn.send(b'hello big baby!') # 跟别人说话
conn.close() # 关闭通信连接,如果不关闭的话就跟文件open操作一样,没有close时还会存在于内存中,造成空间的浪费
server.close() # 关闭服务端
# 这是客户端
import socket
client = socket.socket()
client.connect(('127.0.0.1',8080)) # 找服务器
client.send(b'hello how much?')
data = client.recv(1024)
print(data)
client.close()
TCP内部传输优化(如果发送的数据较短且时间间隔很短,就好将它们打包成一个发过去,这也是粘包的一种。但是通常我们说的粘包指的是接收方不清楚发送方发送的数据大小,导致一次接收不完,下一次接收数据时里面会掺杂上一次未接收完的数据。)
# 用以验证的服务端,该优化产生的粘包现象仅存在于客户端向服务端发送消息
import socket
server = socket.socket()
server.bind(('127.0.0.1',8088))
server.listen(5) # 半连接池
conn,addr = server.accept()
data = conn.recv(4)
print(data)
data = conn.recv(5)
print(data)
data = conn.recv(5)
print(data)
# 用以验证的客户端
import socket
client = socket.socket()
client.connect(('127.0.0.1',8088))
client.send(b'hello')
client.send(b'hello')
client.send(b'hello')
struct模块(用于处理粘包问题的模块之一)


# struct模块的pack可以将无论多长的数据(其实能压缩的数据是有上限的)都打包成固定四个字节长度的数据,模式及详情见上图
import struct
data = 'dfsafsagdsfgfsdgsdfgfdsgsdfggsdgfdssfsdfsafsfdgsdfgsfdgsfdgsfdgsfdgsdfgdsfgsdfgsdgsdgjgjhghjghjgfjfghjfghjfgjdafsafdsafdsdafsdafsdafaf'
# 服务端
res = struct.pack('i',len(data))
print(len(res))
# print(res)
# 客户端
ret = struct.unpack('i',res)[0] # unpack返回的是一个元组,第一个(索引为0)才是我们自己的数据(这里是len(data))
print(ret)
TCP服务端、客户端(用发送报头的方式处理粘包问题)
# 这是服务端server
import socket
import subprocess
import struct
import json
"""
服务端:
要有固定的ip和port
24小时不间断提供服务
"""
server = socket.socket()
server.bind(('127.0.0.1',8081))
server.listen(5) # 半连接池
while True: # 该whlie True里是链接循环accept负责链接客户端
conn,addr = server.accept() # 阻塞
while True: #该while True里是通信循环
try: # 这里用try异常捕获,因为客户端在非正常退出时服务端会报错,如果不捕获异常的话服务端程序就无法正常运行,它会崩
data = conn.recv(1024).decode('utf-8') # 阻塞
if len(data) == 0:break # 针对linux和mac系统 客户端异常断开反复收空的情况
obj = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) # subprocess模块是让电脑执行脚本命令的(如cmd命令)
stdout = obj.stdout.read()
stderr = obj.stderr.read()
print(len(stdout+stderr))
header_dic = {
'filename':'cls.av',
'len':len(stdout+stderr)
} header_bytes = json.dumps(header_dic).encode('utf-8')
# 制作报头
header = struct.pack('i', len(header_bytes)) # 将需要发送给客户端的数据打包成固定4个字节
conn.send(header) #发送报头,客户端recv(4)接收
conn.send(header_bytes) #发送报头的字节格式
conn.send(stdout+stderr)#发送真实数据
except ConnectionResetError:
break
conn.close()
server.close() # 该语句可以不要,因为服务端是要24小时提供服务的
# 这是客户端client
import socket
import struct
import json
client = socket.socket()
client.connect(('127.0.0.1',8081))
while True:
msg = input('>>>:').encode('utf-8')
if len(msg) == 0:continue
client.send(msg)
header = client.recv(4) #接收报头 # 对这个头进行解包,获取真实数据的长度
head_len = struct.unpack('i',header)[0]
head_dic = json.loads(client.recv(head_len).decode('utf-8'))
print(head_dic) # 对需要接受的数据 进行循环接收
total_size = head_dic['len']
recv_size = 0
res = b''
while recv_size < total_size:
data = client.recv(1024)
res += data
recv_size += len(data)
print(res.decode('gbk')) # subprocess拿回的数据是系统执行脚本后的,windows系统默认编码是gbk,如果用utf8等非gbk编码会乱码
#关于TCP三次挥手四次握手:https://www.cnblogs.com/huangxuanya/p/10796784.html
初识socket之TCP协议的更多相关文章
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...
- 二、网络编程-socket之TCP协议开发客户端和服务端通信
知识点:之前讲的udp协议传输数据是不安全的,不可靠不稳定的,tcp协议传输数据安全可靠,因为它们的通讯机制是不一样的.udp是用户数据报传输,也就是直接丢一个数据包给另外一个程序,就好比寄信给别人, ...
- 网络编程之Socket的TCP协议实现客户端与客户端之间的通信
我认为当你学完某个知识点后,最好是做一个实实在在的小案例.这样才能更好对知识的运用与掌握 如果你看了我前两篇关于socket通信原理的入门文章.我相信对于做出我这个小案列是完全没有问题的!! 既然是小 ...
- [转]socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...
- 网络Socket编程TCP协议例子
1.单线程TCP服务端 public class TcpChatServer { private Integer port=8000; private ServerSocket serverSocke ...
- python的socket的tcp协议编程
服务端代码如下: # _*_ coding:utf-8 _*_import socketimport datetimeHOST='0.0.0.0'PORT=3434 s=socket.socket(s ...
- 异常处理、socket基于TCP协议编程
一.异常处理 1.错误和异常 1.程序中难免出现错误,而错误分成两种 (1)语法错误(这种错误过不了Python解释器的语法检测,必须在程序执行前改正) #语法错误示范一 if #语法错误示范二 de ...
- socket套接字TCP协议传输-案例测试
术语: 套接字接口:socket,是一个IP地址和一个端口号的组合,套接字可以唯一标识整个Internet中的一个网络进程. TCP连接:一对套接字接口(一个用于接收,一个用于发送)可定义面向连接的协 ...
- 【转/TCP协议编程】 基于TCP的Socket 编程
基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...
随机推荐
- 吴裕雄--天生自然 PHP开发学习:PhpStorm的配置与安装
下载安装包
- Google Play来华 象征意义 跳板而已
Play来华 象征意义 跳板而已" title="Google Play来华 象征意义 跳板而已"> 每当有大事发生,伴随的就是接连不断的小道消息传出来.就像苹 ...
- Python---1基础介绍
因公司有自动化测试需求,开始自学python,跟着廖雪峰老师的教程,一边学习,一遍记笔记,将学习过程中,遇到的大大小小奇奇怪怪的问题,记录与此. 一.安装 Python是跨平台的,它可以运行在Wind ...
- PHP RabbitMQ 教程(三)
发布/订阅 我们在上一节创建了一个工作队列,并假定队列对应的任务传送给了某个客户端.在这一章节我们会做一些完全不一样的东西–我们会发送一条消息到多个消费者,也称之为"发布/订阅"模 ...
- SIM卡的消失会让运营商们恐慌吗?
中国移动.联通.电信三大运营商原本高高在上,每天乐滋滋地数钱数到手抽筋,但近年来移动互联网的快速普及,让运营商的制霸状态不复存在.成为众多互联网公司的"流量通道",语音.短信等业 ...
- C++走向远洋——57(项目二2、动物这样叫、抽象类)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 前端每日实战:152# 视频演示如何用纯 CSS 创作一个圆点错觉效果
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/gBwzKR 可交互视频 此视频是可 ...
- .netCore下的jwt的梳理-->借鉴于“老张的哲学”
之前在公司的项目中有用到jwt进行token验证,但是公司里用的框架已经集成好了jwt,所以对jwt的的了解不够清晰,感觉还是隔着一层.在看了“老张的哲学”的jwt部分后对jwt的认识才更加深刻了一些 ...
- 『配置』服务器搭建 Office Online Server2016 实现文档预览
博主有话说:这个过程我遇到了很多错误,所以出了一个错误整理文章,所以当你在配置过程中遇到了问题,可以先去这篇文章里找找!加油! 先打开我吧:https://www.cnblogs.com/pukua/ ...
- 【原创】(四)Linux进程调度-组调度及带宽控制
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...