<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      使用Python實現多線程、多進程、異步IO的socket通信

      多線程實現socket通信服務器端代碼

      import socket
      import threading
      
      
      class MyServer(object):
          def __init__(self):
              # 初始化socket
              self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
              # 設置服務器IP地址
              host = '192.168.152.1'
              # 設置服務器端口號
              port = 4321
              # 綁定IP地址和端口
              self.server.bind((host, port))
              # 設置最大監聽數
              self.server.listen(5)
              # 設置一個字典,用來保存每一個客戶端的連接和身份信息
              self.socket_mapping = {}
              # 設置接收的最大字節數
              self.maxSize = 1024
      
          def run(self):
              while True:
                  socket, addr = self.server.accept()
                  # 發送信息,提示客戶端已成功連接
                  socket.send('success!'.encode('utf-8'))
                  # 將客戶端socket等信息存入字典
                  self.socket_mapping[socket] = addr
                  # 創建線程,負責獲取鍵盤輸入并發送給客戶端
                  threading.Thread(target=self.send_to_client, args=(socket,)).start()
                  # 創建線程,負責接收客戶端信息并轉發給其他客戶端
                  threading.Thread(target=self.recv_from_client, args=(socket,)).start()
      
          def send_to_client(self, socket):
              """
              獲取鍵盤輸入并發送給客戶端
              :param socket:
              :return:
              """
              while True:
                  info = input()
                  if info == "quit":
                      socket.close()
                  for socket in self.socket_mapping.keys():
                      socket.send(info.encode("utf-8"))
      
          def recv_from_client(self, socket):
              """
              接收客戶端信息并轉發給其他客戶端
              :param socket:
              :return:
              """
              while True:
                  recv_info = socket.recv(self.maxSize).decode('utf-8')
                  print('client{} say: '.format(self.socket_mapping[socket]), recv_info)
                  for i_socket in self.socket_mapping.keys():
                      if i_socket != socket:
                          i_socket.send(recv_info.encode("utf-8"))
      
      
      my_server = MyServer()
      my_server.run()
      

      多進程實現socket通信服務器端代碼

      import os
      import socket
      import sys
      from multiprocessing import Process, Manager
      
      
      class MyServer(object):
          def __init__(self):
              # 初始化socket
              self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
              # 設置服務器IP地址
              host = '192.168.152.1'
              # 設置服務器端口號
              port = 4321
              # 綁定IP地址和端口
              self.server.bind((host, port))
              # 設置最大監聽數
              self.server.listen(5)
              # 設置一個字典,用來保存每一個客戶端的連接和身份信息
              self.socket_mapping = Manager().dict()
              # 設置接收的最大字節數
              self.maxSize = 1024
              # 進程鎖
              self.share_lock = Manager().Lock()
      
          def run(self):
              fn = sys.stdin.fileno()
              while True:
                  socket, addr = self.server.accept()
                  # 發送信息,提示客戶端已成功連接
                  socket.send('success!'.encode('utf-8'))
                  # 將客戶端socket等信息存入字典
                  self.modify_mapping(self.socket_mapping, addr, socket, self.share_lock)
                  # 創建進程,負責獲取鍵盤輸入并發送給客戶端
                  Process(target=self.send_to_client, args=(addr, fn)).start()
                  # 創建進程,負責接收客戶端信息并轉發給其他客戶端
                  Process(target=self.recv_from_client, args=(addr,)).start()
      
          def send_to_client(self, addr, fn):
              """
              獲取鍵盤輸入并發送給客戶端
              :param addr:
              :return:
              """
              sys.stdin = os.fdopen(fn)
              while True:
                  info = sys.stdin.readline()
                  if info == "quit":
                      self.socket_mapping[addr].close()
                  for socket in self.socket_mapping.values():
                      socket.send(info.encode("utf-8"))
      
          def recv_from_client(self, addr):
              """
              接收客戶端信息并轉發給其他客戶端
              :param addr:
              :return:
              """
              while True:
                  recv_info = self.socket_mapping.get(addr).recv(self.maxSize).decode('utf-8')
                  print('client{} say: '.format(addr), recv_info)
                  for i_addr in self.socket_mapping.keys():
                      if i_addr != addr:
                          self.socket_mapping.get(i_addr).send(recv_info.encode("utf-8"))
      
          @staticmethod
          def modify_mapping(share_var, share_key, share_value, share_lock):
              # 獲取鎖
              share_lock.acquire()
              # 修改數據
              share_var[share_key] = share_value
              # 釋放鎖
              share_lock.release()
      
      
      if __name__ == "__main__":
          my_server = MyServer()
          my_server.run()
      

      異步IO實現socket通信服務器端代碼

      import socket
      import asyncio
      import select
      
      
      class MyServer(object):
          def __init__(self):
              # 初始化socket
              self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
              # 設置服務器IP地址
              host = '192.168.152.1'
              # 設置服務器端口號
              port = 4321
              # 綁定IP地址和端口
              self.server.bind((host, port))
              # 設置最大監聽數
              self.server.listen(5)
              # 設置一個字典,用來保存每一個客戶端的連接和身份信息
              self.socket_mapping = {self.server: None}  # 這里存入self.server是為了充當select.select參數
              # 設置接收的最大字節數
              self.maxSize = 1024
              # 進入事件循環
              self.loop = asyncio.get_event_loop()
      
          def run(self):
              while True:
                  # select監聽請求對象
                  rret, _, _ = select.select(self.socket_mapping.keys(), [], [])
                  for r_socket in rret:
                      if r_socket is self.server:
                          socket, addr = r_socket.accept()
                          # 發送信息,提示客戶端已成功連接
                          socket.send('success!'.encode('utf-8'))
                          # 將客戶端socket等信息存入字典
                          self.socket_mapping[socket] = addr
                      else:
                          task = [self.send_to_client(r_socket), self.recv_from_client(r_socket)]
                          self.loop.run_until_complete(asyncio.gather(*task))
      
          async def send_to_client(self, socket):
              """
              獲取鍵盤輸入并發送給客戶端
              :param socket:
              :return:
              """
              info = input()
              if info == "quit":
                  socket.close()
              for socket in self.socket_mapping.keys():
                  if socket != self.server:
                      socket.send(info.encode("utf-8"))
      
          async def recv_from_client(self, socket):
              """
              接收客戶端信息并轉發給其他客戶端
              :param socket:
              :return:
              """
              recv_info = socket.recv(self.maxSize).decode('utf-8')
              print('client{} say: '.format(self.socket_mapping[socket]), recv_info)
              for i_socket in self.socket_mapping.keys():
                  if i_socket != socket and i_socket != self.server:
                      i_socket.send(recv_info.encode("utf-8"))
      
      
      my_server = MyServer()
      my_server.run()
      

      客戶端代碼(使用多線程)

      import socket
      import threading
      
      
      class MyClient(object):
          def __init__(self):
              # 初始化socket
              self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
              # 設置服務器IP地址
              self.host = '192.168.152.1'
              # 設置服務器端口號
              self.port = 4321
              # 設置接收的最大字節數
              self.max_size = 1024
      
          def run(self):
              # 與服務器建立連接
              self.client.connect((self.host, self.port))
              # 創建線程,負責獲取鍵盤輸入并發送給服務器
              threading.Thread(target=self.sned_to_server).start()
              # 創建線程,接收服務器信息
              threading.Thread(target=self.recv_from_server).start()
      
          def sned_to_server(self):
              """
              獲取鍵盤輸入并發送給服務器
              """
              while True:
                  send_msg = input()
                  self.client.send(send_msg.encode('utf-8'))
                  if send_msg == 'quit':
                      break
              self.client.close()
      
          def recv_from_server(self):
              """
              接收服務器信息
              """
              while True:
                  recv_info = self.client.recv(self.max_size).decode('utf-8')
                  print('server{} say: '.format((self.host, self.port)), recv_info)
      
      
      my_client = MyClient()
      my_client.run()
      
      posted @ 2022-11-28 22:35  大雄的叮當貓  閱讀(3138)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲春色在线视频| 色成年激情久久综合国产| 久久99精品久久久久久| 国产第一区二区三区精品| 狠狠综合久久av一区二| 亚洲av无码成人精品区一区| 国内精品伊人久久久久影院对白| 无码人妻一区二区三区线| 国产精品99中文字幕| 久久精品国产免费观看频道| 东方四虎在线观看av| 俺来也俺去啦最新在线| 欧美乱码伦视频免费| 国产成人精品永久免费视频| 狠狠躁夜夜躁人人爽天天69| 亚洲国产精品成人综合久| 久久96热在精品国产高清 | 偷拍精品一区二区三区| 日本中文字幕在线| 综合图区亚洲另类偷窥| 久久人人妻人人爽人人爽| 亚洲欧美人成电影在线观看| 免费激情网址| 临夏市| 久久精品夜夜夜夜夜久久| 精选国产av精选一区二区三区| 色偷偷中文在线天堂中文| 国产亚洲精品AA片在线爽| 欧洲一区二区中文字幕| 国产女人在线视频| 国产美女精品自在线拍免费| 亚洲国产精品久久久久婷婷图片| 亚洲色大成网站WWW尤物| 亚洲丰满老熟女激情av| 免费无码午夜福利片| 一区二区三区午夜福利院| 小13箩利洗澡无码视频网站| 亚洲国产成人精品区综合| 韩国无码AV片午夜福利| 国产欧美性成人精品午夜| 九九热在线免费视频精品|