UDP通讯解决a bytes-like object is required, not 'str' 问题

简介:最近在进行网络通讯的学习时候遇到了这个问题,使用的版本是Python3.5.2,启动服务器端,再启动客户端通讯时候遇到该问题,并且直接出错无法继续执行

服务端的程序是一个UDP通讯程序

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('127.0.0.1',9999))

print('Bind UDP on 9999....')
while True:
    data,addr=s.recvfrom(1024)
    print('Received from %s:%s.' % addr)
    s.sendto(b'Hello,%s!' % data,addr)
s.close()

客户端程序会发送一段话给服务器端,服务器端会将这句话加上字符串之后回传

import socket
import time
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
failuretime = 0



def udpsend(str):
    s.sendto(str, ('127.0.0.1', 9999))
    recdata = s.recv(1024).decode()
    s.close()
    return

udpsend('hello')

本来是简单的不行的一个程序却屡次碰壁

比如,以上的运行时候就会出错,提示 TypeError: a bytes-like object is required, not 'str'

原因不明,按照意思来说是我的传值不对,应该传入的是bytes类型而不是string,既然这样那就把传值改了,改为二进制吧

udpsend(b'hello')

 结果提示 BrokenPipeError: [Errno 32] Broken pipe

然后,我找了一个可以使用的函数

 

def udpsend2(str):
    s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    s.sendto(str,('127.0.0.1',9999))
    print(s.recv(1024).decode('utf-8'))
    s.close()

对比我写的

 


def udpsend(str):
    s.sendto(str, ('127.0.0.1', 9999))
    recdata = s.recv(1024).decode('utf-8')
    print(recdata)
    s.close()
    return

所以我发现最后导致问题的,是我在这里出现了一个错误,在建立链接时候,错用了SOCK_STREAM模式,该模式是给TCP通讯使用的,会保证有握手过程,信息一定收到,而服务端是UDP监听

 

最后

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

改为

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

解决

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值