详解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读写文件操作示例程序
Dec 02 Python
Python 列表(List)操作方法详解
Mar 11 Python
Python操作SQLite简明教程
Jul 10 Python
利用标准库fractions模块让Python支持分数类型的方法详解
Aug 11 Python
python中requests和https使用简单示例
Jan 18 Python
用 Python 连接 MySQL 的几种方式详解
Apr 04 Python
浅谈python下tiff图像的读取和保存方法
Dec 04 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
python sorted函数的小练习及解答
Sep 18 Python
Python读取excel文件中带公式的值的实现
Apr 17 Python
Python3爬虫中Ajax的用法
Jul 10 Python
Python return语句如何实现结果返回调用
Oct 15 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桌面中心(四) 数据显示
2007/03/11 PHP
《PHP编程最快明白》第八讲:php启发和小结
2010/11/01 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
swiper 解决动态加载数据滑动失效的问题
2018/02/26 Javascript
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
python进程类subprocess的一些操作方法例子
2014/11/22 Python
Python操作MySQL数据库9个实用实例
2015/12/11 Python
python实现汉诺塔递归算法经典案例
2021/03/01 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
Django 请求Request的具体使用方法
2019/11/11 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
2020/06/10 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
敏捷开发的主要原则都有哪些
2015/04/26 面试题
小学生演讲稿
2014/01/12 职场文书
2014年最新学习全国两会精神心得
2014/03/17 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
安全目标责任书
2014/07/22 职场文书
公司感谢信范文
2015/01/22 职场文书
小学三年级班主任工作经验交流材料
2015/11/02 职场文书
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android
海弦WR-800F
2022/04/05 无线电
Golang实现可重入锁的示例代码
2022/05/25 Golang