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

Python實現(xiàn)的服務器示例小結【單進程、多進程、多線程、非阻塞式】

 更新時間:2019年05月23日 08:39:36   作者:xuezhangjun  
這篇文章主要介紹了Python實現(xiàn)的服務器,結合實例形式分析了Python實現(xiàn)單進程、多進程、多線程、非阻塞式服務器的相關操作技巧,需要的朋友可以參考下

本文實例講述了Python實現(xiàn)的服務器。分享給大家供大家參考,具體如下:

python - 單進程服務器

#coding=utf-8
from socket import *
#創(chuàng)建套接字
serSocket = socket(AF_INET, SOCK_STREAM)
#重復使用綁定信息
serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
localAddr = ('', 7788)
#綁定端口ip
serSocket.bind(localAddr)
#監(jiān)聽
serSocket.listen(5)
while True:
  print('---主進程,等待新客戶端的到來---')
  newSocket,destAddr = serSocket.accept()
  print('---主進程,接下來負責數(shù)據(jù)處理[%s]---'%str(destAddr))
  try:
    while True:
      recvData = newSocket.recv(1024)
      if len(recvData)>0:
        print('recv[%s]:%s'%(str(destAddr),recvData))
      else:
        print('[%s]客戶端已經(jīng)關閉')
        break
  finally:
    newSocket.close()
serSocket.close()

總結

同一時刻只能為一個客戶進行服務,不能同時為多個客戶服務。
當服務器為一個客戶端服務時,另外的客戶端發(fā)起了connect,只要服務器listen的隊列有空閑的位置,就會為這個新客戶端進行連接,并且客戶端可以發(fā)送數(shù)據(jù),但當服務器為這個新客戶端服務時,可能一次性把所有數(shù)據(jù)接收完畢當recv接收數(shù)據(jù)時,返回值為空,即沒有返回數(shù)據(jù),那么意味著客戶端已經(jīng)調用了close關閉了;因此服務器通過判斷recv接收數(shù)據(jù)是否為空 來判斷客戶端是否已經(jīng)下線。

python - 多進程服務器

#coding=utf-8
from socket import *
from multiprocessing import *
from time import sleep
#處理客戶端的請求并為其服務
def dealWithClient(newSocket,destAddr):
  try:
    while True:
      recvData = newSocket.recv(1024)
      if len(recvData) > 0:
        print('recv[%s]:%s' % (str(destAddr), recvData))
      else:
        print('[%s]客戶端已經(jīng)關閉')
        break
  finally:
    newSocket.close()
def main():
  #創(chuàng)建套接字
  serSocket = socket(AF_INET, SOCK_STREAM)
  #重復使用綁定信息
  serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
  localAddr = ('', 7788)
  #綁定端口ip
  serSocket.bind(localAddr)
  #監(jiān)聽
  serSocket.listen(5)
  try:
    while True:
      print('---主進程,等待新客戶端的到來---')
      newSocket,destAddr = serSocket.accept()
      print('---主進程,接下來負責數(shù)據(jù)處理[%s]---'%str(destAddr))
      client = Process(target=dealWithClient, args=(newSocket, destAddr))
      client.start()
      # 因為已經(jīng)向子進程中copy了一份(引用),并且父進程中這個套接字也沒有用處了
      # 所以關閉
      newSocket.close()
  finally:
    # 當為所有的客戶端服務完之后再進行關閉,表示不再接收新的客戶端的鏈接
    serSocket.close()
if __name__ == '__main__':
  main()

總結

通過為每個客戶端創(chuàng)建一個進程的方式,能夠同時為多個客戶端進行服
務當客戶端不是特別多的時候,這種方式還行,如果有成百上千個,就不
可取了,因為每次創(chuàng)建進程的過程需要消耗較多的資源。

python - 多線程服務器

#coding=utf-8
from socket import *
from threading import Thread
from time import sleep
# 處理客戶端的請求并執(zhí)行事情
def dealWithClient(newSocket,destAddr):
  while True:
    recvData = newSocket.recv(1024)
    if len(recvData)>0:
      print('recv[%s]:%s'%(str(destAddr), recvData))
    else:
      print('[%s]客戶端已經(jīng)關閉'%str(destAddr))
      break
  newSocket.close()
def main():
  serSocket = socket(AF_INET, SOCK_STREAM)
  serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)
  localAddr = ('', 7788)
  serSocket.bind(localAddr)
  serSocket.listen(5)
  try:
    while True:
      print('-----主進程,,等待新客戶端的到來------')
      newSocket,destAddr = serSocket.accept()
      print('-----主進程,,接下來創(chuàng)建一個新的進程負責數(shù)據(jù)處理[%s]----'%str(destAddr))
      client = Thread(target=dealWithClient, args=(newSocket,destAddr))
      client.start()
      #因為線程中共享這個套接字,如果關閉了會導致這個套接字不可用,
      #但是此時在線程中這個套接字可能還在收數(shù)據(jù),因此不能關閉
      #newSocket.close()
  finally:
    # 當為所有的客戶端服務完之后再進行關閉,表示不再接收新的客戶端的鏈接
    serSocket.close()
if __name__ == '__main__':
  main()

單進程服務器-非堵塞模式

服務器:

#coding=utf-8
from socket import *
import time
# 用來存儲所有的新鏈接的socket
g_socketList = []
def main():
  serSocket = socket(AF_INET, SOCK_STREAM)
  serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR , 1)
  localAddr = ('', 7788)
  serSocket.bind(localAddr)
  #可以適當修改listen中的值來看看不同的現(xiàn)象
  serSocket.listen(1000)
  #將套接字設置為?堵塞
  #設置為?堵塞后,如果accept時,恰巧沒有客戶端connect,那么accept會
  #產(chǎn)生一個異常,所以需要try來進行處理
  serSocket.setblocking(False)
  while True:
    #?來測試
    #time.sleep(0.5)
    try:
      newClientInfo = serSocket.accept()
    except Exception as result:
      pass
    else:
      print("一個新的客戶端到來:%s"%str(newClientInfo))
      newClientInfo[0].setblocking(False)
      g_socketList.append(newClientInfo)
  # 用來存儲需要刪除的客戶端信息
  needDelClientInfoList = []
  for clientSocket,clientAddr in g_socketList:
    try:
      recvData = clientSocket.recv(1024)
      if len(recvData)>0:
        print('recv[%s]:%s'%(str(clientAddr), recvData))
      else:
        print('[%s]客戶端已經(jīng)關閉'%str(clientAddr))
        clientSocket.close()
        g_needDelClientInfoList.append((clientSocket,clientAddr))
    except Exception as result:
      pass
  for needDelClientInfo in needDelClientInfoList:
    g_socketList.remove(needDelClientInfo)
if __name__ == '__main__':
  main()

客戶端:

#coding=utf-8
from socket import *
import random
import time
serverIp = input("請輸入服務器的ip:")
connNum = input("請輸入要鏈接服務器的次數(shù)(例如1000):")
g_socketList = []
for i in range(int(connNum)):
  s = socket(AF_INET, SOCK_STREAM)
  s.connect((serverIp, 7788))
  g_socketList.append(s)
  print(i)
while True:
  for s in g_socketList:
    s.send(str(random.randint(0,100)))
  # 用來測試
  #time.sleep(1)

更多關于Python相關內容可查看本站專題:《Python Socket編程技巧總結》、《Python數(shù)據(jù)結構與算法教程》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對大家Python程序設計有所幫助。

相關文章

  • 一文詳細介紹Python中pkl格式文件

    一文詳細介紹Python中pkl格式文件

    .pkl文件是Python中用于存儲對象的文件格式,全稱是"pickle",它是Python標準庫中的一個模塊,用于將Python對象序列化,以便于在不同的Python程序之間進行傳輸或存儲,這篇文章主要給大家介紹了如何通過一文詳細介紹Python中pkl格式文件的相關資料,需要的朋友可以參考下
    2024-05-05
  • Python 專題二 條件語句和循環(huán)語句的基礎知識

    Python 專題二 條件語句和循環(huán)語句的基礎知識

    本文主要介紹了Python條件語句和循環(huán)語句的基礎知識。主要內容包括: 1.條件語句:包括單分支、雙分支和多分支語句,if-elif-else;2.循環(huán)語句:while的使用及簡單網(wǎng)絡刷博器爬蟲;3.循環(huán)語句:for的使用及遍歷列表、元組、文件和字符串。
    2017-03-03
  • python基于windows平臺鎖定鍵盤輸入的方法

    python基于windows平臺鎖定鍵盤輸入的方法

    這篇文章主要介紹了python基于windows平臺鎖定鍵盤輸入的方法,涉及Python中調用user32.dll中BlockInput方法的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • Python基于pygame實現(xiàn)的font游戲字體(附源碼)

    Python基于pygame實現(xiàn)的font游戲字體(附源碼)

    這篇文章主要介紹了Python基于pygame實現(xiàn)的font游戲字體,涉及Python響應鍵盤按鍵動態(tài)操作圖片元素的相關技巧,需要的朋友可以參考下
    2015-11-11
  • python executemany的使用及注意事項

    python executemany的使用及注意事項

    這篇文章主要介紹了python executemany的使用及注意事項,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • Matplotlib中rcParams使用方法

    Matplotlib中rcParams使用方法

    這篇文章主要介紹了Matplotlib中rcParams使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • python使用Bokeh庫實現(xiàn)實時數(shù)據(jù)的可視化

    python使用Bokeh庫實現(xiàn)實時數(shù)據(jù)的可視化

    Python語言以其豐富的數(shù)據(jù)科學生態(tài)系統(tǒng)而聞名,其中Bokeh庫作為一種功能強大的可視化工具,為實時數(shù)據(jù)的可視化提供了優(yōu)秀的支持,本文將介紹如何使用Bokeh庫實現(xiàn)實時數(shù)據(jù)的可視化,并提供相關代碼實例,需要的朋友可以參考下
    2024-05-05
  • Python面向對象之類和對象實例詳解

    Python面向對象之類和對象實例詳解

    這篇文章主要介紹了Python面向對象之類和對象,結合實例形式詳細分析了Python面向對象相關的繼承、多態(tài)、類及對象等概念、原理、操作技巧與注意事項,需要的朋友可以參考下
    2018-12-12
  • python下paramiko模塊實現(xiàn)ssh連接登錄Linux服務器

    python下paramiko模塊實現(xiàn)ssh連接登錄Linux服務器

    這篇文章主要介紹了python下paramiko模塊實現(xiàn)ssh連接登錄Linux服務器的方法,實例分析了paramiko模塊實現(xiàn)ssh連接的具體用法,需要的朋友可以參考下
    2015-06-06
  • python文件操作seek()偏移量,讀取指正到指定位置操作

    python文件操作seek()偏移量,讀取指正到指定位置操作

    這篇文章主要介紹了python文件操作seek()偏移量,讀取指正到指定位置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評論

深泽县| 巩义市| 通榆县| 波密县| 刚察县| 怀化市| 高安市| 仙居县| 嘉祥县| 海南省| 镇雄县| 丹棱县| 萨嘎县| 应用必备| 黑山县| 科尔| 慈溪市| 大田县| 庄浪县| 潞西市| 潼南县| 湛江市| 韶关市| 富锦市| 城口县| 承德市| 英吉沙县| 崇礼县| 台前县| 五河县| 贡觉县| 浦县| 乐平市| 石棉县| 方正县| 祥云县| 成安县| 若尔盖县| 连山| 大田县| 三门峡市|