先說一下為什么要發這個隨筆:
最近在玩python,通過學習socket,就想試試服務器和客戶端的通信。^_^
ip和端口這倆有點東西,一頓亂整摸出點門路,也算是為我下學期的計算機網絡打下了鋪墊了^_^
情景1:
寫了客戶端和服務器的代碼,先運行的客戶端,一直在提示如下圖
相信都知道為什么了,服務器還沒有先執行,都沒有listen,所以出現了這種情況
解決辦法:先運行服務器的代碼,再跑客戶端
情景2:
這種情況是運行了兩次服務器代碼(眼神不好就不要亂運行!!)
不要默認點運行的第一個按鈕,要不總是運行的都是上一次的代碼。以后一定注意。
情景3:
說說ip地址,通常客戶端連接的是自己機器上的ipv4地址,服務器輸入(0.0.0.0)就好了。
Windows下查看在cmd中輸入ipconfig
Mac和Linux在終端中輸入:ifconfig
最后放兩張運行成功的圖片
客戶端:
import socket
client = socket.socket()
client.connect(('10.211.55.31',8000))
client.send("bobby".encode("utf8"))
client.close
服務器:
import socket
server= socket.socket()
server.bind(('10.211.55.31',8000))
server.listen()
sock, addr = server.accept()
data = ""
while True:
temp_data = sock.recv(1024)
print(temp_data)
if temp_data:
data += temp_data.decode("utf8")
if temp_data.decode("utf8").endswith("#"):
break;
else:
break;
print(data)
sock.close
后來改進的代碼:
客戶端:
1 import socket 2 client = socket.socket() 3 client.connect(('10.211.55.31',8000)) 4 5 while True: 6 input_data = input() 7 client.send(input_data.encode("utf8")) 8 server_data = client.recv(1024) 9 print("服務器響應:{}".format(server_data.decode("utf8"))) 10 server_data2 = client.recv(1024) 11 print("服務器響應:{}".format(server_data2.decode("utf8"))) 12 client.close
服務器:
1 import socket 2 import threading 3 4 server= socket.socket() 5 server.bind(('10.211.55.31',8000)) 6 server.listen() 7 8 def hand1e_sock(sock,addr): 9 temp_data = sock.recv(1024) 10 print(temp_data.decode("utf8")) 11 input_data = input() 12 sock.send(input_data.encode("utf8")) 13 #獲取客戶端的連接並啟動線程去處理 14 while True: 15 #阻塞等待鏈接 16 sock, addr = server.accept() 17 #每當進來一個用戶就啟動一個線程去跟用戶連接 18 client_thread = threading.Thread(target=hand1e_sock,args=(sock,addr)) 19 client_thread .start() 20 #注意:傳遞的是方法的名稱而不是方法的調用 21 data = "" 22 while True: 23 sock.send("welcome to server".encode("utf8")) 24 temp_data = sock.recv(1024) 25 print(temp_data.decode("utf8")) 26 input_data = input() 27 sock.send(input_data.encode("utf8")) 28 #recv方法是阻塞的 29 if temp_data: 30 data += temp_data.decode("utf8") 31 if temp_data.decode("utf8").endswith("#"): 32 break; 33 else: 34 break; 35 print(data) 36 sock.close