套接字编程(TCP)
json模块补充
json保存的格式中,key值一定要用双引号隔开
import json
#把字典转成json格式字符串
dic = {'name': 'lqz', 'xx': False, 'yy': None}
print(type(dic)) #字典类型
dic_s = json.dumps(dic)
#json格式字符串
print(type(dic_s))#字符串类型(json形式)
dic_s2 = str(dic)
print(dic_s2)
print(type(dic_s2)) #是字符串,但是不是json格式的字符串
json.dumps() #字典转成字符串(json)
json.dump() #字典转成字符串(json),并存到文件中
json.loads() #把json格式字符串转成字典
json.load() #从文件中把json格式字符串转成字典
#不是json格式字符串转换,直接报错
ss = 'falseee'#会报错,普通字符串不能转换,(false,null,还有字典{},列表[]除外)
ss = 'false'#打印出来是bool值
print(json.loads(ss))
print(type(json.loads(ss)))
ss = {'name': 'lqz', 'xx':False, "yy":None}
print(json.dumps(ss))
print(type(json.dumps(ss)))
'''
{"name": "lqz", "xx": false, "yy": null}
<class 'str'>
'''
套接字编程(TCP)
###服务端
import socket
#买手机,实例化生成一个socket对象
server = socket.socket()
#绑定手机卡, 监听地址
server.bind(('127.0.0.1', 8003))
#监听,设置半连接池的大小
server.listen(5)
#连接循环
while True:
#一旦有个客户端来连接成功,会返回两个值,
# 如果没有,会卡在这
conn, addr = server.accept()
#通信循环
while True:
#卡在这,等着客户端来发
data = conn.recv(1024)
conn.send(data.upper())
conn.close()
server.close()
#客户端
import socket
client = socket.socket()
client.connect(('127.0.0.1', 8003))
#通信循环
while True:
msg = input('>>>:')
client.send(msg.encode('utf8'))
#client.send(bytes(msg, 'utf8')) #和上面的语句相同
data = client.recv(1024)
print(data)
client.close()
套接字编程(TCP)(解决粘包问题)
粘包问题:我的理解是,由于TCP协议是流式协议,像流水一般是连续的,所以有可能我的数据尾会和后面的数据头连在一块,形成粘包。(TCP协议会把数据量较小,时间间隔较短的数据,一次性发过去)
详细了解请>>>>https://www.cnblogs.com/nickchen121/p/11031027.html
#客户端_粘包
import socket
import struct
import json
client =socket.socket()
client.connect(('127.0.0.1', 8003))
while True: #通信循环
msg=input('开始接收?>>:')
#先收4个字节,取出头部的长度
head_len=struct.unpack('i',client.recv(4))[0]
#接收头部
dic=json.loads(client.recv(head_len))
l=dic['size']
name=dic['name']
count=0
data=b''
with open(name,'wb') as f:
while count<l:
if l<1024:
data_temp=client.recv(l)
else:
if l-count>=1024:
data_temp=client.recv(1024)
print(data_temp)
else:
data_temp=client.recv(l - count)
data+=data_temp
count+=len(data_temp)
f.write(data)
print('接收完成')
client.close()
#服务端_粘包
import socket
import os
import json
import struct
server=socket.socket()
server.bind(('127.0.0.1', 8003))
server.listen(5)
while True: #连接循环
#一旦有个客户端来连接成功,会返回两个值,如果没有,会卡在这
conn,addr=server.accept()
while True: #通信循环
#加个文件头
# {size:os.path.getsize(),name:'333.py',md5:asdfasdfasfd}
#计算一下头的长度
dic={'size':os.path.getsize('json模块.py'),'name':'xxxxxx.py'}
#转成bytes格式
dic_b=bytes(json.dumps(dic),'utf-8')
#获取长度
dic_b_len=len(dic_b)
obj=struct.pack('i',dic_b_len)
#发送四个字节
conn.send(obj)
#发头部内容
conn.send(dic_b)
#直接以+形式打开,就不需要转换了 rb
with open('json模块.py','rb') as f:
# conn.send(f.read())
# f 是文件对象,它可迭代
for line in f:
conn.send(line)
conn.close()
server.close()
套接字编程(TCP)的更多相关文章
- C++网络套接字编程TCP和UDP实例
原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1. 创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1) 创建套接字(so ...
- Linux 套接字编程 - TCP连接基础
第五章的内容,实现一个echo服务器和对应的客户端,主要收获: 0. TCP socket编程主要基本步骤 1. SIGCHLD信号含义(子进程退出时向父进程发送,提醒父进程对其状态信息进行一个获取) ...
- 【Python网络编程】利用Python进行TCP、UDP套接字编程
之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...
- 初探网络编程--TCP套接字编程演示
今天看了一下<计算机网络:自顶向下方法>,也就是计算机网络的教材的应用层一章,决定实现以下后面的Java C/S应用程序的例子,用来演示TCP和UDP套接字编程. 程序流程如下: 1.一台 ...
- 基本套接字编程(1) -- tcp篇
1. Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机 ...
- 套接字编程相关函数(2:TCP套接字编程相关函数)
本文摘录自<UNIX网络编程 卷1>. 基本套接字函数 socket函数 为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型.其定义如下: #in ...
- UDP,TCP的套接字编程的Python实现
UDP,TCP的套接字编程的Python实现 套接字:连接应用层和运输层,应用层的网络应用程序使用IP地址+端口号来标识自己,然后通过套接字调用运输层为其服务,网络应用程序只能指定自己要使用的网络类型 ...
- TCP和UDP套接字编程 (java实现)
在了解网络编程之前,我们先了解一下什么叫套接字 套接字即指同一台主机内应用层和运输层之间的接口 由于这个套接字是建立在网络上建立网络应用的可编程接口 因此也将套接字称为应用程序和网络之间的应用程序编程 ...
- 【UNIX网络编程(四)】TCP套接字编程具体分析
引言: 套接字编程事实上跟进程间通信有一定的相似性,可能也正由于此.stevens这位大神才会将套接字编程与进程间的通信都归为"网络编程",并分别写成了两本书<UNP1> ...
- 20181225 基于TCP/IP和基于UDP/IP的套接字编程
一.TCP/IP的套接字编程 服务器端代码: import socketserver = socket.socket() # 默认是基于TCP# 基于TCP的对象serve=socket.sock ...
随机推荐
- Jenkins Pipeline 参数详解
Pipeline 是什么 Jenkins Pipeline 实际上是基于 Groovy 实现的 CI/CD 领域特定语言(DSL),主要分为两类,一类叫做 Declarative Pipeline,一 ...
- Azure DevOps (TFS) 与 Office 集成
Azure DevOps Service 或者Azure DevOps Server 都支持与office工具集成,实现在office中完成工作项的导入导出和批量修改等功能.用户可以使用自己熟悉的of ...
- CW2 Software Maintenance Spec Sheet
CW2 Software Maintenance Spec SheetAcademic Year 2019/2020CW2 is about maintaining and extending a r ...
- Field redisTemplate in xxxxxx required a bean of type 'org.springframework.data.redis.core.RedisTemplate' that could not be found.
*************************** APPLICATION FAILED TO START *************************** Description: Fie ...
- ReentrantReadWriteLock三个线程读数据,三个线程写数据
/*** * 三个线程读数据,三个线程写数据 * */ public class ReadWriteLockTest { public static void main(String[] args) ...
- json工具类(一)——alibaba包
package com.ruoyi.common.utils.json; import java.util.HashMap; import java.util.List; import java.ut ...
- MVC+Ninject+三层架构+代码生成 -- 总结(五、Ninject)
1.在寫邏輯層前,需要弄好反轉控制,因框架沒有寫接口,所以Ninject只負責返回當前實例,有點類似共享設計模式. public sealed class IOCHelper { private st ...
- 在普通网页显示正常,加Https报This request has been blocked; the content must be served over HTTPS.,https网站加载http资源时,http资源被block
解决办法 :在html头加<meta http-equiv="Content-Security-Policy" content="upgrade-insecure- ...
- Laravel API跨域访问的实现步骤
本篇文章给大家带来的内容是关于Laravel API跨域访问的实现步骤,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 服务器A请求服务器B的接口,那么一般会出现跨域问题. 1 XML ...
- 搜索引擎elasticsearch监控利器cat命令
目录 一.Cat通用参数 二.cat命令 三.示例 查询aurajike索引下的总文档数和有效文档数 查询aurajike各分片的调度情况 一.Cat通用参数 参数名 指令示例 功能 Verbose ...