服務器端的代碼非常簡單,收到客戶端連接建立後發送一個簡單的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建立連接後必須收一次數據,才能將http報文發出去。如果是tcp的話按理來說是不用的。