python學習筆記之socket,及中文編碼問題

2021-10-24 10:24:42 字數 2714 閱讀 7516

server.py

# -*- coding: cp936 -*-

#基於切換連線的迴圈通訊

import socket #首先我們在檔案中匯入socket 模組

phone = socket.socket() #例項化乙個物件

phone.bind(('10.11.32.7',8765))#bind是存放ip位址的(這裡存放的是本地的ip位址)

phone.listen(1)#可以設定連線的個數,

print('歡迎使用志哥python教學案例之聊天室案例!!\n現在等待客戶端開啟。。')

conn,adds = phone.accept()

print('連線成功')

while 1:#要迴圈聊天我們要重複接收傳送

receives_commands = conn.recv(1024) #接收命令請求,最多接收1024位元組當然你也可以調整

receivse_commands = receives_commands.decode('cp936')#網路傳輸是以位元組的形勢的所以我們要進行解碼

if receives_commands.upper() ==b'q':

print('客戶端退出')

break #正常結束

print('c說:'+receives_commands) #列印訊息

dispatch_orders = raw_input('我說:').strip().decode('gb2312').encode('utf-8')

while not(dispatch_orders):

dispatch_orders = raw_input('我說:').strip()

conn.send(dispatch_orders)

conn.close() #關閉連線

phone.close#關閉服務端

client.py

# -*- coding: utf-8 -*-

import socket

phone = socket.socket()

phone.connect(('10.11.32.7',8765)) #連線服務端位址

while 1:

dispatch_orders = raw_input('我說:').strip().decode('utf-8').encode('cp936')#傳送請求

if not(dispatch_orders):

continue

phone.send(dispatch_orders) #傳送

if dispatch_orders.upper() ==b'q':#正常退出

break

receives_commands = phone.recv(1024)#接收服務端的回執

receivse_commands = receives_commands.decode('utf-8')

print('s說:'+receives_commands) #列印訊息

phone.close()#關閉客戶端

此實驗的最大收穫是弄懂了python的中文編碼機制。以下純粹自己觀點不知道對不對。

1、raw_input獲取的結果,應該為終端中文編碼的unicode編碼。其中linux預設為utf-8,windows平台為gb2312。

2、python2(python3不詳)有自動解碼機制,也就是unicode編碼不用decode也可以自動按終端編碼解碼。

測試如下

# -*- coding: cp936 -*-

a = raw_input('請輸入:')

print(a)

輸出無亂碼。

# -*- coding: cp936 -*-

a = raw_input('請輸入:').strip().decode('cp936')

print(a)

輸出仍無亂碼

# -*- coding: cp936 -*-

a = raw_input('請輸入:').strip().decode('cp936').encode('utf-8')

print(a)

結果為亂碼,因為用utf-8編成了unicode,python自動用gb2312的方式解碼,出現解碼錯誤。

# -*- coding: cp936 -*-

a = raw_input('請輸入:').strip().decode('cp936').encode('utf-8').decode('utf-8')

print(a)

windows平台結果無亂碼,因為輸出的為正確的utf-8編碼文字,windows系統雖然輸入的是gb2312但是顯示utf-8的文字沒問題。

綜上,我的socket通訊程式中如果雙方是相同平台,去掉所有的encode和decode方法,程式仍能正常執行,而且中文也沒亂碼,如果是乙個windows乙個linux則要按我上面的程式寫,但收到資料後的解碼其實也可以不寫,結果也是正常的。

最後為了新手寫一句 以上**中 cp936是gb系列編碼的別稱,cp是code page 的縮寫微軟將所有區域**進行了編號,936號就是gb系,至於gbk gb2312等被視為同一種

sock程式設計學習2

面向連線的服務sock stream sock seqpacket,在開始交換資料之前,需要在請求服務的程序套接字和提供服務的程序套接字之間建立乙個連線 客戶端通過呼叫connect.int connect int sockfd const struct addr,socklen t len 在co...

Python學習筆記之IF

關係表示式 邏輯表示式 and,or,not 單分支 num 0 if num 1 print num 大於 1 else print num 不大於1 雙分支 num 10 if num 1 print num 大於 10 elif num 10 print num 等於 10 elif num ...

python 連線mysql 使用sock 及引數

加引數指到mysql的配置 mysqldb.connect user root read default file etc my.conf 例如 conn mysqldb.connect host 10.3.18.142 user user,passwd pwd,db db,read default...