详解python3中socket套接字的编码问题解决


Posted in Python onJuly 01, 2017

一、TCP

1、tcp服务器创建

#创建服务器
from socket import *
from time import ctime #导入ctime

HOST = ''    #任意主机
PORT = 21567  #随机提供个端口号
BUFSIZ = 1024  # 缓冲区大小设置为1KB,可以根据网络性能和程序需要改变这个容量
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)  #分配了 TCP 服务器套接字
tcpSerSock.bind(ADDR)  #绑定到服务器地址以及开启 TCP 监听器的调用。
tcpSerSock.listen(5)  #listen()方法的参数是在连接被转接或拒绝之前,传入连接请求的最大数

"""
  一旦进入服务器的无限循环之中,我们就(被动地)等待客户端的连接。当一个连接请求出
现时,我们进入对话循环中,在该循环中我们等待客户端发送的消息。如果消息是空白的,这意
味着客户端已经退出,所以此时我们将跳出对话循环,关闭当前客户端连接,然后等待另一个客
户端连接。如果确实得到了客户端发送的消息,就将其格式化并返回相同的数据,但是会在这些
数据中加上当前时间戳的前缀。最后一行永远不会执行,它只是用来提醒读者,如果写了一个处
理程序来考虑一个更加优雅的退出方式,正如前面讨论的,那么应该调用 close()方法。
"""
while True:
  print("waiting for connection")
  tcpCliSock, addr = tcpSerSock.accept() # 接收客户端连接,返回客户端和地址
  print("...connected from:", addr)

  while True:
    data = tcpCliSock.recv(BUFSIZ).decode() #对话(接收 / 发送) 接收客户端的data
    if not data:
      break
    tcpCliSock.send(('service:'+ctime()+'--'+data).encode())  #发送时间戳 和data信息给客户端

  tcpCliSock.close()
tcpSerSock.close()

2、tcp客户端创建

from socket import *

HOST = 'localhost'
PORT = 21567      #端口号 PORT 应该与你为服务器设置的完全相同(否则,将无法进行通信)
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)  #分配 TCP 客户端套接字
tcpCliSock.connect(ADDR)  #主动连接

"""
  我们必须解码来自服务器端的字符串(借助于distutils.log.warn()

"""
while True:
  data = input("> ")
  if not data:   #用户如果没有输入,则终止
    break
  tcpCliSock.send(data.encode())   #发送客户端的data给服务器
  data = tcpCliSock.recv(BUFSIZ).decode() #接收服务器的data
  if not data:  #或者服务器终止且对 recv()方法的调用失败
    break
  print('返回:%s'%data)
tcpCliSock.close()

二、UDP

1、UDP服务器创建

"""

  这个脚本创建一个 UDP 服务器,它接受客户端发来的消息,并将加了时间戳前缀的该消息返回给客户端。

"""

from socket import *

from time import ctime

 

HOST = ""

PORT = 21567

BUFSIZ = 1024

ADDR = (HOST, PORT)

 

udpServer = socket(AF_INET, SOCK_DGRAM)

udpServer.bind(ADDR)

 

while True:

  print("waiting for masssage")

  data,addr = udpServer.recvfrom(BUFSIZ) #接收

  data = data.decode()

  udpServer.sendto((ctime()+"--"+ data).encode(),addr)

  print("received from and returned to ",addr)

 

udpServer.close()

2、UDP客户端创建 

#这个脚本创建一个 UDP 客户端,它提示用户输入发送给服务器的消息,并接收服务器加了时间戳前缀的消息,然后将它们显示给用户。
from socket import *
HOST = 'localhost'
PORT = 21567      #端口号 PORT 应该与你为服务器设置的完全相同(否则,将无法进行通信)
BUFSIZ = 1024
ADDR = (HOST, PORT)

udpCS = socket(AF_INET, SOCK_DGRAM)

while True:
  data = input("> ")
  if not data:
    break
  udpCS.sendto(data.encode(),ADDR)
  data,ADDR = udpCS.recvfrom(BUFSIZ)
  if not data:
    break
  print(data)

udpCS.close()

其实道理都差不多,在python3中,利用套接字传输的内容都以byte形式传输,这时候传送时(send/sendto)需要encode,接收(recv)时需要decode。只要掌握这个重点,处理这个问题就很简单了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的ORM框架SQLAlchemy入门教程
Apr 28 Python
python绘图库Matplotlib的安装
Jul 03 Python
Cpy和Python的效率对比
Mar 20 Python
10个易被忽视但应掌握的Python基本用法
Apr 01 Python
Python微信库:itchat的用法详解
Aug 14 Python
Python学习笔记之函数的参数和返回值的使用
Nov 20 Python
基于TensorBoard中graph模块图结构分析
Feb 15 Python
python实现邮件循环自动发件功能
Sep 11 Python
python使用matplotlib绘制折线图的示例代码
Sep 22 Python
如何基于Python pygame实现动画跑马灯
Nov 18 Python
Python爬虫分析微博热搜关键词的实现代码
Feb 22 Python
python基础之文件操作
Oct 24 Python
详解Python中for循环是如何工作的
Jun 30 #Python
python 连接sqlite及简单操作
Jun 30 #Python
利用Python破解斗地主残局详解
Jun 30 #Python
Python实现的文本编辑器功能示例
Jun 30 #Python
Python构建XML树结构的方法示例
Jun 30 #Python
基于python的Tkinter编写登陆注册界面
Jun 30 #Python
Python使用微信SDK实现的微信支付功能示例
Jun 30 #Python
You might like
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
2008/11/18 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
JQuery1.6 使用方法三
2011/11/23 Javascript
javascript中encodeURI和decodeURI方法使用介绍
2013/05/06 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
获取当前按钮或者html的ID名称实例(推荐)
2017/06/23 Javascript
Nodejs中crypto模块的安全知识讲解
2018/01/03 NodeJs
Canvas实现微信红包照片效果
2018/08/21 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
小程序实现单选多选功能
2018/11/04 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
[47:48]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第三局
2016/02/28 DOTA
python类继承与子类实例初始化用法分析
2015/04/17 Python
python 读取excel文件生成sql文件实例详解
2017/05/12 Python
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
简单了解python模块概念
2018/01/11 Python
Python内置模块logging用法实例分析
2018/02/12 Python
python 多线程重启方法
2019/02/18 Python
python实现大学人员管理系统
2019/10/25 Python
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
物业招聘计划书
2014/01/10 职场文书
违反课堂纪律检讨书
2014/01/19 职场文书
社区学雷锋活动策划方案
2014/01/30 职场文书
竞争性谈判邀请书
2014/02/06 职场文书
旷工检讨书1000字
2015/01/01 职场文书
中秋客户感谢信
2015/01/22 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python
详解Java实践之适配器模式
2021/06/18 Java/Android
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL