python socket实现多个连接
socket实现多个连接
前戏很重要~~
在实现多个连接之前,先实现下多次发送和接收数据。
如果要多次接收数据,那么在服务器端的接收和客户端的发送部分就必须使用循环。
以下代码在python3.5下运行。
服务器端:
#服务器端 import socket
server = socket.socket()
server.bind(('localhost',6969))#绑定要监听的端口
server.listen() #监听 conn,address = server.accept() #等待接收数据 返回两个值,一个是对方的标记位,一个是对方的地址 while True:
data = conn.recv(1024) #接收数据,谁发数据给我就用谁的标记位接收
print(data)
conn.send(data.upper()) #发送数据,要发给谁就用谁的标记位 server.close()
客户端:
#客户端
import socket client = socket.socket()#声明socket类型,同时生成socket连接对象 client.connect(('localhost',6969))
while True:
msg = input('>>').strip()
client.send(msg.encode("utf-8")) #发送数据
data = client.recv(1024) #接收指定大小的字节
print(data.decode()) #
client.close()
直接把用户输入的内容发送给服务器。
执行结果:
#=========客户端========
>>你好
你好
>>中国
中国
>>hello world
HELLO WORLD
>>
Process finished with exit code 1 #========服务器端=========
b'\xe4\xbd\xa0\xe5\xa5\xbd'
b'\xe4\xb8\xad\xe5\x9b\xbd'
b'hello world'
Traceback (most recent call last):
...
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 Process finished with exit code 1
可以看到这里已经实现了多少发送和接收的效果,但是如果客户端断开连接,服务器端也被迫中断。
在python2下如果客户端突然中断,服务器端并不会直接中断。
以下实验在Python2环境下。
单个客户端通信
服务器端代码:
#-*-coding:utf-8 -*- import socket
server = socket.socket()
server.bind(('localhost',6969))#绑定要监听的端口
server.listen(1) #监听 最多可以挂起多少个连接 conn,address = server.accept() #等待接收数据 返回两个值,一个是对方的标记位,一个是对方的地址 while True:
data = conn.recv(1024) #接收数据,谁发数据给我就用谁的标记位接收
print('recv:',data)
conn.send(data.upper()) #发送数据,要发给谁就用谁的标记位 server.close()
客户端代码:
#-*- coding=utf-8 -*-
#客户端
import socket client = socket.socket()#声明socket类型,同时生成socket连接对象 client.connect(('localhost',6969))
while True:
msg = raw_input('>>').strip() client.send(msg.encode("utf-8")) #发送数据 data = client.recv(1024) #接收指定大小的字节
print('recv:',data.decode()) #
client.close()
开始通信:
首先客户端先发送数据:
在看服务器端接收:
发送接收正常。
现在用CTRL+c断开客户端之后服务器端的情况。
修改服务器端代码, 加一个统计,查看下什么时候开始死循环的。
import socket
server = socket.socket()
server.bind(('localhost',6969))#绑定要监听的端口
server.listen(1) #监听 conn,address = server.accept() #等待接收数据 返回两个值,一个是对方的标记位,一个是对方的地址
count=0 #统计 条件
while True:
data = conn.recv(1024) #接收数据,谁发数据给我就用谁的标记位接收
print('recv:',data)
conn.send(data.upper()) #发送数据,要发给谁就用谁的标记位
count+=1
if count >10:
break
server.close()
客户端发送接收数据结果。
服务器端发送接收数据结果。
因为客户端断开,服务器端接收的都是空。
优化服务器端,断开就退出
#-*-coding:utf-8 -*- import socket
server = socket.socket()
server.bind(('localhost',6969))#绑定要监听的端口
server.listen(1) #监听 conn,address = server.accept() #等待接收数据 返回两个值,一个是对方的标记位,一个是对方的地址 while True:
data = conn.recv(1024) #接收数据,谁发数据给我就用谁的标记位接收 print('recv:',data)
if not data:
print('客户端断开连接...') #客户端断开就退出
break
conn.send(data.upper()) #发送数据,要发给谁就用谁的标记位 server.close()
客户端:
服务器端:
客户端断开,服务器直接退出。
多个客户端通信
怎么让服务器端一直保持接收状态呢?
想要 一直保持接收状态就要在客户端断开之后,继续执行server.accept()。
对的。在server.accept()之前在加一个while,当一个客户端断开了之后break,跳出最里层的循环的时候,又继续server.accept()。
#-*-coding:utf-8 -*-
import socket
server = socket.socket()
server.bind(('localhost',6969))#绑定要监听的端口
server.listen(1) #监听
while True:
conn,address = server.accept() #等待接收数据 返回两个值,一个是对方的标记位,一个是对方的地址 while True:
data = conn.recv(1024) #接收数据,谁发数据给我就用谁的标记位接收
print('recv:',data)
if not data:
print('客户端断开连接...')
break
conn.send(data.upper()) #发送数据,要发给谁就用谁的标记位 server.close()
修改并启动服务器端代码。
客户端1
客户端2
服务器端
断开客户端1之后:
服务器端
客户端2
简单的实现了能多个连接,但是只能同时跟一个客户端通信的功能。。
模拟SSH
既然可以发数据过来,那么也可以把这个数据做为命令执行。
首先修改服务器端,发送过来的命令执行并把结果返回给客户端。
服务器端代码:
#-*-coding:utf-8 -*-
import socket
import os
server = socket.socket()
server.bind(('localhost',6969))#绑定要监听的端口
server.listen(1) #监听
while True:
conn,address = server.accept() #等待接收数据 返回两个值,一个是对方的标记位,一个是对方的地址 while True:
data = conn.recv(1024) #接收数据,谁发数据给我就用谁的标记位接收
print('recv:',data)
if not data:
print('客户端断开连接...')
break
res = os.popen(data).read()
conn.send(res) #发送数据,要发给谁就用谁的标记位 server.close()
客户端代码:
#-*- coding=utf-8 -*-
#客户端
import socket client = socket.socket()#声明socket类型,同时生成socket连接对象 client.connect(('localhost',6969))
while True:
msg = raw_input('>>').strip() client.send(msg.encode("utf-8")) #发送数据 data = client.recv(1024) #接收指定大小的字节
print(data) #
client.close()
执行客户端
服务器端
这里是有返回的,如果一条命令的返回数据大于了定义的接收的大小,那么这次客户端接收的数据就不全,剩余的数据要等到服务器下次发送才能接收过来。比如定义的接收数据大小是1024,那么一次只能接收1024字节的数据。其余的数据都是在缓冲区里面。因为客户端不知道要接收几次。所以服务器端应该把本次要发送的数据大小先发过来,客户端就知道要接收几次了。
python socket实现多个连接的更多相关文章
- python通过socket实现多个连接并实现ssh功能详解
python通过socket实现多个连接并实现ssh功能详解 一.前言 上一篇中我们已经知道了客户端通过socket来连接服务端,进行了一次数据传输,那如何实现客户端多次发生数据?而服务端接受多个客户 ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- python socket和socketserver
Python提供了两个基本的socket模块.一个是socket,它提供了标准的BSD Socket API:另一个是socketServer,它提供了服务器中心类,可以简化网络服务器的开发. 下面先 ...
- Python socket编程之二:【struct.pack】&【struct.unpack】
import struct """通过 socket 的 send 和 recv 只能传输 str 格式的数据""" "" ...
- Python Socket,How to Create Socket Server? - 网络编程实例
文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...
- Python Socket,How to Create Socket Cilent? - 网络编程实例
文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...
- Python Socket通信原理
[Python之旅]第五篇(一):Python Socket通信原理 python Socket 通信理论 socket例子 摘要: 只要和网络服务涉及的,就离不开Socket以及Socket编 ...
- Python Socket单线程+阻塞模式
Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要: 前面第五篇(一)中的一个Socket例子其实就是 ...
随机推荐
- PAT天梯赛 L1-050 倒数第N个字符串
题目链接:点击打开链接 给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增.例如当 L 为 3 时,序列为 { aaa, ...
- join与os.path.join
Python中有join和os.path.join()两个函数,具体作用如下: join:连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串os.path.joi ...
- [转载]什么情况下应该设置 cudnn.benchmark = True?
总的来说,大部分情况下,设置这个 flag 可以让内置的 cuDNN 的 auto-tuner 自动寻找最适合当前配置的高效算法,来达到优化运行效率的问题. 一般来讲,应该遵循以下准则: 如果网络的输 ...
- node.js 设置 淘宝 镜像
npm config set registry "https://registry.npm.taobao.org" npm info underscore (如果上面配置正确这个命 ...
- sublime 配置主题
默认主题可能看不清楚: 安装 PackageResourceViewer 安装Soda 主题 setting中加入 "theme": "Soda Light 3.subl ...
- 设置IIS,使客户端访问服务器上的文件
1.打开IIS控制器——"运行-cmd-inetmgr-回车“ 2.选中要设置的网站 3.右键,添加虚拟目录 4.如上图所示,在别名处输入文件目录的名称,物理路径要选择文件在磁盘上的存储根目 ...
- hive distcp数据同步
-- 同步HDFS数据(shell执行) hadoop distcp \ -Dmapred.job.queue.name=queue_name \ -update \ -skipcrccheck hd ...
- es6.3学习笔记
es版本发布相当快,从1.x到2.x,再直接到5.x,6.x 索引这个词在es中有多重意思: 索引(名词):一个索引类似于传统数据库中的一个索引,用于存储关系型文档.索引的复数为indexes或ind ...
- 015 3Sum 三个数的和为目标数字
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- 提高Service提高进程优先级别,不被系统容易杀死
1.首先要了解lowmemroykiller机制 在Android的lowmemroykiller机制中,会对于所有进程进行分类,对于每一类别的进程会有其oom_adj值的取值范围,oom_adj值 ...