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协议的更多相关文章

  1. socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题

    Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...

  2. 二、网络编程-socket之TCP协议开发客户端和服务端通信

    知识点:之前讲的udp协议传输数据是不安全的,不可靠不稳定的,tcp协议传输数据安全可靠,因为它们的通讯机制是不一样的.udp是用户数据报传输,也就是直接丢一个数据包给另外一个程序,就好比寄信给别人, ...

  3. 网络编程之Socket的TCP协议实现客户端与客户端之间的通信

    我认为当你学完某个知识点后,最好是做一个实实在在的小案例.这样才能更好对知识的运用与掌握 如果你看了我前两篇关于socket通信原理的入门文章.我相信对于做出我这个小案列是完全没有问题的!! 既然是小 ...

  4. [转]socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题

    Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...

  5. 网络Socket编程TCP协议例子

    1.单线程TCP服务端 public class TcpChatServer { private Integer port=8000; private ServerSocket serverSocke ...

  6. python的socket的tcp协议编程

    服务端代码如下: # _*_ coding:utf-8 _*_import socketimport datetimeHOST='0.0.0.0'PORT=3434 s=socket.socket(s ...

  7. 异常处理、socket基于TCP协议编程

    一.异常处理 1.错误和异常 1.程序中难免出现错误,而错误分成两种 (1)语法错误(这种错误过不了Python解释器的语法检测,必须在程序执行前改正) #语法错误示范一 if #语法错误示范二 de ...

  8. socket套接字TCP协议传输-案例测试

    术语: 套接字接口:socket,是一个IP地址和一个端口号的组合,套接字可以唯一标识整个Internet中的一个网络进程. TCP连接:一对套接字接口(一个用于接收,一个用于发送)可定义面向连接的协 ...

  9. 【转/TCP协议编程】 基于TCP的Socket 编程

    基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...

随机推荐

  1. Catalan母函数法解表达式

  2. ES查询实例

    注:转载自https://www.cnblogs.com/yjf512/p/4897294.html 作者:叶剑锋 elasticsearch 查询(match和term) es中的查询请求有两种方式 ...

  3. Bug,项目过程中的重要数据

    作者|孙敏 为什么要做Bug分析? Bug是项目过程中的一个有价值的虫子,它不只是给开发的,而是开给整个项目组的. 通过Bug我们能获得什么? 积累测试方法,增强QA的测试能力,提升产品质量 发现项目 ...

  4. 阿里大数据竞赛season1 总结

    关于样本测试集和训练集数量上,一般是选择训练集数量不小于测试集,也就是说训练集选取6k可能还不够,大家可以多尝试得到更好的效果: 2. 有人提出归一化方面可能有问题,大家可以查查其他的归一化方法,但是 ...

  5. 【Android TimeCat】 解决cannot resolve symbol R

    莫名其妙出现了,鬼知道怎么来的. 解决方法总结 1. 推荐 解决90%的情况: Build->Clean ProjectBuild->Rebuild Project 2. 不常见 Andr ...

  6. Mac开发环境部署

    1. 安装 Xcode command line tools xcode-select --install 2. 安装 Homebrew 安装 Homebrew 之前,必须先安装 Xcode Comm ...

  7. 7-2 jmu-python-九九乘法表(矩形) (10 分)

    本题目要求输出如下图所示的九九乘法表 注:乘积要求做格式控制,占4个位置的宽度 输入样例: 无 输出样例: 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8= ...

  8. 实验一 Linux系统与应用准备

    实验一 Linux系统与应用准备 项目 内容 作业归属 班级课程 作业要求 课程作业要求 学号-姓名 17041419-刘金林 作业学习目标 1.学习博客园软件开发者学习社区使用技巧和经验:2.学习M ...

  9. python数据转换

    主要内容 1:数字类型:算术运算 bool:判断真假,运用场景在逻辑运算里较多,比如while循环了. 字符串:可以索引取值,可以嵌套 列表:存放任意数据类型,因为是按序存放的,故可以索引取值, 字典 ...

  10. Vue项目三、项目中碰到的问题详解

    一.组件的划分创建 方法一: 把页面上需要复用的模块,拆分成组件.比如,页面的header.footer.面包屑.弹出框等拆分成组件.所以在src中应该有一个文件夹(components)专门放这些会 ...