鱼C论坛

 找回密码
 立即注册
查看: 1586|回复: 3

[已解决]python网络编程遇到问题

[复制链接]
发表于 2021-3-25 15:11:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 htyj0 于 2021-3-25 15:17 编辑

想写一个简单的TCP通信程序,客户端输入字符串,服务器加上时间戳后将字符串原样返回。

客户端程序:
# 客户端程序TCP_Client.py
  1. import socket as s
  2. from time import ctime

  3. HOST = '127.0.0.1'
  4. PORT = 21567
  5. BUFSIZE = 1024
  6. ADDR = (HOST, PORT)

  7. tcpCliSock = s.socket(s.AF_INET, s.SOCK_STREAM)
  8. tcpCliSock.connect(ADDR)

  9. while(True):
  10.     data = input('> ')
  11.     #data = b'\x01\x02\x03'
  12.     if not data:
  13.         print('ivalid data')
  14.         break

  15.     tcpCliSock.send(data.encode())
  16.     data = tcpCliSock.recv(BUFSIZE)
  17.     if not data:
  18.         break
  19.     print(data.decode('utf-8'))

  20. tcpCliSock.close()
复制代码



服务器端程序:
  1. # 服务器程序 TCP_Server.py

  2. import socket as s
  3. from time import ctime

  4. HOST = ''
  5. PORT = 21567
  6. BUFSIZE = 1024
  7. ADDR = (HOST, PORT)

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

  9. tcpServerSock.bind(ADDR)

  10. tcpServerSock.listen(5)

  11. while True:
  12.     print('waiting for connection...')
  13.     tcpCliSock, addr = tcpServerSock.accept()

  14.     print('...Connected from: ', addr)

  15.     while True:
  16.         data = tcpCliSock.recv(BUFSIZE)
  17.         str_data = data.decode()
  18.         if not data:
  19.             break
  20.         print('data received: ', str_data)
  21.         tcpCliSock.send('[%s] : %s' % (ctime(), str_data))

  22.     tcpCliSock.close()

  23. tcpServerSock.close()
复制代码


在客户端任意输入一个字符串时,服务器可以显示,但会提示错误。


服务器端显示:
================== RESTART: F:\00_AppData\python\TCP_Server.py =================
waiting for connection...
...Connected from:  ('127.0.0.1', 50416)
data received:  hello
Traceback (most recent call last):
  File "F:\00_AppData\python\TCP_Server.py", line 29, in <module>
    tcpCliSock.send('[%s] : %s' % (ctime(), str_data))
TypeError: a bytes-like object is required, not 'str'

>>>

请大神帮忙看一下,感激不尽。。
最佳答案
2021-3-25 16:35:19
报错提示send接受字节对象,不是字符串,试试先将字符串编码再发送(未测试)
  1. # 服务器程序 TCP_Server.py

  2. import socket as s
  3. from time import ctime

  4. HOST = ''
  5. PORT = 21567
  6. BUFSIZE = 1024
  7. ADDR = (HOST, PORT)

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

  9. tcpServerSock.bind(ADDR)

  10. tcpServerSock.listen(5)

  11. while True:
  12.     print('waiting for connection...')
  13.     tcpCliSock, addr = tcpServerSock.accept()

  14.     print('...Connected from: ', addr)

  15.     while True:
  16.         data = tcpCliSock.recv(BUFSIZE)
  17.         str_data = data.decode()
  18.         if not data:
  19.             break
  20.         print('data received: ', str_data)
  21.         tcpCliSock.send(('[%s] : %s' % (ctime(), str_data)).encode('utf-8'))

  22.     tcpCliSock.close()

  23. tcpServerSock.close()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-25 15:50:51 | 显示全部楼层
  1. tcpCliSock.send('[%s] : %s' % (ctime(), str_data))
复制代码


只能传字节参数,  你需要在外面转换成字节, 然后send
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-25 16:35:19 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
报错提示send接受字节对象,不是字符串,试试先将字符串编码再发送(未测试)
  1. # 服务器程序 TCP_Server.py

  2. import socket as s
  3. from time import ctime

  4. HOST = ''
  5. PORT = 21567
  6. BUFSIZE = 1024
  7. ADDR = (HOST, PORT)

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

  9. tcpServerSock.bind(ADDR)

  10. tcpServerSock.listen(5)

  11. while True:
  12.     print('waiting for connection...')
  13.     tcpCliSock, addr = tcpServerSock.accept()

  14.     print('...Connected from: ', addr)

  15.     while True:
  16.         data = tcpCliSock.recv(BUFSIZE)
  17.         str_data = data.decode()
  18.         if not data:
  19.             break
  20.         print('data received: ', str_data)
  21.         tcpCliSock.send(('[%s] : %s' % (ctime(), str_data)).encode('utf-8'))

  22.     tcpCliSock.close()

  23. tcpServerSock.close()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-25 19:40:15 | 显示全部楼层
hrp 发表于 2021-3-25 16:35
报错提示send接受字节对象,不是字符串,试试先将字符串编码再发送(未测试)

是这样的,用改过的代码测试已通过。万分感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-26 02:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表