python socket通信的小例子和幾點反思

服務器端的代碼非常簡單,收到客戶端連接建立後發送一個簡單的http 報文

# 導入 socket、sys 模塊
import socket
import sys

# 創建 socket 對象
serversocket = socket.socket(
            socket.AF_INET, socket.SOCK_STREAM) 
port = 80
serversocket.bind(('127.0.0.1', port))
# 設置最大連接數,超過後排隊
serversocket.listen(5)

while True:
    # 建立客戶端連接
    clientsocket,addr = serversocket.accept()      

    print("連接地址: %s" % str(addr))
    #str = clientsocket.recv(1024)
    #print(str)
    #msg='歡迎訪問菜鳥教程!'+ "\r\n"
    msg = 'HTTP/1.1 200 OK\r\nContent-Type: text/html;charset=ISO-8859-1\r\nContent-Length: 500\r\n\r\n<html>\r\n<head>\r\n<title> hello word it is my first try</title>\r\n</head>\r\n<body>\r\n<h2>\r\n hello word it is my first try</h2>\r\n</body>\r\n</html>\r\n'
    clientsocket.send(msg.encode('utf-8'))
    #clientsocket.close()

 客戶端連接建立後連發三條消息,然後收消息.

#!/usr/bin/python3
# 文件名:client.py

# 導入 socket、sys 模塊
import socket
import sys

# 創建 socket 對象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  

# 設置端口好
port = 80

# 連接服務,指定主機和端口
s.connect(('127.0.0.1', port))
sr = "this is the message from client"
s.send(sr.encode('utf-8'))
sr = "this is the message from client"
s.send(sr.encode('utf-8'))
sr = "this is the message from client"
s.send(sr.encode('utf-8'))
for index in range(1,10000):
	pass
	msg = s.recv(1024)
	print (msg.decode('utf-8')) 
while True:
	pass

先運行server,再運行client.client會收到server的http報文。

client中for循環是爲了延時,以免收的時候server還沒發(兩邊是異步的)。

去掉server中 收數據的註釋,則server會收到client 發送的 消息,不過收到內容是不確定的,

recv會將當前信道上所有的數據收過來,而此時信道上client發送了幾個消息是不確定的(server執行到這裏的時候client發送了幾次是不確定的)當在client發送第一條消息後加一個很大的延時,顯示server收到一個消息,而不加的話一般收到三個。

recv 函數是阻塞的,信道上沒有數據時會等待。

tcp 同時維持了兩個信道 ,收信道和發信道。因此是全雙工的通信,兩邊發送時不受影響,想發送時將數據扔到信道里去就行,另一端讀數據是從信道里按字節數量往外讀,其實發幾條是語句呈現的假象,另一端實際上並不能知道消息的分界(沒有特殊約定的話),只是從信道按字節數量讀出了數據。

 what messed me up is :

當我運行server以後,當我在dege瀏覽器中輸入127。0。0。1
 server建立連接後必須收一次數據,才能將http報文發出去。如果是tcp的話按理來說是不用的。

在chrom中就不用收那一次數據,而必鬚鬍close 之前加個延時,這樣chrome才能收到http報文。




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