详解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 相关文章推荐
使用setup.py安装python包和卸载python包的方法
Nov 27 Python
在Python程序中操作文件之isatty()方法的使用教程
May 24 Python
Python中使用Queue和Condition进行线程同步的方法
Jan 19 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
Dec 13 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
Django用户身份验证完成示例代码
Apr 03 Python
Python中使用socks5设置全局代理的方法示例
Apr 15 Python
python argparse传入布尔参数false不生效的解决
Apr 20 Python
tensorflow 动态获取 BatchSzie 的大小实例
Jun 30 Python
Python selenium如何打包静态网页并下载
Aug 12 Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 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应用程序的七个习惯深入分析
2013/06/08 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
JQuery中关于jquery.js与jquery.min.js的比较探讨
2013/05/15 Javascript
Webpack 实现 Node.js 代码热替换
2015/10/22 Javascript
Vue.js系列之vue-router(上)(3)
2017/01/03 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
es6学习笔记之Async函数的使用示例
2017/05/11 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
JS实现json数组排序操作实例分析
2019/10/28 Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
2020/03/07 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
Python高并发和多线程有什么关系
2020/11/14 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
Saks Fifth Avenue澳洲/亚太地区:萨克斯第五大道精品百货店
2019/06/09 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
UNIX命令速查表
2012/03/10 面试题
演讲稿怎么写才完美
2014/01/02 职场文书
志愿者活动总结报告
2014/06/27 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
小学家长意见怎么写
2015/06/03 职场文书
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL
python实现一个简单的贪吃蛇游戏附代码
2022/06/28 Python