详解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教程之用py2exe将PY文件转成EXE文件
Jun 12 Python
Python常用模块介绍
Nov 21 Python
Python的Django框架中的Context使用
Jul 15 Python
Python迭代器与生成器基本用法分析
Jul 26 Python
详解多线程Django程序耗尽数据库连接的问题
Oct 08 Python
Django 实现前端图片压缩功能的方法
Aug 07 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
Sep 06 Python
pytest中文文档之编写断言
Sep 12 Python
Python3爬虫关于识别点触点选验证码的实例讲解
Jul 30 Python
Python中猜拳游戏与猜筛子游戏的实现方法
Sep 04 Python
Django多数据库联用实现方法解析
Nov 12 Python
用Python简陋模拟n阶魔方
Apr 17 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验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
php实现水仙花数示例分享
2014/04/03 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
php判断当前操作系统类型
2015/10/28 PHP
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
js实现刷新iframe的方法汇总
2015/04/27 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
HTML中使背景图片自适应浏览器大小实例详解
2017/04/06 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
Vue学习笔记之表单输入控件绑定
2017/09/05 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
python pandas模块基础学习详解
2019/07/03 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
HTML5轻松实现全屏视频背景的示例
2018/04/23 HTML / CSS
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
Linux的文件类型
2016/07/05 面试题
XMLHttpRequest对象在IE和Firefox中创建方式有没有不同
2016/03/23 面试题
教师一岗双责责任书
2014/04/16 职场文书
课外活动实习计划
2015/01/19 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
2016新年感言
2015/08/03 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript
Python提取PDF指定内容并生成新文件
2021/06/09 Python