socketserver

創建socketserver的步驟

1.你必須自己創建一個請求處理類,並且這個類要繼承BaseRequestHandler,並且還有重寫父類裏的handle()

2.你必須實例化TCPServer, 並且傳遞server ip和你上面創建的請求處理類給這個TCPServer

3.
server.handle_request()  # 只處理一個請求
server.serve_forever()  # 處理多個請求,永遠執行

4.調用server_close() 關閉socket

socketserver

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
   
"""
    The request handler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

   
def handle(self):  # 跟客戶端所有的交互都是在handle裏寫的
        # self.request is the TCP socket connected to the client
       
while True# 有異常就抓出來 繼續循環
           
try:
               
self.data = self.request.recv(1024).strip()  # self.requestconn一樣,就是客戶端連過來而在服務端爲其生成的一個連接實例

   
            print("{} wrote:".format(self.client_address[0])) #self.client_addressaddr一樣,是客戶端連接ip 和端口

               
print(self.data.decode())
   
# just send back the same data, but upper-cased
                
self.request.send(self.data.upper())

            except ConnectionResetError as e:
                print("error:", e)
                break

if
__name__ == "__main__"# if這個語句代碼只在本腳本執行,作爲模塊在其他腳本不執行這條if代碼裏的語句
   
HOST, PORT = "localhost", 6969
   
print(__name__)

   
# Create the server, binding to localhost on port 9999
    # server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) #
一個實例化的TCPServer 只支持單線程 , server實例BaseRequestHandlerdeself.server
   
server = socketserver.ThreadingTCPServer((HOST, PORT),MyTCPHandler)  # 一個實例化的ThreadingTCPServer 支持多線程 Threading開啓新線程
    # server = socketserver.ForkingTCPServer((HOST,PORT),MyTCPHandler) #
一個實例化的ForkingTCPServer 支持多進程 Forking開啓多進程 只在Linux有效

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C

   
server.serve_forever()  # 處理多個請求,永遠執行

   
server.allow_reuse_address()  # 允許地址重用

# __name__
意思是文件名 被導入到其他腳本中就是本腳名(模塊名)  __main__代表本腳本,代表自己
# __name__
在自己腳本里是__main__, import 到其他腳本就是本腳本的文件名
例如:name1.py
print("I m the first")
print(__name__)
if __name__ == "__main__":
   
print("I m the second")

tes.py
import name1

一個python的文件有兩種使用的方法:

作用一,直接作爲腳本執行。

作用二,import到其他的python腳本中被調用(模塊重用)執行。

if __name__ == '__main__': 的作用就是控制這兩種情況執行代碼的過程,在if
__name__ ==
'__main__': 下的代碼只有在第一種情況下(即文件作爲腳本直接執行)纔會被執行,而import到其他腳本中是不會被執行的。



運行原理

每個python模塊(python文件)都包含內置的變量__name__,當運行模塊被執行的時候,__name__等於文件名(包含了後綴.py)。如果import到其他模塊中,則__name__等於模塊名稱(不包含後綴.py)。而"__main__"等於當前執行文件的名稱(包含了後綴.py)。所以當模塊被直接執行時,__name__ == '__main__'
結果爲真;而當模塊被import到其他模塊中時,__name__ == '__main__'
結果爲假,就是不調用對應的方法。



簡而言之就是:__name__
是當前模塊名,當模塊被直接運行時模塊名爲
__main__
。當模塊被直接運行時,代碼將被運行,當模塊是被導入時,代碼不被運行。

原文:https: // blog.csdn.net / youzhouliu / article / details / 53884496

client
import socket

client = socket.socket() 
# 默認famliy=AF_INET(ipv4)地址簇  type=SOCK_STREAM (tcp/ip) 聲明socket類型,同時生成socket連接對象
client.connect(("localhost", 6969))

while True:
    msg =
input("請輸入:").strip()  # 不能發送空數據
   
if len(msg) == 0: continue  # 如果msg長度爲0,就繼續 返回到下一次msg=raw_input("請輸入:").strip()
   
client.send(msg.encode("utf-8"))  # 3.x 只能發bytes類型數據,只能接收ASCII數據,漢字不行,要發漢字只能編碼成utf-8格式
   
data = client.recv(1024# 1024字節數據
   
print("recv:", data.decode("utf-8"))  # bytes類型打印出來要解碼

client.close()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章