首页 > 编程语言 >python TCP Server

python TCP Server

时间:2023-10-07 11:47:37浏览次数:65  
标签:__ serv socket python self request TCP Server client

python TCP Server

https://blog.csdn.net/weixin_45707610/article/details/131511896

 

下面的代码,要先关闭防火墙,然后再启动

from socketserver import BaseRequestHandler, TCPServer

class EchoHandler(BaseRequestHandler):

    def handle(self):

        print('Got connection from', self.client_address)

        while True:

            msg = self.request.recv(8192)

            if not msg:

                break

            self.request.send(msg)

if __name__ == '__main__':

    serv = TCPServer(('', 20000), EchoHandler)

    serv.serve_forever()
# ————————————————
# 版权声明:本文为CSDN博主「xiaoweids」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# 原文链接:https://blog.csdn.net/weixin_45707610/article/details/131511896

 

Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 19:29:22) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from socket import socket, AF_INET, SOCK_STREAM
>>> s = socket(AF_INET, SOCK_STREAM)
>>> s.connect(('localhost', 20000))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it
>>>
>>> s.connect(('localhost', 20000))
>>> s.send(b'Hello')
5
>>> s.recv(8192)
b'Hello'
>>>

第一步:查看端口占用情况  netstat -ano
第二步:关闭两台电脑的杀毒软件,防火墙
第三歩:查看端口。若为两台电脑之间通信。则应使用服务器这台电脑的ip进行连接。利用ipconfig查看本机ip(Ipv4地址)
因为127.0.0.1只适用于本机电脑测试(且两台电脑必须在同一局域网内)
https://blog.csdn.net/weixin_38383877/article/details/82390832

ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it 

==================================

本文主要介绍了Python 创建TCP服务器的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

问题
你想实现一个服务器,通过TCP协议和客户端通信。

解决方案
创建一个TCP服务器的一个简单方法是使用 socketserver 库。例如,下面是一个简单的应答服务器:

from socketserver import BaseRequestHandler, TCPServer
class EchoHandler(BaseRequestHandler):
  def handle(self):
    print('Got connection from', self.client_address)
    while True:
      msg = self.request.recv(8192)
      if not msg:
        break
      self.request.send(msg)

if __name__ == '__main__':
  serv = TCPServer(('', 20000), EchoHandler)
  serv.serve_forever()

在这段代码中,你定义了一个特殊的处理类,实现了一个 handle() 方法,用来为客户端连接服务。 request 属性是客户端socket,client_address 有客户端地址。 为了测试这个服务器,关闭防火墙,然后运行它并打开另外一个Python进程连接这个服务器:   

from socket import socket, AF_INET, SOCK_STREAM
s = socket(AF_INET, SOCK_STREAM)
s.connect(('localhost', 20000))

s.send(b'Hello')


>>> from socket import socket, AF_INET, SOCK_STREAM
>>> s = socket(AF_INET, SOCK_STREAM)
>>> s.connect(('localhost', 20000))
>>> s.send(b'Hello')
5
>>> s.recv(8192)
b'Hello'
>>>

很多时候,可以很容易的定义一个不同的处理器。下面是一个使用 StreamRequestHandler 基类将一个类文件接口放置在底层socket上的例子:

from socketserver import StreamRequestHandler, TCPServer
class EchoHandler(StreamRequestHandler):
  def handle(self):
    print('Got connection from', self.client_address)
    # self.rfile is a file-like object for reading
    for line in self.rfile:
      # self.wfile is a file-like object for writing
      self.wfile.write(line)


if __name__ == '__main__':
  serv = TCPServer(('', 20000), EchoHandler)
  serv.serve_forever()

讨论
socketserver 可以让我们很容易的创建简单的TCP服务器。 但是,你需要注意的是,默认情况下这种服务器是单线程的,一次只能为一个客户端连接服务。 如果你想处理多个客户端,可以初始化一个 ForkingTCPServer 或者是 ThreadingTCPServer 对象。例如:   

from socketserver import ThreadingTCPServer
if __name__ == '__main__':
  serv = ThreadingTCPServer(('', 20000), EchoHandler)
  serv.serve_forever()

使用fork或线程服务器有个潜在问题就是它们会为每个客户端连接创建一个新的进程或线程。 由于客户端连接数是没有限制的,因此一个恶意的黑客可以同时发送大量的连接让你的服务器奔溃。
如果你担心这个问题,你可以创建一个预先分配大小的工作线程池或进程池。 你先创建一个普通的非线程服务器,然后在一个线程池中使用 serve_forever() 方法来启动它们。

if __name__ == '__main__':
  from threading import Thread
  NWORKERS = 2
  serv = TCPServer(('', 20000), EchoHandler)
  for n in range(NWORKERS):
    t = Thread(target=serv.serve_forever)
    t.daemon = True
    t.start()
  serv.serve_forever()

 

## 没有限制住

 



一般来讲,一个 TCPServer 在实例化的时候会绑定并激活相应的 socket 。 不过,有时候你想通过设置某些选项去调整底下的 socket` ,可以设置参数 bind_and_activate=False 。如下:

if __name__ == '__main__':
  serv = TCPServer(('', 20000), EchoHandler, bind_and_activate=False)
  # Set up various socket options
  serv.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
  # Bind and activate
  serv.server_bind()
  serv.server_activate()
  serv.serve_forever()

上面的 socket 选项是一个非常普遍的配置项,它允许服务器重新绑定一个之前使用过的端口号。 由于要被经常使用到,它被放置到类变量中,可以直接在 TCPServer 上面设置。 在实例化服务器的时候去设置它的值,如下所示:   

if __name__ == '__main__':
  TCPServer.allow_reuse_address = True
  serv = TCPServer(('', 20000), EchoHandler)
  serv.serve_forever()

在上面示例中,我们演示了两种不同的处理器基类( BaseRequestHandler 和 StreamRequestHandler )。 StreamRequestHandler 更加灵活点,能通过设置其他的类变量来支持一些新的特性。比如:
  

import socket


class EchoHandler(StreamRequestHandler):
  # Optional settings (defaults shown)
  timeout = 5           # Timeout on all socket operations
  rbufsize = -1          # Read buffer size
  wbufsize = 0           # Write buffer size
  disable_nagle_algorithm = False # Sets TCP_NODELAY socket option


  def handle(self):
    print('Got connection from', self.client_address)
    try:
      for line in self.rfile:
        # self.wfile is a file-like object for writing
        self.wfile.write(line)
    except socket.timeout:
      print('Timed out!')

最后,还需要注意的是绝大部分Python的高层网络模块(比如HTTP、XML-RPC等)都是建立在 socketserver 功能之上。 也就是说,直接使用 socket 库来实现服务器也并不是很难。 下面是一个使用 socket 直接编程实现的一个服务器简单例子:   

from socket import socket, AF_INET, SOCK_STREAM
def echo_handler(address, client_sock):
  print('Got connection from {}'.format(address))
  while True:
    msg = client_sock.recv(8192)
    if not msg:
      break
    client_sock.sendall(msg)
  client_sock.close()

def echo_server(address, backlog=5):
  sock = socket(AF_INET, SOCK_STREAM)
  sock.bind(address)
  sock.listen(backlog)
  while True:
    client_sock, client_addr = sock.accept()
    echo_handler(client_addr, client_sock)

if __name__ == '__main__':
  echo_server(('', 20000))

以上就是Python 创建TCP服务器的方法的详细内容,希望可以对你有所帮助。
————————————————
链接:https://blog.csdn.net/weixin_45707610/article/details/131511896

===================================

重启串口服务器会得到如下异常:

 ----------------------------------------
Exception happened during processing of request from ('192.168.0.7', 22273)
Traceback (most recent call last):
  File "E:\Eprogramfiles\Anaconda3\lib\socketserver.py", line 316, in _handle_request_noblock
    self.process_request(request, client_address)
  File "E:\Eprogramfiles\Anaconda3\lib\socketserver.py", line 347, in process_request
    self.finish_request(request, client_address)
  File "E:\Eprogramfiles\Anaconda3\lib\socketserver.py", line 360, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "E:\Eprogramfiles\Anaconda3\lib\socketserver.py", line 720, in __init__
    self.handle()
  File "E:/_项目2020-main/TCPServer_test.py", line 11, in handle
    msg = self.request.recv(8192)
ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine

 ===================================

 

 

===================================

 

 

===================================

 

标签:__,serv,socket,python,self,request,TCP,Server,client
From: https://www.cnblogs.com/emanlee/p/17623322.html

相关文章

  • python+playwright 简单使用
    启动浏览器并打开百度页面安装后,您可以在Python脚本中使用Playwright,并启动3种浏览器中的任何一种(chromium,firefox和webkit)。playwright执行默认运行的浏览器是chromium1、同步方式启动浏览器2、异步方式启动浏览器 ......
  • python+playwright 环境准备
    前言2020年微软开源一个UI自动化测试工具Playwright,与selenium一样,入门简单,支持多语言,所以playwright开始被更多人注意到了,它甚至比selenium更好用更强大。playwright的优势跨浏览器和平台跨浏览器。Playwright支持所有现代渲染引擎,包括Chromium、WebKit和Firefox。......
  • Python TCP socket
    Python TCPsocketsocket.listen(n)简单来说,这里的nt表示socket的”排队个数“一般情况下,一个进程只有一个主线程(也就是单线程),那么socket允许的最大连接数为:n+1如果服务器是多线程,比如上面的代码例子是开了2个线程,那么socket允许的最大连接数就是:n+2换句话说:排队的......
  • TCP Socket 数据发送和接收时进制转换
       确实经过了转换:十六进制--》十进制--》ASCII字符十六进制的61,对应十进制的97,对应ASCII字符a https://blog.csdn.net/cybersnow/article/details/88079026C#代码://16进制字符串转字节数组  格式为stringsendMessage="000100000006FF0500640......
  • 【python笔记】虚拟环境
    1.虚拟环境的建立python-mvenv<虚拟环境名>#例如:python-mvenvmy_venv2.虚拟环境的激活与去激活激活cd到虚拟环境文件夹下的Scripts,在终端执行activate去激活cd到虚拟环境文件夹下的Scripts,在终端执行deactivate.bat3.在虚拟环境中下载依赖python-mpipin......
  • Mojo帮助Python 的性能提升了近 250 倍
    导读AydynTairov是一名开源作者,也是Meta前工程师,他此前将GitHub上火热的纯C语言实现的llama2.c项目移植到了Python——llama2.py。近期 Mojo编程语言正式开放下载,并且声称比Python快68000倍。于是 AydynTairov马不停蹄地就开始将 llama2.py 移植到......
  • 根据以下代码所生成的数据 请使用python 机器学习 研究不同宽度,厚度,重量,车间温度,
    #对分类变量进行独热编码data=pd.get_dummies(data,columns=['Annealing_Type','Cooling_Type'])#划分训练集和测试集fromsklearn.model_selectionimporttrain_test_splitX=data.drop(['Material_ID','Measurement_Time','Tempera......
  • 【VMware篇】6-Esxi上Windows server 2019安装AD域控、DHCP、DNS、KMS
    第1章前言  本文主要介绍在Windowsserver2019上安装AD域控、DHCP、DNS、KMS服务器以及创建好域控后组织单元的创建。AD(activedirectory)域     AD域是一种广泛使用的身份验证和访问控制解决方案,它是由Microsoft开发的。AD域能够为组织中的用户、计算机和其他网络资源提供......
  • Python实现抓取的方法
    在进行网络爬虫、数据采集或访问受限网站时,使用代理IP可以帮助我们规避IP封禁和请求频率限制的问题。本文将为大家分享如何使用Python抓取IP的方法,以便在应用程序中使用。一、选择IP网站在开始之前,我们首先需要选择一个可靠的IP网站。抓取代理IP下面是一个示例代码,演示了如何使......
  • 【爬虫实战】用python爬小红书某话题的笔记,以#杭州亚运会#为例
    目录一、爬取目标二、爬虫代码讲解2.1分析过程2.2爬虫代码三、演示视频四、获取完整代码一、爬取目标您好!我是@马哥python说,一名10年程序猿。最近的亚运会大家都看了吗。除了振奋人心,还主打一个爱憎分明(主要针对小日子和韩国),看了的小伙伴都懂得!我用python爬取了小红书上#杭......