详解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中执行shell命令的几个方法小结
Sep 18 Python
Python正则获取、过滤或者替换HTML标签的方法
Jan 28 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
python绘制立方体的方法
Jul 02 Python
浅谈python之新式类
Aug 12 Python
python实现简单五子棋游戏
Jun 18 Python
python实现最小二乘法线性拟合
Jul 19 Python
python word转pdf代码实例
Aug 16 Python
Python List列表对象内置方法实例详解
Oct 22 Python
Flask缓存静态文件的具体方法
Aug 02 Python
详解用 python-docx 创建浮动图片
Jan 24 Python
解决pytorch读取自制数据集出现过的问题
May 31 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
融入意大利的咖啡文化
2021/03/03 咖啡文化
PHP数据集构建JSON格式及新数组的方法
2012/11/07 PHP
ThinkPHP的URL重写问题
2014/06/22 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
jQuery学习笔记 操作jQuery对象 CSS处理
2012/09/19 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
JS onmousemove鼠标移动坐标接龙DIV效果实例
2013/12/16 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
vue-cli的webpack模板项目配置文件分析
2017/04/01 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
详解CommonJS和ES6模块循环加载处理的区别
2018/12/26 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
药品业务员岗位职责
2014/04/17 职场文书
硕士生找工作求职信
2014/07/05 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
受资助学生感谢信
2015/01/21 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
HAM-2000摩机图
2021/04/22 无线电
完美解决golang go get私有仓库的问题
2021/05/05 Golang
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android
Python实现视频中添加音频工具详解
2021/12/06 Python