Python--網絡編程-----socket編程示例--打電話--加上通信循環與bug修復

1、服務端linux

 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()

2、客戶端windows

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

客戶端結果爲:socket

1 >>:he
2 b'HE'
3 >>:asdf
4 b'ASDF'
5 >>:

服務端結果爲:spa

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

3、有時間運行服務端程序的時候,顯示端口占用錯誤,這時候可使用以下代碼防止出現這種狀況操作系統

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

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

緣由分析:blog

客戶端發送空信息須要調用操做系統接口,把客戶端程序內存中要發送的信息拷貝到操做系統內存中,若是爲空的話,操做系統內存收不到數據,它也就不會發送給服務端,因此出現客戶端橫在那的現象接口

解決方法:ip

修改客戶端代碼:內存

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)

5、若是客戶端意外斷開鏈接發生中斷,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
相關文章
相關標籤/搜索