标签:Python,TCPServer,通信
最简单、原始的TCP通信demo
服务端Http请求:
import socket
# 创建一个servicesocke
serviceSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 给服务器绑定地址(ip地址,端口号)
serviceSocket.bind(("192.168.171.1", 80))
print("等待客户端接入")
# sock 是客户端的socket信息
# addr 是客户端的地址(ip,端口)
sock, addr = serviceSocket.accept()
print(f"sock from client:{sock}")
print(f"addr of client:{addr}")
while True:
# 接收客户端的请求
recvData = sock.recv(1024)
print("客户端说:%s" % (recvData.decode("utf-8")))
sendData = input("服务器说:")
# 发送(回复)数据给客户端
sock.send(sendData.encode("utf-8"))
客户端Http请求:
import socket
# 创建客户端socket
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
clientSocket.connect(("192.168.171.1", 80))
while True:
# 发送消息给服务器
sendData = input("客户端说:")
if sendData == "bye":
clientSocket.send(sendData.encode("utf-8")) # 编码:将数据装换成二进制形式
break
clientSocket.send(sendData.encode("utf-8"))
recvData = clientSocket.recv(1024)
print("服务器说:%s" % (recvData.decode("utf-8"))) # 解码:将二进制转换成字符
1、在TCP中,客户端的实现流程:
创建客户端的socket对象建立与服务器之间的联系发送请求接收数据关闭连接
2、服务端的实现流程:
创建服务端的socket对象绑定服务端的地址设置 * 等待客户端的连接接收客户端的请求返回处理的结果到客户端
ThreadingTCPServer 多线程多客户端通信自动重连demo
socketserver继承图:
TCPServer
# from socketserver import TCPServer, BaseRequestHandler, ThreadingTCPServer
from socketserver import TCPServer, StreamRequestHandler, ThreadingMixIn
import traceback
# class MyBaseRequestHandler(BaseRequestHandler):
class MyBaseRequestHandler(StreamRequestHandler):
def handle(self):
self.addr = self.request.getpeername()
self.server.users[self.addr[1]] = self.request
message = "IP " + self.addr[0] + ":" + str(self.addr[1]) + " Connected..."
print(message)
while True:
try:
data = self.request.recv(1024).decode('UTF-8', 'ignore').strip()
print(f'receive from {self.client_address}:{data}')
back_data = (f"response\"" + data + "\":\n").encode("utf8")
self.request.sendall(back_data)
except:
traceback.print_exc()
break
# 源码:class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
# 从ThreadingMixIn和TCPServer继承,实现多线程
class MyThreadingTCPServer(ThreadingMixIn, TCPServer):
def __init__(self, server_address, RequestHandlerClass):
TCPServer.__init__(self, server_address, RequestHandlerClass)
self.users = {}
class MyTCPserver():
def __init__(self, server_addr='192.168.1.109', server_port=23):
self.server_address = server_addr
self.server_port = server_port
self.server_tuple = (self.server_address, self.server_port)
def run(self):
# server = TCPServer(self.server_tuple, MyBaseRequestHandler)
server = MyThreadingTCPServer(self.server_tuple, MyBaseRequestHandler)
server.serve_forever()
if __name__ == '__main__':
myserver = MyTCPserver()
myserver.run()
在telnet 下开启开启两个客户端,本电脑的IP为192.168.1.109,开两个客户端后,TCPServer的终端出现同一个IP但是不同端口的连接:
TCPClient
import socket
import time
class MyClient:
host = '192.168.1.109'
port = 23
bufsiz = 1024
addr = None
skt = None
def __init__(self, host=None, port=None):
if host != None:
self.host = host
if port != None:
self.port = port
if self.addr == None:
self.addr = (self.host, self.port)
self.doConnection()
def doConnection(self):
try:
self.skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.skt.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
print(self.addr)
self.skt.connect(self.addr)
except:
pass
def run(self):
while True:
try:
_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
self.skt.sendall(f'{_time}:i am clent1 '.encode('utf-8'))
data = self.skt.recv(self.bufsiz)
print(data.decode('utf-8', 'ignore'))
if not data:
break
print(data.strip())
time.sleep(5)
except socket.error:
print('socket error, reconnection') # 自动重连
time.sleep(3)
self.doConnection()
except:
print('other error')
self.skt.close()
myclient = MyClient()
myclient.run()
上面用的是telnet工具来作为客户端,这里是用代码实现模拟的客户端。
来源:https://blog.csdn.net/qq_31362767/article/details/103758119


猜你喜欢
- 本文只考虑模板中的字符串,不考虑字符串中带标签的情况。模板中的字符串文字不会自动转义,因为这里默认模板的作者已经正确书写模板的内容。{{ d
- 为数据库配置比较大的内存,可以有效提高数据库性能。因为数据库在运行过程中,会在内存中划出一块区域来作为数据缓存。通常情况下,用户访问数据库时
- 为什么ASP.NET Core采用Main方法?需要记住的最重要的一点是,ASP.NET Core Web 应用程序最初作为控制台应用程序启
- golang修改结构体中的切片值,直接传结构体地址就可以package mainimport "fmt"type rsp
- Jupyter Notebook默认不显示行号,可是当我们代码报错时,发现会显示自己多少行出现错误。eg:这时候我们总不能一行行去数吧,因此
- 程序开始一、基本使用1、创建一个游戏窗口出来代码如下:# coding:utf8import pygameimport sys# 初始化py
- 这篇文章主要介绍的是关于JS的命名规范、注释规范以及框架开发的一些问题,首先来看看目录。目录1. 命名规范:介绍变量、函数、常量、构造函数、
- 本博客详细为你解释 Python Flask 框架下的 HTML 文件压缩内容,其第三方模块也可用在其他框架中。本案例是基于 Python
- Unittest是Python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit是Java语言的标准单元
- 前言:在Python中,如果我们想要在遍历一组数据的过程中,对这组数据进行修改,通常会出现许多问题,例如对列表进行上述操作时, 会忽略部分数
- 一、什么是jieba库jieba是优秀的中文分词第三方库,由于中文文本之间每个汉字都是连续书写的,我们需要通过特定的手段来获得其中的每个词组
- 1 以下代码的输出结果为:print(round(-3.6))A.-4B.-4.0C.-3D. -3.02 以下代码的输出结果为(Pytho
- 本文实例讲述了Python3.5常见内置方法参数用法。分享给大家供大家参考,具体如下:Python的内置方法参数详解网站为:https://
- 前言本文主要给大家介绍了关于python3 smtplib通过qq邮箱发送邮件的相关内容, smtplib模块是smtp简单邮件传输协议客户
- """已知列表li = [{"key": 5}, {"key": 9}
- 例1import osprint 'Process (%s) start...' %os.getpid()pid = os.
- 相机固定不动,通过标定版改动不同方位的位姿进行抓拍import cv2camera=cv2.VideoCapture(1)i = 0whil
- 使Web系统的开发与维护更加方便,从而有效的节省人力物力,受到了越来越多企业的青眯。 模板引擎是MVC模式建立过程的重要方法,开发者可以设计
- 本文针对SQL 2016 正式版安装过程进行梳理总结,帮助大家顺利安装SQL 2016,具体内容如下1.点击全新安装2.接着就是下一步,下一
- 首先在程序中引入Requests模块import requests一、获取不同类型的响应内容在发送请求后,服务器会返回一个响应内容,而且re