返回顶部
首页 > 资讯 > 后端开发 > Python >Python3.X Socket 一个编
  • 218
分享到

Python3.X Socket 一个编

Socket 2023-01-31 07:01:48 218人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

在看《python核心编程》第三版 讲述网络编程Socket的知识,在练习中采用Python 3 的代码中遇到一个与编码解码有关的坑,本文将给予详细的介绍。 软件环境 Python: 3.6.0库: socket 1. 问题初见 仿照书中的

在看《python核心编程》第三版 讲述网络编程Socket的知识,在练习中采用Python 3 的代码中遇到一个与编码解码有关的坑,本文将给予详细的介绍。

软件环境

Python: 3.6.0
库: socket

1. 问题初见

仿照书中的代码(中文版 55-56页) 加上自己的一点改动在我的环境中不能运行,总是报这个错误:TypeError: a bytes-like object is required, not 'str'

这里是我的客户端Socket代码

from socket import *
from time import ctime

HOST = 'localhost'
PORT = 10001
ADDRESS = (HOST, PORT)

clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect(ADDRESS)

while True:
    data = input('请输入消息:')
    if not data:
        break

    clientSocket.send(data)
    data = clientSocket.recv(1024)
    if not data:
        break

    print("服务器返回的消息是:", data.decode('utf-8'))

clientSocket.close()

我的环境是: Python 3.6.0, 怎么破?

2. 研究错误 TypeError: a bytes-like object is required, not 'str'

错误的位置是在代码clientSocket.send(data)部分,但是翻看python socket .send()源代码_socket.py 方法说明

def send(self, data, flags=None): # real signature unknown; restored from __doc__

    send(data[, flags]) -> count

    Send a data string to the socket.  For the optional flags
    argument, see the Unix manual.  Return the number of bytes
    sent; this may be less than len(data) if the network is busy.

    pass

这个send方法的参数期望的是一个 "a data string" 啊,而我确实给了一个string。

哪里出问题了? 继续查看官方文档Socket,发现原因了。

官方对Socket的说明:

socket.send(bytes[, flags])

可以看到在Python 3中send()方法期望的是一个bytes, 而不是str
看来我我前面看到的是假的源代码参数的说明。哈哈。

3. 用encode() 方法解决客户端Socket 发送错误

解决错误的方法就是在调用send()方法之前对字符串类型数据进行encode,将字符串转化成bytes
代码如下:

clientSocket.send(data.encode())

与此同时,在服务端运行的时候也遇到了类似数据无法接收的问题。
如下代码得到的data,是无法直接打印的。
data = clientSocket.recv(1024)

如果要打印data数据的话,也要调用decode()从而将数据从bytes转化为str。

4. encode() 和 decode()

encode()编码 : str -> bytes
decode()解码 : bytes -> str

默认的encoding是 utf-8

更多内容见官方文档:
str.encode()
bytes.decode()

5. 完整Socket代码

服务端:

from socket import *
from time import ctime

HOST = 'localhost'
PORT = 10001
ADDRESS = (HOST, PORT)

serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(ADDRESS)
serverSocket.listen(5)

while True:
    print("等待客户端连接...")
    clientSocket, address = serverSocket.accept()
    print(address, "已经成功连接至本服务器")

    while True:
        data = clientSocket.recv(1024)
        if not data:
            break

        replyMsg = data.decode() + "[" + ctime() + ']'
        clientSocket.send(replyMsg.encode())

    clientSocket.close()
serverSocket.close()

客户端:

from socket import *
from time import ctime

HOST = 'localhost'
PORT = 10001
ADDRESS = (HOST, PORT)

clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect(ADDRESS)

while True:
    data = input('请输入消息:')
    if not data:
        break

    clientSocket.send(data.encode())
    data = clientSocket.recv(1024)
    if not data:
        break

    print("服务器返回的消息是:", data.decode('utf-8'))

clientSocket.close()

《Python核心编程》第三版原始代码P55-56在python3中并不能运行的问题,算不算一个错误呢? 欢迎大家交流 !

--结束END--

本文标题: Python3.X Socket 一个编

本文链接: https://lsjlt.com/news/191984.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python3.X Socket 一个编
    在看《Python核心编程》第三版 讲述网络编程Socket的知识,在练习中采用Python 3 的代码中遇到一个与编码解码有关的坑,本文将给予详细的介绍。 软件环境 Python: 3.6.0库: socket 1. 问题初见 仿照书中的...
    99+
    2023-01-31
    Socket
  • 记录-第一个python3的socket
        看到这个提示之后,确定了这个问题主要是是字符编码的问题了,那如何解决这个字符编码问题,目前想到的办法就是通过encode和decode来做字符编码转换了。服务端进程# cat tcp_server.py  #! /bin/env p...
    99+
    2023-01-31
    第一个 socket
  • python3--socket编程(tcp协议)
    socket概念socket层理解socketSocket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一...
    99+
    2023-01-30
    协议 socket tcp
  • python3--socket编程(udp协议)
    基于UDP协议的socketudp是无连接的,启动服务之后可以直接接受消息,不需要提前建立连接,UDP必须是server端先接受消息简单版server端代码import socket # 创建一个服务器的套接字基于ud...
    99+
    2023-01-30
    协议 socket udp
  • python3网络编程之socket
      http://www.cnblogs.com/Bigtre/p/7261387.html...
    99+
    2023-01-31
    网络编程 socket
  • 基于Python3编写一个GUI翻译器
    目录1、引言2、代码实战2.1 思路2.2 实战3、总结1、引言 小屌丝:鱼哥,你说百度翻译的准确,还是google翻译的准确? 小鱼:自己翻译的最准确。 小屌丝:你这&hellip...
    99+
    2024-04-02
  • python3--网络编程一
    有两个文件a.py和b.py,分别去运行,这两个python的文件分别运行的很好,但是如果这两个程序之间想要传递一个数据,要怎么做呢?创建一个文件,把a.py想要传递的内容写到文件中,然后b.py从这个文件中读取内容就可以了但是当你的a.p...
    99+
    2023-01-30
    网络编程
  • 利用Python3编写一个电脑录屏神器
    目录1、引言2、代码实战2.1 编写思路2.2 代码示例3、总结1、引言 女神:鱼哥,忙吗? 小鱼:嗯嗯, 忙, 哦不 , 不忙不忙。 女神:鱼哥,那能不能帮我个忙? 小鱼:这没问题...
    99+
    2024-04-02
  • python3+django2开发一个简
    一、基础环境准备windows环境:Pycharmpython3.6Django2.0.1Mysql5.7安装django  在pycharm  terminal 控制台执行:python3 -m pip install  django  ...
    99+
    2023-01-31
  • Java编程Socket如何实现多个客户端连接同一个服务端
    这篇文章主要介绍Java编程Socket如何实现多个客户端连接同一个服务端,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java Socket(套接字)通常也称作"套接字",用于描述IP地址和端口...
    99+
    2023-05-30
    java socket
  • python3-打印一个进度条
    # Auther: Aaron Fanimport sys,timefor i in range(30):    #打印一个#号,这种方法打印不会自动换行    sys.stdout.write('#')    #实时刷新一下,否则上面这一...
    99+
    2023-01-31
    进度条
  • 怎么写第一个Python3程序
    今天小编给大家分享一下怎么写第一个Python3程序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。第一个Python3.x程...
    99+
    2023-06-17
  • python3的一个奇怪设计--map
    在升级到python3的时候,发现了一个map函数的变化,害得我找了半天问题。 在python2中,map会直接返回结果,比如说: map(lambda x: x, [1,2,3]) 可以直接返回 [1,2,3] 但是到了python...
    99+
    2023-01-31
    奇怪 map
  • Java中Socket下载一个文本文件
    废话不多说了,直接给大家贴代码了,具体代码如下所示:package com.lanqiao.demo2; import java.io.BufferedInputStream; import java.io.FileInputStream;...
    99+
    2023-05-31
    socket 文本 文件
  • python3--尝试写一个三级菜单
    # 程序: 三级菜单# 要求:# 1.打印省、市、县三级菜单# 2.可返回上一级# 3.可随时退出程序,可返回顶部重新开始程序代码如下#!/usr/bin/env python # coding: utf-8 ...
    99+
    2023-01-30
    菜单
  • python3 list列表随机选取一个
    爬虫时适当更换user-agent可以稍微规避一下代理被封的风险。。。 from random import sample ua = [ 'Mozilla/4.0 (compatible; MSIE 7.0; Windows ...
    99+
    2023-01-31
    列表 list
  • Python3 生成一个随机验证码
    '''设计一个八位随机验证码,验证码是由大写字母,小写字母和数字三种字符组成。定义一个范围只有1,2,3的随机数,如果这个随机数是1,则八位验证码的当前位置用大写字母;                            如果这个随机数是...
    99+
    2023-01-31
    验证码
  • 如何用PHP实现一个web socket长链接
    如何用PHP实现一个web socket长链接 简介 目前PHP实现web socket 都是使用框架集成来实现,比如hyperf,swoft,或者是安装swoole 扩展来实现websocket...
    99+
    2023-09-02
    php 开发语言 服务器 websocket
  • 在c#中使用Socket实现一个tcp协议
    这篇文章给大家介绍在c#中使用Socket实现一个tcp协议,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概述UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于....
    99+
    2023-06-06
  • python3实现多线程ping一个网段
    ####################################################""" 实现多线程ping一个网段的地址,测试联通性 copyright  2016/9/30 lighter_py"""#######...
    99+
    2023-01-31
    网段 多线程 ping
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作