基於Python的Socket服務器和客戶端通信(Pycharm)


先說一下為什么要發這個隨筆:

最近在玩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

 

 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM