Python3 网络套接字(socket / socketserver)
本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.youkuaiyun.com/Rozol/article/details/72553736
以下代码以Python3.6.1为例
Less is more!
socket
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/13'
# socket_demo.py 套接字接口
# 协议: TCP/IP(3次握手,4次断开) UDP(直接发数据)
# 一台PC最多可开 65535 个端口
import socket
import os
# 地址簇
socket.AF_INET # IPV4, (host, port), host:'luzhuo.me' / '127.0.0.1'
socket.AF_INET6 # IPV6, (host, port, flowinfo, scopeid); boolean = socket.has_ipv6 // 是否支持ipv6
# 套接字类型
socket.SOCK_STREAM # tcp
socket.SOCK_DGRAM # udp
socket.SOCK_RAW # 原始套接字(可伪造IP地址,发起DDOS攻击)
socket.SOCK_RDM # UDP,保证交付,但不保证顺序
socket.SOCK_SEQPACKET
HOST = 'localhost' # windows: '127.0.0.1' / 'localhost'; linux:0.0.0.0
PORT = 10086
def tcp_server():
'''
TCP服务端
'''
# 1. 实例化socket对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 可重用地址
# 2. 绑定
server.bind((HOST, PORT)) # 绑定
# 3. 监听链接
server.listen()
while True:
# 4. 接收一个连接
conn, addr = server.accept() # (阻塞等待)接收一个连接, 返回 连接对象 地址
while True:
# 5. 接收/发送数据 (接收数据(命令), 发送数据量, 接收反馈, 发送全部数据)
data_bytes = conn.recv(1024) # (阻塞)接收数据
if not data_bytes:
break # 当client断开时,conn.recv不断的接收空信息
data_str = data_bytes.decode("utf-8")
print("接收到数据: {}".format(data_str))
res_cmd_bytes = os.popen(data_str).read().encode("utf-8")
if not res_cmd_bytes:
res_cmd_bytes = b"success"
conn.send(str(len(res_cmd_bytes)).encode("utf-8")) # 不能发送空数据
conn.recv(1024) # 为避免粘包, 发送数据后接收下客户端的反馈
conn.send(res_cmd_bytes) # 每次发送的数据量与缓存有关
# 6. 关闭连接, 释放资源
conn.close()
server.close()
def tcp_client(data):
'''
TCP客户端
:param data: 字符串数据
'''
# 1. 实例化对象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 连接服务端
client.connect((HOST, PORT)) # 连接
if not data:
return
data_bytes = data.encode("utf-8")
# 3. 发送/接收数据 (发送数据, 接收反馈, 发送反馈, 接收全部数据)
client.send(data_bytes) # 发送数据, 发送的数据不能为空, 未发完的数据将放到缓冲区继续发
res_count_bytes = client.recv(1024) # 接收数据, 每次接收的数据量有限制, 限制大小与系统有关
client.send(b"seccess") # 给服务器反馈
if not res_count_bytes:
res_count_bytes = b'0&#