最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python TCPServer 多線程多客戶端通信的實現(xiàn)

 更新時間:2019年12月31日 14:28:01   作者:東南飄雪  
這篇文章主要介紹了Python TCPServer 多線程多客戶端通信的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

最簡單、原始的TCP通信demo

服務端Http請求:

import socket

# 創(chuàng)建一個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("服務器說:")
  # 發(fā)送(回復)數(shù)據(jù)給客戶端
  sock.send(sendData.encode("utf-8"))

客戶端Http請求:

import socket

# 創(chuàng)建客戶端socket
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 連接服務器
clientSocket.connect(("192.168.171.1", 80))

while True:
  # 發(fā)送消息給服務器
  sendData = input("客戶端說:")
  if sendData == "bye":
    clientSocket.send(sendData.encode("utf-8")) # 編碼:將數(shù)據(jù)裝換成二進制形式
    break
  clientSocket.send(sendData.encode("utf-8"))
  recvData = clientSocket.recv(1024)
  print("服務器說:%s" % (recvData.decode("utf-8"))) # 解碼:將二進制轉(zhuǎn)換成字符

1、在TCP中,客戶端的實現(xiàn)流程:

創(chuàng)建客戶端的socket對象建立與服務器之間的聯(lián)系發(fā)送請求接收數(shù)據(jù)關(guān)閉連接

2、服務端的實現(xiàn)流程:

創(chuàng)建服務端的socket對象綁定服務端的地址設置監(jiān)聽器等待客戶端的連接接收客戶端的請求返回處理的結(jié)果到客戶端

ThreadingTCPServer 多線程多客戶端通信自動重連demo

socketserver繼承圖:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RP9L9E1X-1577626400313)(../../../markdown_pic/blog_socketserver.png)]

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繼承,實現(xiàn)多線程
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的終端出現(xiàn)同一個IP但是不同端口的連接:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LRSXfXoG-1577626400318)(../../../markdown_pic/blog_TCPServer.png)]

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工具來作為客戶端,這里是用代碼實現(xiàn)模擬的客戶端。

在這里插入圖片描述

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • jupyter notebook oepncv 顯示一張圖像的實現(xiàn)

    jupyter notebook oepncv 顯示一張圖像的實現(xiàn)

    這篇文章主要介紹了jupyter notebook oepncv 顯示一張圖像的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 舉例講解Python中is和id的用法

    舉例講解Python中is和id的用法

    這篇文章主要介紹了舉例講解Python中is和id的用法,是Python學習當中的基礎知識,作者舉例進行了簡單說明,需要的朋友可以參考下
    2015-04-04
  • Django?Rest?Framework實現(xiàn)身份認證源碼詳解

    Django?Rest?Framework實現(xiàn)身份認證源碼詳解

    這篇文章主要為大家介紹了Django?Rest?Framework實現(xiàn)身份認證源碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Python?加載?TensorFlow?模型的注意事項

    Python?加載?TensorFlow?模型的注意事項

    TensorFlow支持多種模型格式,但最常見的兩種是SavedModel和HDF5(對于Keras模型),這里,我將分別給出加載這兩種模型格式的示例代碼,需要的朋友可以參考下
    2024-08-08
  • python基礎學習之生成器與文件系統(tǒng)知識總結(jié)

    python基礎學習之生成器與文件系統(tǒng)知識總結(jié)

    本文是參考《python數(shù)據(jù)分析》的附錄對生成器和文件系統(tǒng)結(jié)合案例的一個簡單回顧,文中對python生成器與文件系統(tǒng)作了非常詳細的介紹,對正在學習python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • python requests包的request()函數(shù)中的參數(shù)-params和data的區(qū)別介紹

    python requests包的request()函數(shù)中的參數(shù)-params和data的區(qū)別介紹

    這篇文章主要介紹了python requests包的request()函數(shù)中的參數(shù)-params和data的區(qū)別介紹,具有很好參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 簡單談談python的反射機制

    簡單談談python的反射機制

    本文主要介紹python中的反射,以及該機制的簡單應用,熟悉JAVA的程序員,一定經(jīng)常和Class.forName打交道。在很多框架中(Spring,eclipse plugin機制)都依賴于JAVA的反射能力,而在python中,也同樣有著強大的反射能力,本文將做簡單的介紹
    2016-06-06
  • 在前女友婚禮上用python把婚禮現(xiàn)場的WIFI名稱改成了

    在前女友婚禮上用python把婚禮現(xiàn)場的WIFI名稱改成了

    大家好,我是Lex 喜歡欺負超人那個Lex 擅長領域:python開發(fā),網(wǎng)絡安全滲透,Windows域控Exchange架構(gòu) 今日重點:python暴力拿下WiFi密碼;python拿下路由器管理頁面 代碼干貨滿滿,建議收藏+實操!有問題及需要,請留言哦
    2021-08-08
  • 在Python中使用HTMLParser解析HTML的教程

    在Python中使用HTMLParser解析HTML的教程

    這篇文章主要介紹了在Python中使用HTMLParser解析HTML的教程,尤其是在用Python制作爬蟲程序的時候經(jīng)??梢杂玫?需要的朋友可以參考下
    2015-04-04
  • Python 進程之間共享數(shù)據(jù)(全局變量)的方法

    Python 進程之間共享數(shù)據(jù)(全局變量)的方法

    今天小編就為大家分享一篇Python 進程之間共享數(shù)據(jù)(全局變量)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評論

洮南市| 壤塘县| 会泽县| 阆中市| 英吉沙县| 眉山市| 景宁| 苍山县| 秭归县| 天峨县| 呼图壁县| 星座| 太白县| 渝中区| 砚山县| 肇东市| 临高县| 水城县| 光泽县| 蒙阴县| 隆德县| 宽城| 台南县| 武定县| 临澧县| 大宁县| 澄迈县| 岗巴县| 衢州市| 邮箱| 衡阳市| 黑河市| 东安县| 汽车| 嵊泗县| 永嘉县| 铜川市| 乌什县| 盘锦市| 大理市| 临朐县|