详解python3中socket套接字的编码问题解决

所属分类: 脚本专栏 / python 阅读数: 429
收藏 0 赞 0 分享

一、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实现按学生年龄排序实际问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
收藏 0 赞 0 分享

Python开发的HTTP库requests详解

Requests是用Python语言编写,基于urllib,采用Apache2 Licensed开源协议的HTTP库。它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。Requests的哲学是以PEP 20 的习语为中心开发的,所以它比urllib更加P
收藏 0 赞 0 分享

Python网络爬虫与信息提取(实例讲解)

下面小编就为大家带来一篇Python网络爬虫与信息提取(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

在python3环境下的Django中使用MySQL数据库的实例

下面小编就为大家带来一篇在python3环境下的Django中使用MySQL数据库的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Python 3.x读写csv文件中数字的方法示例

在我们日常开发中经常需要对csv文件进行读写,下面这篇文章主要给大家介绍了关于Python 3.x读写csv文件中数字的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
收藏 0 赞 0 分享

Python实现解析Bit Torrent种子文件内容的方法

这篇文章主要介绍了Python实现解析Bit Torrent种子文件内容的方法,结合实例形式分析了Python针对Torrent文件的读取与解析相关操作技巧与注意事项,需要的朋友可以参考下
收藏 0 赞 0 分享

Python实现文件内容批量追加的方法示例

这篇文章主要介绍了Python实现文件内容批量追加的方法,结合实例形式分析了Python文件的读写相关操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Python简单实现自动删除目录下空文件夹的方法

这篇文章主要介绍了Python简单实现自动删除目录下空文件夹的方法,涉及Python针对文件与目录的读取、判断、删除等相关操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

简单学习Python多进程Multiprocessing

这篇文章主要和大家一起简单的学习Python多进程Multiprocessing ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Python导入模块时遇到的错误分析

这篇文章主要给大家详细解释了在Python处理导入模块的时候出现错误以及具体的情况分析,非常的详尽,有需要的小伙伴可以参考下
收藏 0 赞 0 分享
查看更多