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