python socket 套接字编程 单进程服务器 实现多客户端访问
服务器:
import socket
#单进程服务器 实现多客户端访问 IO复用
#吧所有的客户端套接字 放在一个列表里面,一次又一次的便利过滤
#这就是apache: select模型 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #设置端口复用
#AF_INET: IPV4
#AF_INET6: IPV6
#SOCK_STREAM: TCP
#SOCK_DGRAM: UDP
Host = ''
port = 23333
server.bind((Host,port))
#服务器绑定端口 8080
server.listen(5)
#服务器同时监听5个 最大链接数 5 print('[+] server open') c_server = {}
#定义一个全局字典
server.setblocking(0)
#设置服务器recv接受信息和send发送信息为非阻塞状态(默认为阻塞状态)
#是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。
while True:
try:
try: client,c_addr = server.accept() except BlockingIOError:
#无法立即完成一个非阻止性套接字操作。
if not c_server:
#如果字典为空
continue
#重新接收套接字
pass
else:
client.setblocking(0)#设置套接字属性为非阻塞
#是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。
#[WinError 10035] 无法立即完成一个非阻止性套接字操作。
c_server[client] = c_addr#以字典形式存储新链接的套接字
print('[+] from',c_addr)
for a in list(c_server.keys()):
#这里将字典的keys取出来 在列表化,在没有信息的时候删除套接字了
try:
msg = a.recv(1024).decode('utf-8')
#非阻塞接受消息,但是如果客户端不马上发送,就会报错,所以设置一个延迟接收
except BlockingIOError as e:
continue if not msg:
print('[%s] closed'%(c_server[a][0]))
a.close()
del c_server[a]
continue
print("来自%s的消息: %s"%(c_server[a][0],msg))
a.send(msg.encode('utf-8'))
#发送重复的消息
except KeyboardInterrupt:
break server.close()
客户端:
#coding:utf-8 import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#创建一个客户端链接,socket.AF_INET代表ipv4,socket.SOCK_STREAM代表tcp套接字
client.connect(('127.0.0.1',23333))
#客户端链接
print('[+] 链接成功')
#链接成功显示
while True:
msg = input('>>>')
if msg == 'quit':
#如果输入的信息是quit 就退出链接
break
if len(msg) == 0:#如果直接输入的一个回车的话
#就重新输入,因为不能发送空 ,发送空的花 客户端会卡住
continue
client.send(msg.encode('utf-8'))
#客户端发送信息msg 以utf8格式发送数据
data = client.recv(1024).decode('utf-8')
if not data:
#如果数据为空/0
#服务器主动断开s
break
print('[+] 服务器主动断开了链接......') print('服务器发来:',data) print('[+] 链接关闭...') client.close()
服务器就是apache: select模型
python socket 套接字编程 单进程服务器 实现多客户端访问的更多相关文章
- Python Socket套接字编程
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- socket 套接字编程
今日内容 socket 套接字编程 简易服务端与客户端代码实现 通信循环 黏包现象(TCP协议) 报头制作.struct 模块.封装形式 内容详细 一.socket 套接字编程 实现一款能够进行数据交 ...
- socket套接字编程 HTTP协议
socket套接字编程 套接字介绍 1. 套接字 : 实现网络编程进行数据传输的一种技术手段 2. Python实现套接字编程:import socket 3. 套接字分类 >流式套接 ...
- linux网络环境下socket套接字编程(UDP文件传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- linux网络编程-(socket套接字编程UDP传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- Python的套接字、IPv4和简单的客户端/服务器编程
#!/usr/bin/env python # -*- coding: utf-8 -*- import socket from binascii import hexlify import sys ...
- 基于TCP协议的socket套接字编程
目录 一.什么是Scoket 二.套接字发展史及分类 2.1 基于文件类型的套接字家族 2.2 基于网络类型的套接字家族 三.套接字工作流程 3.1 服务端套接字函数 3.2 客户端套接字函数 3.3 ...
- day31 socket套接字编程
为什么要有套接字编程? 在上节课的学习中,我们学习了OSI七层协议,但是如果每次进行编程时我们都需要一层一层的将各种协议使用在我们的程序中,这样编写程序实在是太麻烦了,所以为了让程序的编写更加的简单, ...
- Linux之socket套接字编程20160704
介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UD ...
随机推荐
- Android Studio 快捷键总结(OS X)
Action shortcut key 解释 跳转到类 cmd+0 跳转到文件 cmd+shift+0 跳转到函数 cmd+alt+0 最近打开的文件 cmd+e 最近编辑的文件 ...
- 通过spring抽象路由数据源+MyBatis拦截器实现数据库自动读写分离
前言 之前使用的读写分离的方案是在mybatis中配置两个数据源,然后生成两个不同的SqlSessionTemplate然后手动去识别执行sql语句是操作主库还是从库.如下图所示: 好处是,你可以人为 ...
- QMessageBox的使用
/** 使用非静态API,属性设置API **/ QMessageBox msgBox; msgBox.setWindowTitle("Note");/** 设置标题 **/ ms ...
- Java设计模式学习记录-外观模式
前言 这次要介绍的是外观模式(也称为门面模式),外观模式也属于结构型模式,其实外观模式还是非常好理解的,简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可以不必关系具体执行了哪些业务,而只 ...
- PHP 九九乘法表的4种表达方式
九九乘法表的四种不同表现形式 x轴对称: //第一种 for($i=1;$i<=9;$i++){ for($j=1;$j<=$i;$j++) { echo $i.'x'.$j.'='.$i ...
- PHP语言的优缺点
PHP是一种跨平台的服务器端的嵌入式脚本语言. 优点: 实用性强 它大量地借用C.Java 平台广 支持数据种类多 有成熟框架 ,面向对象体系 PHP是完全免费 开源 缺点: 语法不严谨, 弱类型语言 ...
- SQL语句简单笔记
Create database database name://创建数据库 Show databases dbName: //显示所有数据库 Create table tableName: //创建表 ...
- CentOS 7 安装 .Net Core 2.0 详细步骤
轰轰烈烈的Core 热潮,从部署环境开始.参照了网上不少前辈的教程,也遇到不少的坑,这边做个完整的笔记. 一.构建.Net core 2的应用程web发布,因为是用来测试centos上的core 环境 ...
- 移动端地区选择控件mobile-select-area
由于之前的[js开源组件开发]js手机联动选择地区仿ios 开源git 很受欢迎,于是我又对其进行了一些优化,包括可选的范围变大了,添加了默认空首地址的功能,也添加了更多api参数,首先我们先来看下这 ...
- 【协议】1、tcp,http,socket协议介绍
1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. ...