详解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进行TCP网络编程的教程
Apr 29 Python
Python实现字符串逆序输出功能示例
Jun 24 Python
Python实现的快速排序算法详解
Aug 01 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
详解Python if-elif-else知识点
Jun 11 Python
详解如何将python3.6软件的py文件打包成exe程序
Oct 09 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
导致python中import错误的原因是什么
Jul 01 Python
Pycharm学生免费专业版安装教程的方法步骤
Sep 24 Python
python实战之用emoji表情生成文字
May 08 Python
pandas提升计算效率的一些方法汇总
May 30 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 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
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
PHP SPL使用方法和他的威力
2013/11/12 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
PHP实现微信申请退款功能
2018/10/01 PHP
一个对于Array的简单扩展
2006/10/03 Javascript
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
javascript prototype原型操作笔记
2009/12/07 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
文本框input聚焦失焦样式实现代码
2012/10/12 Javascript
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
javascript不可用的问题探究
2013/10/01 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
JS面向对象编程详解
2016/03/06 Javascript
浅谈JavaScript的push(),pop(),concat()方法
2016/06/03 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
Python 模拟登陆的两种实现方法
2017/08/10 Python
利用python3随机生成中文字符的实现方法
2017/11/24 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
python 字符串格式化的示例
2020/09/21 Python
canvas画布实现手写签名效果的示例代码
2019/04/23 HTML / CSS
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
规划编制实施方案
2014/03/15 职场文书
化工专业求职信
2014/07/01 职场文书
见习报告格式要求
2014/11/04 职场文书
材料采购员岗位职责
2015/04/03 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
节约用水广告语60条
2019/11/14 职场文书
Python基础详解之邮件处理
2021/04/28 Python
Python数据可视化之Seaborn的安装及使用
2022/04/19 Python