日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python高級編程——網絡編程(三)

系統 1978 0

TCP和并發服務器

與UDP不同的是,他是一個面向連接的,可靠的數據傳輸協議

TCP通信比較復雜

先寫一個TCP服務器,一般步驟如下:

1、首先是要創建一個socket套接字:socket()

2、服務器一般是需要一個固定的IP地址和固定端口號,服務器就要綁定這個IP地址和端口號:bind()

3、客戶端連接服務器是是有一定的數量(允許最大連接數)的,而這個數量是服務器設定的:listen()

4、上面3步是做被連接的準備,這一步是來接受客戶端的數據,在接受數據之前,服務器還是需要接受客戶端的socket套接字和IP地址:accept()

5、只有服務器和客戶端綁定相同的IP地址,服務器和客戶端才可以互相接收數據和發送數據,常理來想,服務器是一只被開啟的,也是一直接受數據,所以在接受數據的過程中,我們需要無限循環:recv()

6、如果我們要發送數據給客戶端,客戶端也需要綁定上面的地址,然后需要調用相應的函數send()

            
              import
            
            
               socket



            
            
              #
            
            
               TCP
            
            
              
#
            
            
               創建一個服務器socket套接字
            
            
server_socket =
            
               socket.socket(socket.AF_INET, socket.SOCK_STREAM)

            
            
              #
            
            
               服務器的IP地址和端口號
            
            
address = (
            
              "
            
            
              127.0.0.1
            
            
              "
            
            , 9999
            
              )

            
            
              #
            
            
               服務器綁定地址
            
            
              server_socket.bind(address)

            
            
              #
            
            
               設置服務器的最大連接數
            
            
server_socket.listen(1
            
              )

            
            
              #
            
            
               創建一個等待連接的客戶端socket套接字,accept()函數會返回兩個值,可以自行打印
            
            
client_socket, address =
            
               server_socket.accept()

            
            
              #
            
            
               服務器需要不停的接受客戶端的發來的數據
            
            
              while
            
            
               True:
    
            
            
              """
            
            
              
    以防客戶端連接失敗,需要檢測異常
    無論是接受數據還是發送數據,我們需要將數據統一編碼和解碼
    
            
            
              """
            
            
              try
            
            
              :
        data 
            
            = client_socket.recv(2048).decode(
            
              "
            
            
              UTF-8
            
            
              "
            
            
              )
        
            
            
              #
            
            
               數據處理
            
            
              print
            
            (
            
              "
            
            
              服務器接受的數據:
            
            
              "
            
            
              , data)   # 服務器接受的數據:我是一個客戶端
        client_socket.send(
            
            
              "
            
            
              我是一個服務器
            
            
              "
            
            .encode(
            
              "
            
            
              UTF-8
            
            
              "
            
            
              ))
    
            
            
              except
            
            
              :
        
            
            
              break
            
          

再寫一個TCP客戶端,一般步驟如下:

1、首先是要創建一個socket套接字:socket()

2、客戶端一般是不需要一個固定的IP地址和固定端口號,連接服務器的時候系統會自動分配端口號

3、客戶端連接服務器必須先知道服務器的IP地址和端口號,然后在連接服務器:connect()

4、上面3步是做連接的準備,這一步是來發送客戶端的數據:send()

5、客戶端也可以一直接受服務器發來的數據,所以在接受數據的過程中,我們需要無限循環:recv()

            
              import
            
            
               socket


            
            
              #
            
            
               客戶端需要創建一個套接字
            
            
client_socket =
            
               socket.socket(socket.AF_INET, socket.SOCK_STREAM)


            
            
              #
            
            
               客戶端需要連接服務器,必須先知道服務器的IP地址和端口號
            
            
address = (
            
              "
            
            
              127.0.0.1
            
            
              "
            
            , 9999
            
              )


            
            
              #
            
            
               連接服務器
            
            
              client_socket.connect(address)


            
            
              #
            
            
               這個數據是將要發送的數據
            
            
data = 
            
              "
            
            
              我是一個客戶端
            
            
              "
            
            
              
client_socket.send(data.encode(
            
            
              "
            
            
              UTF-8
            
            
              "
            
            
              ))

            
            
              while
            
            
               True:
    
            
            
              """
            
            
              
    以防服務器中斷退出,需要檢測異常
    無論是接受數據還是發送數據,我們需要將數據統一編碼和解碼
    
            
            
              """
            
            
              try
            
            
              :
        data 
            
            = client_socket.recv(2048).decode(
            
              "
            
            
              UTF-8
            
            
              "
            
            
              )
        
            
            
              #
            
            
               數據處理,這里打印出來并且將數據發回客戶端
            
            
              print
            
            (
            
              "
            
            
              客戶端接受的數據:
            
            
              "
            
            
              , data)
    
            
            
              except
            
            
              :
        
            
            
              break
            
          

?并發服務器,這里我只介紹多線程服務器,進程和線程是差不多的)

  在TCP服務器的原有基礎上增加一個線程,再將監聽數增加為5,就可以允許5個客戶端線程同時訪問,并且可同時發送和接受數據

            
              import
            
            
               socket

            
            
              from
            
             threading 
            
              import
            
            
               Thread



            
            
              #
            
            
               TCP
            
            
              
#
            
            
               創建一個服務器socket套接字
            
            
server_socket =
            
               socket.socket(socket.AF_INET, socket.SOCK_STREAM)

            
            
              #
            
            
               服務器的IP地址和端口號
            
            
address = (
            
              "
            
            
              127.0.0.1
            
            
              "
            
            , 9999
            
              )



            
            
              def
            
            
               net_connect():
    
            
            
              try
            
            
              :
        
            
            
              #
            
            
               服務器綁定地址
            
            
                      server_socket.bind(address)
        
            
            
              #
            
            
               設置服務器的最大連接數
            
            
        server_socket.listen(5
            
              )
    
            
            
              except
            
            
              :
        
            
            
              return
            
            
              #
            
            
               創建線程
            
            
    th = Thread(target=
            
              recv_data)
    th.start()



            
            
              def
            
            
               recv_data():
    
            
            
              #
            
            
               服務器需要不停的接受客戶端的發來的數據
            
            
              while
            
            
               True:
        
            
            
              """
            
            
              
        以防客戶端連接失敗,需要檢測異常
        無論是接受數據還是發送數據,我們需要將數據統一編碼和解碼
        
            
            
              """
            
            
              #
            
            
               創建一個等待連接的客戶端socket套接字,accept()函數會返回兩個值,可以自行打印
            
            
        client_socket, address =
            
               server_socket.accept()
            
            
              try
            
            
              :
            data 
            
            = client_socket.recv(2048).decode(
            
              "
            
            
              UTF-8
            
            
              "
            
            
              )
            
            
            
              #
            
            
               數據處理
            
            
              print
            
            (
            
              "
            
            
              服務器接受的數據:
            
            
              "
            
            
              , data)
            client_socket.send(
            
            
              "
            
            
              我是一個服務器
            
            
              "
            
            .encode(
            
              "
            
            
              UTF-8
            
            
              "
            
            
              ))
        
            
            
              except
            
            
              :
            
            
            
              break
            
            
              


net_connect()
            
          

?

在TCP客戶端上也增加一個線程,然后同時運行多次這個客戶端程序:

            
              import
            
            
               socket


            
            
              #
            
            
               客戶端需要創建一個套接字
            
            
              from
            
             threading 
            
              import
            
            
               Thread

client_socket 
            
            =
            
               socket.socket(socket.AF_INET, socket.SOCK_STREAM)


            
            
              #
            
            
               客戶端需要連接服務器,必須先知道服務器的IP地址和端口號
            
            
address = (
            
              "
            
            
              127.0.0.1
            
            
              "
            
            , 9999
            
              )



            
            
              def
            
            
               net_connect():
    
            
            
              try
            
            
              :
        
            
            
              #
            
            
               連接服務器
            
            
                      client_socket.connect(address)
    
            
            
              except
            
            
              :
        
            
            
              return
            
            
              
    th 
            
            = Thread(target=
            
              recv_data)
    
            
            
              #
            
            
               th.setDaemon(True)
            
            
                  th.start()



            
            
              def
            
            
               recv_data():
    
            
            
              #
            
            
               這個數據是將要發送的數據
            
            
    data = 
            
              "
            
            
              我是一個客戶端
            
            
              "
            
            
              
    client_socket.send(data.encode(
            
            
              "
            
            
              UTF-8
            
            
              "
            
            
              ))

    
            
            
              while
            
            
               True:
        
            
            
              """
            
            
              
        以防服務器中斷退出,需要檢測異常
        無論是接受數據還是發送數據,我們需要將數據統一編碼和解碼
        
            
            
              """
            
            
              try
            
            
              :
            data 
            
            = client_socket.recv(2048).decode(
            
              "
            
            
              UTF-8
            
            
              "
            
            
              )
            
            
            
              #
            
            
               數據處理,這里打印出來并且將數據發回客戶端
            
            
              print
            
            (
            
              "
            
            
              客戶端接受的數據:
            
            
              "
            
            
              , data)
        
            
            
              except
            
            
              :
            
            
            
              break
            
            
              


net_connect()
            
          

?


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 潜山县| 锡林郭勒盟| 锦屏县| 来凤县| 房产| 舟曲县| 托克逊县| 白沙| 锦屏县| 河间市| 镇原县| 聊城市| 曲周县| 湖北省| 达日县| 合阳县| 南靖县| 富源县| 讷河市| 永州市| 清涧县| 泰来县| 分宜县| 荔浦县| 鄂温| 巴彦淖尔市| 阳春市| 阜新| 开阳县| 图们市| 会昌县| 德江县| 霞浦县| 濉溪县| 武川县| 唐海县| 宜城市| 文成县| 垦利县| 犍为县| 广宁县|