详解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 30 Python
Python中pow()和math.pow()函数用法示例
Feb 11 Python
python 列表,数组,矩阵两两转换tolist()的实例
Apr 04 Python
python 读入多行数据的实例
Apr 19 Python
Python 确定多项式拟合/回归的阶数实例
Dec 29 Python
pyqt远程批量执行Linux命令程序的方法
Feb 14 Python
详解python中list的使用
Mar 15 Python
python图像处理入门(一)
Apr 04 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 Python
Python 忽略文件名编码的方法
Aug 01 Python
pytorch 如何使用batch训练lstm网络
May 28 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/12/14 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
用JS实现图片轮播效果代码(一)
2016/06/26 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
解析Json字符串的三种方法日常常用
2018/05/02 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
python中嵌套函数的实操步骤
2019/02/27 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
Python request post上传文件常见要点
2020/11/20 Python
css3实现背景图片拉伸效果像桌面壁纸一样
2013/08/19 HTML / CSS
Zadig&Voltaire官网:法国时装品牌
2018/01/05 全球购物
精选奢华:THE LIST
2019/09/05 全球购物
日语翻译个人求职的自我评价
2013/10/14 职场文书
电话销售经理岗位职责
2013/12/07 职场文书
超市促销活动方案
2014/03/05 职场文书
物业总经理助理岗位职责
2014/06/29 职场文书
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
降价通知函
2015/04/23 职场文书
高二语文教学反思
2016/02/16 职场文书
Django程序的优化技巧
2021/04/29 Python
go开发alertmanger实现钉钉报警
2021/07/16 Golang
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB
spring boot中nativeQuery的用法
2021/07/26 Java/Android
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android
win10拖拽文件时崩溃怎么解决?win10文件不能拖拽问题解决方法
2022/08/14 数码科技