python学习笔记之socket,及中文编码问题

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等被视为同一种

你可能感兴趣的:(python,python,网络通信,socket)