详解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字符串和文件操作常用函数分析
Apr 08 Python
pandas 实现字典转换成DataFrame的方法
Jul 04 Python
python中的json总结
Oct 11 Python
Python读取txt某几列绘图的方法
Oct 14 Python
Python读取mat文件,并保存为pickle格式的方法
Oct 23 Python
对python创建及引用动态变量名的示例讲解
Nov 10 Python
python实现简单日志记录库glog的使用
Dec 13 Python
Python3 全自动更新已安装的模块实现
Jan 06 Python
Python 识别12306图片验证码物品的实现示例
Jan 20 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
Apr 14 Python
关于PySnooper 永远不要使用print进行调试的问题
Mar 04 Python
python3美化表格数据输出结果的实现代码
Apr 14 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
2006/10/09 PHP
PHP输入流php://input介绍
2012/09/18 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
2013/06/05 PHP
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
使用ltrace工具跟踪PHP库函数调用的方法
2016/04/25 PHP
php数据访问之查询关键字
2016/05/09 PHP
摘自百度的图片轮换效果代码
2007/11/19 Javascript
js调用css属性写法
2013/09/21 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
使用jquery Ajax实现上传附件功能
2018/10/23 jQuery
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
简单介绍Python中的RSS处理
2015/04/13 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
django的model操作汇整详解
2019/07/26 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
Python实现汇率转换操作
2020/05/03 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
2021/01/05 Python
CSS3使用border-radius属性制作圆角
2014/12/22 HTML / CSS
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
经典的班主任推荐信
2013/10/28 职场文书
车工岗位职责
2013/11/26 职场文书
施工质量承诺书范文
2014/05/30 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
岗位职责范本大全
2015/02/26 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
创业计划书之溜冰场
2019/10/25 职场文书
Python Django搭建文件下载服务器的实现
2021/05/10 Python
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS