详解python3中socket套接字的编码问题解决
作者:进阶的小许 发布时间:2023-09-11 20:28:48
标签:python,socket,编码
一、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。只要掌握这个重点,处理这个问题就很简单了。
来源:http://www.cnblogs.com/xjw-gjq/p/7102187.html


猜你喜欢
- 一、Beautiful Soup库简介BeautifulSoup4 是一个 HTML/XML 的解析器,主要的功能是解析和提取 HTML/X
- 需 求 分 析 1、读取指定目录下的所有文件2、读取指定文件,输出文件内容3、创建一个文件并保存到指定目录实 现 过 程Python写代码简
- 上次在“给网页添加打印按钮”一文中,有一段代码是“复制本文链接到剪贴板”js脚本,很可惜只能在IE中使用。这次在“淘宝网在线充值中心 - 荆
- 利用ASP从远程服务器上接收XML数据<% dim objXML dim objRootElement dim&n
- 很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录。在后台,这些程序使用在一个SELECT查
- 目录周期对比用法总结周期对比vue2vue3beforeCreatesetupcreatedsetupbeforeMountonBefore
- PHP number_format() 函数实例格式化数字:<?php echo number_format("100000
- 两行JavaScript代码的QQ窗口抖动效果<img id="win" style='pos
- 目录1、父传值给子组件2、子传值给父组件3、子调用父组件中的方法4、父调用子组件中的方法1、父传值给子组件父组件:<template&
- 本次目标是将一副图像从rgb颜色空间转换到hsv颜色空间,颜色去除白色背景部分具体就调用了cv2的两个函数,一个是rgb转hsv的函数具体用
- 简单的合并,本例是横向合并,纵向合并可以自行调整。import xlrd import xlwtimport shutil from xlu
- pycharm中导入selenium报错现象: pycharm中输入from selenium import webdriver, sele
- 前言本实验中所用数据库创建SQL语句以及插入数据到数据库中的SQL语句链接:链接: https://pan.baidu.com/s/1BnF
- 本文实例为大家分享了PyQt5实现暗黑风格的计时器的具体代码,供大家参考,具体内容如下主要是学习多线程知识,使用的是QTime(),但是似乎
- MySQL设置当前时间为默认值的问题我们经常会遇到,下面就为您介绍MySQL设置当前时间为默认值的实现全步骤,希望对您能有所启迪。数据库:t
- 有时会统计某个目录下有哪些文件,每个文件的sha256及文件大小等相关信息,这里用python3写了个脚本用来实现此功能,此脚本可跨平台,同
- 代码和代码运行的结果:代码:import itertools as itswords="rot123"a=its.pro
- 请定义函数,将列表[10, 1, 2, 20, 10, 3, 2, 1, 15, 20, 44, 56, 3, 2, 1]中的重复元素除去,
- win7 pycharm设置界面全黑色方法:1.设置默认PyCharm解析器: 操作如下:Python–>Preferences–&g
- python爬虫写起来非常快,虽然也可以用java,但是没有python来的简