python socket单线程通信
注意 socket通信默认的情况下是属于阻塞形式通信,在recv与accept函数会进行阻塞
1.客户端正常退出的情况下,server端的con的通道会正常的关闭,recv直接赋值为空
2.在windows下,使用pycharm的强制终端客户端,会造成,con通道的破坏,造成服务器端的异常(可以通过捕获异常来避免),在linux程序端,不会出现该问题
3.在发送数据的时候,send为空的情况下,在recv下,默认就是不处理,还处在阻塞的状态。 因此规定不能发送为空
4.socket通信的在py3里面,只能发送bytes类型 str-->bytes: bytes(str,"utf-8")
bytes-->str:str(bytes"utf-8")
一.基础代码
server端:
import socket server = socket.socket() server.bind(("127.0.0.1",6969)) server.listen()con,addr=server.accept() while True:data=con.recv(1024)data_uper=str(data,"utf-8").upper()con.send(bytes(data_uper,"utf-8"))
View Code
client端
import socket client = socket.socket() client.connect(('127.0.0.1',6969)) x=input(">>:") client.send(bytes("good 你好",encoding="utf-8")) data=client.recv(1024) print(str(data,"utf-8"))
View Code
二.不间断聊天代码实现:
server
import socket server = socket.socket() server.bind(("127.0.0.1",6969)) server.listen() while True:con,addr=server.accept()print(addr)while True:try:data=con.recv(1024)#在程序正常退出,也就是con的tcp连接正常中断,data直接为0执行下一步except Exception as e:break #防止在windows下,强制关闭,con通道错误而报错,linux下不用这样if not data:breakprint(str(data,"utf8"))x=input(">:")con.send(bytes(x,"utf-8"))
View Code
client
import socket client = socket.socket() client.connect(('127.0.0.1',6969)) while True:x=input(">>:")if not x:continue #解决在阻塞模型下,直接回车卡住的bugclient.send(bytes(x,encoding="utf-8"))data=client.recv(1024)print(str(data,"utf-8"))
View Code
三.实现类似ssh的命令。实现大数据发送的基础以及粘包的问题:
在send的时候,缓存区会不断的发送数据,但是recv接受的数据大小每次都有界限。也就是说每次发送的数据过量,一次recv是接受不完的,因为调用了解决办法:
1.在发送端,先发送要发送的数据的大小
2.在接受端,通过接受的数据 与 接受的数据大小 进行比较而接入不断的接受
坑:1.int 与 bytes 不能直接转换。 2.len的大小 在str类型 与 bytes类型之间的大小是不一致的 3.在两次send直接会出现粘包的问题(通过一次recv最来解决)
粘包是因为两次send在缓存区,会一次性发送
server端
import os import socket server = socket.socket() server.bind(("127.0.0.1",6969)) server.listen() while True:con,addr=server.accept()print(addr)while True:try:data=con.recv(1024)#在程序正常退出,也就是con的tcp连接正常中断,data直接为0执行下一步except Exception as e:break #防止在windows下,强制关闭,con通道错误而报错,linux下不用这样if not data:breakcmd_line=str(data,"utf-8")cmd_result=os.popen(cmd_line,"r").read()if not cmd_result: #当os.popen执行非系统命令时,返回值为空cmd_result = "未知命令"cmd_result=bytes(cmd_result,"utf-8")cmd_result_len=bytes(str(len(cmd_result)),"utf-8")#int与bytes之间不能直接转换。#len 在str与bytes类型之间的长度是不一致的!!!print("发送数据长度",str(cmd_result_len,"utf-8"))con.send(cmd_result_len)flag=con.recv(1024) #通过一次recv来解决两个send之间粘包的问题。con.send(cmd_result)
View Code
clinet端
import socket client = socket.socket() client.connect(('127.0.0.1',6969)) while True:x=input(">>:")if not x:continueclient.send(bytes(x,encoding="utf-8"))recv_len=int(str(client.recv(1024),"utf-8"))client.send(bytes("ok","utf-8"))print(recv_len)data=bytes()while len(data) != recv_len:data += client.recv(1024)print(str(data,"utf-8"))
View Code
四、实现文件下载:
在python中数据都是bytes类型,打开文件 以rb,wb的类型打开。
1.在服务方:
通过os模块,读取文件的大小,使用f.read(size)读取指定数量,通过该大小来循环发送数据
2.在客户端
先接受数据的大小,通过已经接受的数据 与 文件大小来判断大小
服务器端
import os import socket server = socket.socket() server.bind(("127.0.0.1",6969)) server.listen()while True:con,addr = server.accept()while True:cmd=str(con.recv(1024),"utf-8")print(cmd)cmd = cmd.split()if cmd[0] == "push":print(cmd[0])f = open(cmd[1], "rb")file_size = os.stat(cmd[1]).st_sizeprint(file_size)con.send(bytes(str(file_size), encoding="utf-8"))flag=con.recv(1024)# for line in f:# con.send(line)data_size=0while file_size != data_size:data=f.read(1024)con.send(data)data_size += len(data)print(data_size)print("发送完毕")f.close()
View Code
客户端
import socket import os client = socket.socket() client.connect(("127.0.0.1",6969))while True:cmd=bytes(input("->:"),"utf8")client.send(cmd)file_size = int(str(client.recv(1024), "utf-8"))client.send("ok".encode("utf-8"))data_len = 0f = open("1.new.avi","wb")while file_size != data_len:data = client.recv(1024)data_len += len(data)f.write(data)print(data_len)f.close()
View Code
五、多client并发连接 sockserver
创建sockserver四大步骤:
- First, you must create a request handler class by subclassing the
BaseRequestHandler
class and overriding itshandle()
method; this method will process incoming requests. - Second, you must instantiate one of the server classes, passing it the server’s address and the request handler class.
- Then call the
handle_request()
orserve_forever()
method of the server object to process one or many requests. - Finally, call
server_close()
to close the socket.
import socketserverclass MyTCPHandler(socketserver.BaseRequestHandler):"""The request handler class for our server.It is instantiated once per connection to the server, and mustoverride the handle() method to implement communication to theclient."""def handle(self):# self.request is the TCP socket connected to the clientself.data = self.request.recv(1024).strip()print("{} wrote:".format(self.client_address[0]))print(self.data)# just send back the same data, but upper-cased self.request.sendall(self.data.upper())if __name__ == "__main__":HOST, PORT = "localhost", 9999# Create the server, binding to localhost on port 9999server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)# Activate the server; this will keep running until you# interrupt the program with Ctrl-Cserver.serve_forever()
View Code
这里还不能直接使用:
我们调用多线程的类 就可以使用了
server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)
转载于:https://www.cnblogs.com/louhui/p/7906802.html
python socket单线程通信相关推荐
- python共享内存通信mapofview_python map eval strPython socket模块实现的udp通信功能示例...
本文实例讲述了Python socket模块实现的udp通信功能.分享给大家供大家参考,具体如下: socket介绍 socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要 ...
- python通信原理实验报告_【Python之旅】第五篇(一):Python Socket通信原理-阿里云开发者社区...
只要和网络服务涉及的,就离不开Socket以及Socket编程,下面就说说Python Socket通信的基本原理. 1.Socket socket也称作"套接字",用于描述IP地 ...
- Python Socket网络编程(二)局域网内和局域网与广域网的持续通信
目录 前言 IP地址 简介 公有IP 私有IP 局域网之间网络通信 前提 功能描述 源码 运行结果 局域网与广域网网络通信 前提 源码 结语 前言 本系列博客是笔者学习Python Socket的过程 ...
- python实现socket简单通信
python实现socket简单通信 首先先来简单介绍下socket: (具体更详细介绍的可以在网上找找,都讲得非常详细),这里主要是我自己的一些理解. socket是在应用层与传输层之间的一个抽象层 ...
- python socket通信 多进程_python实现多进程通信实例分析
操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...
- python socket双向通信_Python socket实现多对多全双工通信的方法
服务器:#server.py #!/usr/bin/env python #-*-coding:utf-8-*- import sys import struct#将字符串打包为二进制流进行网络传输 ...
- python socket编程 实现简单p2p聊天程序
转载自:https://www.cnblogs.com/wuxie1989/p/7204887.html python socket编程 实现简单p2p聊天程序 目标是写一个python的p2p聊天的 ...
- Python Socket编程(待完成)
socket简介 网络套接字是用于在计算机网络上的节点内发送或接收数据的内部端点.具体来说,它是一个网络软件端点的代表(协议栈),例如表中的条目(列出通信协议.目标.状态等),是系统资源的一种形式. ...
- Python Socket请求网站获取数据
Python Socket请求网站获取数据 ---阻塞 I/O ->收快递,快递如果不到,就干不了其他的活 ---非阻塞I/0 ->收快递,不断的去问,有没有送到,有没有送到,. ...
最新文章
- js获取时间(yyyy-MM-dd HH:mm:ss)
- [Angular 2] Template property syntax
- sas Data步数据读取流程详解
- c++起始(名词修饰,extern “C” ,引用)
- java 位运算取8位_Java 9 AOT 试用:仅支持 64 位 Linux和java.base 模块编译
- php读入输入_php-读取用户输入并检查数据类型
- tensorflow用c语言,安装TensorFlow C语言版
- halcon学习和实践(开篇)
- 什么是MTU?为什么MTU值普遍都是1500?
- intent传递集合数据
- 操作系统学习笔记(二十二)~虚拟存储技术+请求分页+页面置换
- 今天是第几天python_今_今是什么意思_今字怎么读_今的含义_今字组词-新东方在线字典...
- FAST角点检测算法(二)- 非极大值抑制筛选fast特征点
- MYSQL常用的数学函数
- 你真的了解重排和重绘吗?
- mySql 修改字段属性
- Linux mv移动文件,提示No such file or directory
- 陈景润定理与哥德巴赫猜想
- smtp协议匿名发送邮件 无需密码、授权码
- 出租车管理系统源码php,出租车管理系统((SSH+MYSQL+JSP))
热门文章
- 一款基于jquery ui的动画提交表单
- jQuery+Ajax+PHP 制作简单的异步数据传输(测试用户名是否可用)
- MySQL基本语句与数据类型
- bzoj 3100 排列
- 限定filesize的数据泵导入导出操作案例
- LeetCode---------Longest Substring Without Repeating Characters解法
- C# 数组 二维数组
- Yii ActiveRecord 的via和viaTable示例
- hashMap与arrayList,linkedList,hashTable的区别
- 04、数据绑定控件 ListBox 的一个 Bug