1. 程式人生 > >Python--網絡編程-----socket編程示例--打電話--加上通訊循環

Python--網絡編程-----socket編程示例--打電話--加上通訊循環

reset 代碼 color enc 調用 電話 ket 生死 系統

一、服務端

 1 import socket
 2 
 3 
 4 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 5 phone.bind((127.0.0.1, 8080))  # 0-65535:0-1024給操作系統使用
 6 phone.listen(5)
 7 
 8 print(starting.....)
 9 conn, client_addr = phone.accept()
10 print(client_addr)
11 
12 while True:  # 通信循環
13     data = conn.recv(1024)
14 print(客戶端的數據, data) 15 16 conn.send(data.upper()) 17 18 conn.close() 19 phone.close()

二、客戶端

 1 import socket
 2 
 3 
 4 # 1、買手機
 5 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 6 # print(phone)
 7 
 8 # 2、撥號
 9 phone.connect((127.0.0.1, 8080))
10 
11 # 3、發、收消息
12 while True:
13 msg = input(>>:).strip() 14 phone.send(msg.encode(utf-8)) 15 data = phone.recv(1024) 16 print(data) 17 18 # 4、關閉 19 phone.close()

客戶端結果為:

1 >>:he
2 bHE
3 >>:asdf
4 bASDF
5 >>:

服務端結果為:

1 starting.....
2 (127.0.0.1, 64037)
3 客戶端的數據 bhe
4 客戶端的數據 b
asdf

三、有時間運行服務端程序的時候,顯示端口占用錯誤,這時候可以使用如下代碼防止出現這種情況

1 phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

四、當客戶端輸入為空時(也就是直接回車),按回車後,客戶端一直橫在那,

原因分析:

客戶端發送空信息需要調用操作系統接口,把客戶端程序內存中要發送的信息拷貝到操作系統內存中,如果為空的話,操作系統內存收不到數據,它也就不會發送給服務端,所以出現客戶端橫在那的現象

解決方法:

修改客戶端代碼:

1 while True:
2     msg = input(>>:).strip()
3     if not msg:
4         continue
5     phone.send(msg.encode(utf-8))
6     data = phone.recv(1024)
7     print(data)

五、如果客戶端意外斷開連接發生中斷,linux系統中,服務端會發生死循環,Windows系統中,服務端會直接報錯

解決方法:

修改服務端代碼:

 1 while True:  # 通信循環
 2     try:
 3         data = conn.recv(1024)
 4         if not data:  # 適用於linux操作系統
 5             break
 6         print(客戶端的數據, data)
 7     
 8         conn.send(data.upper())
 9     except ConnectionResetError:  # 適用於windows操作系統
10         break

Python--網絡編程-----socket編程示例--打電話--加上通訊循環