详解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 当前全局变量和入口参数的所有属性
Jul 01 Python
详解Python中的装饰器、闭包和functools的教程
Apr 02 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
Dec 31 Python
初步剖析C语言编程中的结构体
Jan 16 Python
Python 爬取携程所有机票的实例代码
Jun 11 Python
Django异步任务之Celery的基本使用
Mar 23 Python
python+django+rest框架配置创建方法
Aug 31 Python
python 操作hive pyhs2方式
Dec 21 Python
python 计算概率密度、累计分布、逆函数的例子
Feb 25 Python
基于python判断字符串括号是否闭合{}[]()
Sep 21 Python
python基础之匿名函数详解
Apr 21 Python
Python matplotlib多个子图绘制整合
Apr 13 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
php实现ping
2006/10/09 PHP
几个学习PHP的网址
2006/11/25 PHP
PHP5中新增stdClass 内部保留类
2011/06/13 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
javascript回调函数详解
2018/02/06 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
vue: WebStorm设置快速编译运行的方法
2018/10/18 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
python实现问号表达式(?)的方法
2013/11/27 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
详解python 发送邮件实例代码
2016/12/22 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
python小程序实现刷票功能详解
2019/07/17 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
食品安全承诺书范文
2014/08/29 职场文书
检查机关领导群众路线教育实践活动个人整改措施
2014/10/28 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书
离婚起诉状范本
2015/05/19 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书
Python基础之操作MySQL数据库
2021/05/06 Python
SpringBoot2零基础到精通之数据库专项精讲
2022/03/22 Java/Android
使用python绘制横竖条形图
2022/04/21 Python
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS