详解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浅拷贝与深拷贝用法实例
May 09 Python
在Django框架中运行Python应用全攻略
Jul 17 Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 Python
降低python版本的操作方法
Sep 11 Python
Python可视化工具如何实现动态图表
Oct 23 Python
python基于socket模拟实现ssh远程执行命令
Dec 05 Python
如何用python开发Zeroc Ice应用
Jan 29 Python
python中子类与父类的关系基础知识点
Feb 02 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 Python
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
Apr 27 Python
Python 如何将integer转化为罗马数(3999以内)
Jun 05 Python
Python实战之大鱼吃小鱼游戏的实现
Apr 01 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/04 新手入门
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
JavaScript数组_动力节点Java学院整理
2017/06/26 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
Python greenlet实现原理和使用示例
2014/09/24 Python
python编程开发之日期操作实例分析
2015/11/13 Python
Python抓取电影天堂电影信息的代码
2016/04/07 Python
微信跳一跳游戏python脚本
2020/04/01 Python
Python3之文件读写操作的实例讲解
2018/01/23 Python
python Celery定时任务的示例
2018/03/13 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
2018/06/13 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
flask中的wtforms使用方法
2018/07/21 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
浅谈pandas dataframe对除数是零的处理
2020/07/20 Python
python将数据插入数据库的代码分享
2020/08/16 Python
python简单实现插入排序实例代码
2020/12/16 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
计算机专业自我鉴定
2013/10/15 职场文书
超市5.1促销活动
2014/01/15 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
golang日志包logger的用法详解
2021/05/05 Golang
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python