25 python 初学(socket,socketserver)
参考blog :www.cnblogs.com/yuanchenqi/articles/5692716.html
1. sk = socket.socket()
里面有两个重要的参数,family 和 type
type:
SOCK_STREAM : tcp 默认
SOCK_DGRAM :udp
family:
family = AF_INET : 服务器之间的通信(默认)
family = AF_INET6 : 服务器之间的通信
family=AF_UNIX:unix不同进程间通信
server 下的方法:
bind() 、 listen() 、 accept()
recv() 、 send() 、 sendall()
close()
client 下的方法:
connect()
recv() 、send( string ) 、sendall() # 传送的类型一定是 byte 类型
close()
# _author: lily
# _date: 2019/1/25 # server 端 import socket sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(3)
print('waiting')
# print(sk)
conn, address_client = sk.accept() while 1:
send_data = input('input>>')
if send_data == 'exit':
break
conn.send(bytes(send_data, 'utf8'))
rec_data = conn.recv(1024)
print(str(rec_data, 'utf8')) conn.close()
# _author: lily
# _date: 2019/1/25 # client 端 import socket
sk = socket.socket()
# print(sk) adress = ('127.0.0.1', 8000)
sk.connect(adress) while 1:
rec_data = sk.recv(1024) # 会阻塞,直到收到数据
if not rec_data:
break
print(str(rec_data, 'utf8'))
send_data = input('>>')
sk.send(bytes(send_data, 'utf8')) sk.close()
socket 流程:
1. 先开启服务端,bind 绑定ip 和端口;
2. 其次 listen 监听,里面的数字表示有多少客户端可排队(不包括当前正在通信的,排队表示可连接但是不能通信。比如设定上限为3,当第四个客户端来连接时就会报错无法连接)
3. 接着需要 accept(),阻塞等待连接。accept 接受到的值是对方的 sk,进行连接(相当于两端建立了一个通道,server 和 client 都使用的这个通道,只是各自的命名不同)。
4. 保证一收一发原则
5. 关闭时关闭这个通道。 conn.close()
1. 客户端进行连接,先创建一个socket 对象 sk
2. sk 使用 connect 连接服务端
3. 保证一收一发原则
4. 关闭时 sk.close()
粘包现象的解决办法:
加一个 conn.recv(1024) 进行阻塞,将两个连续的conn.send()分隔开
编码拾遗:
- str:unicode
- bytes:十六进制
- 由 str -> bytes:编码
s = ‘hello 你好’
b = bytes(s, ‘utf8’)
b2 = s.encode(‘utf8’) # 两个是一样的
- 由 bytes -> str:解码
s2 = str(b2, ‘utf8’)
s2 = b2.decode(‘utf8’)
socketserver:
1. 调用模块
2. 自己写一个类,继承 socketserver.BaseRequestHandler,并重写 handle()方法
3. main 方法内:
调用 socketserver.ThreadingTCPServer,创建一个实例
# _author: lily
# _date: 2019/1/28
# Server 端 import socketserver class myserver(socketserver.BaseRequestHandler):
# 主要逻辑
def handle(self):
print('server starting...')
while True:
conn = self.request
print(self.client_address)
while True:
client_data = conn.recv(1024)
print(str(client_data, 'utf8'))
print('waiting')
send_data = input('input>>')
conn.sendall(bytes(send_data, 'utf8'))
# conn.sendall(client_data)
conn.close() if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1', 8091), myserver)
server.serve_forever()
# _author: lily
# _date: 2019/1/28
# client 端 import socket address = ('127.0.0.1', 8091)
sk = socket.socket()
sk.connect(address)
print('client starting...') while True:
data = input('input>>')
sk.sendall(bytes(data, 'utf8'))
recv_data = sk.recv(1024)
print(str(recv_data, 'utf8')) sk.close()
实例:
cmd 命令:
server 端:
# _author: lily
# _date: 2019/1/26 import socket
import subprocess sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(3)
print('waiting')
# print(sk)
conn, address_client = sk.accept() while 1: try:
rec_data = conn.recv(1024)
except Exception:
break
if not rec_data:
break
print('--client message--', str(rec_data, 'utf8')) a = subprocess.Popen(str(rec_data, 'utf8'), shell=True, stdout=subprocess.PIPE)
cmd_result = a.stdout.read()
result_len = bytes(str(len(cmd_result)), 'utf8')
conn.sendall(result_len)
conn.recv(1024)
conn.sendall(cmd_result) # send_data = input('input>>')
# conn.send(bytes(send_data, 'utf8')) conn.close()
client 端:
# _author: lily
# _date: 2019/1/26 import socket
sk = socket.socket()
# print(sk) adress = ('127.0.0.1', 8000)
sk.connect(adress) while 1: send_data = input('>>')
if send_data == 'exit':
break
sk.send(bytes(send_data, 'utf8')) result_len = int(str(sk.recv(1024), 'utf8'))
print(result_len)
rec_data = bytes()
sk.sendall(bytes('ok', 'utf8'))
while len(rec_data) != result_len:
rec_data += sk.recv(1024) # 会阻塞,直到收到数据
print(str(rec_data, 'gbk')) sk.close()
ftp 传输:
server 端:
# _author: lily
# _date: 2019/1/27 import socket
import subprocess
import os sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(3)
print('waiting')
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) while 1:
conn, address_client = sk.accept()
while 1:
data = conn.recv(1024)
cmd, filename, filesize = str(data, 'utf8').split('|')
path = os.path.join(BASE_DIR, 'picture', filename)
filesize = int(filesize) f = open(path, 'ab') has_receive = 0
while has_receive != filesize:
data = conn.recv(1024)
f.write(data)
has_receive += len(data)
f.close() conn.close()
client 端:
# _author: lily
# _date: 2019/1/27 import socket
import os
sk = socket.socket()
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) adress = ('127.0.0.1', 8000)
sk.connect(adress) while 1: send_data = input('>>').strip() # post|11.png
cmd, path = send_data.split('|')
path = os.path.join(BASE_DIR, path) filename = os.path.basename(path)
file_size = os.stat(path).st_size file_info = 'post|%s|%s' % (filename, file_size)
sk.sendall(bytes(file_info, 'utf8')) f = open(filename, 'rb')
has_sent = 0
while has_sent != file_size:
data = f.read(1024)
sk.sendall(data)
has_sent += len(data)
f.close()
print('success') sk.close()
server 下的方法:
bind()
listen()
accept()
recv()
send( string )
sendall()
close()
client 下的方法:
connect()
recv()
send( string )
sendall() # 传送的类型一定是 byte 类型
close()
25 python 初学(socket,socketserver)的更多相关文章
- 转:Python 的 Socket 编程教程
这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...
- Python 之socket的应用
本节主要讲解socket编程的有关知识点,顺便也会讲解一些其它的关联性知识: 一.概述(socket.socketserver): python对于socket编程,提供了两个模块,分别是socket ...
- python3之socket&socketserver网络编程
1.套接字与套接模块 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了 ...
- Python基础socket编程
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...
- python实现socket上传下载文件-进度条显示
在python的socket编程中,可以实现上传下载文件,并且在下载的时候,显示进度条,具体的流程如下图所示: 1. 服务器端代码如下: [root@python 519]# cat server.p ...
- 「Python」socket指南
开始 网络中的 Socket 和 Socket API 是用来跨网络的消息传送的,它提供了 进程间通信(IPC) 的一种形式.网络可以是逻辑的.本地的电脑网络,或者是可以物理连接到外网的网络,并且可以 ...
- python操作socket
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...
- Python 006- python socket编程详细介绍
转自https://blog.csdn.net/rebelqsp/article/details/22109925 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供 ...
- Python:socket实现ftp程序
刚开始学习socket编程,还不是特熟练,码了好长时间,中间遇到许多问题,记录一下用socketserver写ftp server端: #!/usr/bin/env python import soc ...
随机推荐
- 【ASP.NET Core快速入门】(十三)Individual authentication 模板、EF Core Migration
Individual authentication 模板 我们首先用VSCode新建一个mvc的网站,这个网站创立的时候回自动为我们创建Identuty Core以及EF Core的代码示例,我们可以 ...
- 重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准
重磅!阿里巴巴工程师获得 containerd 社区席位,与社区共建云时代容器标准 11 月 29 日,CNCF containerd 社区正式宣布:两位阿里巴巴工程师正式获得 containerd ...
- 痞子衡嵌入式:史上最强ARM Cortex-M学习资源汇总(持续更新中...)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M学习资源. 类别 资源 版本 短评 官方汇总 cortex-m-resources / ARM公司专家Josep ...
- 第29章 保护API - Identity Server 4 中文文档(v1.0.0)
IdentityServer 默认以JWT(JSON Web令牌)格式发出访问令牌. 今天的每个相关平台都支持验证JWT令牌,这里可以找到一个很好的JWT库列表.热门库例如: ASP.NET Core ...
- 第25章 退出外部身份提供商 - Identity Server 4 中文文档(v1.0.0)
当用户注销 IdentityServer并且他们使用外部身份提供程序登录时,可能会将其重定向到注销外部提供程序.并非所有外部提供商都支持注销,因为它取决于它们支持的协议和功能. 要检测是否必须将用户重 ...
- 第9章 使用客户端凭据保护API - Identity Server 4 中文文档(v1.0.0)
快速入门介绍了使用IdentityServer保护API的最基本方案. 我们将定义一个API和一个想要访问它的客户端. 客户端将通过提供ClientCredentials在IdentityServer ...
- [MySQL] 5.7版本以上group by语句报1055错误问题
1. 在5.7版本以上mysql中使用group by语句进行分组时, 如果select的字段 , 不是完全对应的group by后面的字段 , 有其他字段 , 那么就会报这个错误 ERROR 105 ...
- Activiti(二) springBoot2集成activiti,集成activiti在线设计器
摘要 本篇随笔主要记录springBoot2集成activiti流程引擎,并且嵌入activiti的在线设计器,可以通过浏览器直接编辑出我们需要的流程,不需要通过eclipse或者IDEA的actiB ...
- Zookeeper 分布式机器部署
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...
- TS学习随笔(五)->函数
这篇文章我们来看一下TS里面的函数 函数声明 在 JavaScript 中,有两种常见的定义函数的方式——函数声明(Function Declaration)和函数表达式(Function Expre ...