套接字编程(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 ...
随机推荐
- Codeforces 126B Password(Z算法)
题意 给定一个字符串 \(s\) ,求一个子串 \(t\) 满足 \(t\) 是 \(s\) 的前缀.后缀且在除前缀后缀之外的地方出现过. \(1 \leq |s| \leq 10^6\) 思路 \( ...
- 初探Java设计模式5:一文了解Spring涉及到的9种设计模式
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 【操作系统之十四】iptables扩展模块
1.iprange 使用iprange扩展模块可以指定"一段连续的IP地址范围",用于匹配报文的源地址或者目标地址.--src-range:匹配报文的源地址所在范围--dst-ra ...
- App启动时间分析
iOS应用的启动可分为pre-main阶段和main()阶段. 1.pre-main阶段 可以通过配置Scheme,设置DYLD_PRINT_STATISTICS为1,来打印pre-main阶段的时间 ...
- linux 成功安装oracle后,为其创建一个登录账户
成功安装oracle后,创建一个登录账户 1.切换到oracle用户下 su -l oracle 2.使用sysdba账户登录: sqlplus / as sysdba 3.创建用户 语法:CREAT ...
- mysql性能的检查和优化方法
这个命令可以看到当前正在执行的sql语句,它会告知执行的sql.数据库名.执行的状态.来自的客户端ip.所使用的帐号.运行时间等信息 mysql在遇到严重性能问题时,一般都有这么几种可能:1.索引没有 ...
- 【转帖】分布式事务之解决方案(XA和2PC)
分布式事务之解决方案(XA和2PC) https://zhuanlan.zhihu.com/p/93459200 博彦信息技术有限公司 java工程师 3. 分布式事务解决方案之2PC(两阶段提交 ...
- Dart:3.Dart运算符、流程控制
一 . 运算符 以下列出 Dart 的运算符,从高到低按照优先级排列: 描述 运算符 一元运算符(后置) expr++ expr-- () [] . ?. 一元运算符(前置) -expr !expr ...
- dotnet中文字符工具类
支持繁体简体互换. using System; using System.Collections.Generic; using System.IO; using System.Linq; using ...
- jquery点击放大图片
参考地址:https://blog.csdn.net/qq_42249896/article/details/86569636 一.应用场景:点击图片可以对图片进行放大显示. 二.实现代码: 说明:我 ...