python socket send 无效_python socket 使用注意点

做一个很简单的client到server的socket收发。但是通讯一直有问题。检索了半天,换了n种方法就是收不到server的消息,经常莫名其妙[Errno 32] Broken pipe。

通过Stack Overflow的一个问题找到了答案:

server端,发送给client消息,使用的是accept()获取的client_socket,而不是监听端口的s。s没有连接任何东西,想从s发东西是不可能的,没有目标地址。因此server端只能从client_socket进行收发。

#接受客户端连接

client_socket,address = s.accept()

#打印客户端ip

print(f"客户端{address}已连接")

while True:

#接受客户端信息

received = client_socket.recv(BUFFER_SIZE).decode()

if received:

print("received:", received)

if received == 'end':

break

client_socket.send("pwd:1234".encode())

c, addr = s.accept()

s.send("welcome !")

The listener (s) is not connected to anything which means any attempts to use it for sending will fail because there is no destination known for the data. One can only send data on a connected socket (c), i.e. the one returned from accept.

297f34071321

client

297f34071321

server

附上完整代码:

client:

import socket

#服务器信息

HOST = "yourHost"

PORT = 7700

ADDR = (HOST,PORT)

#缓冲区

BUFFER_SIZE = 4096

s = socket.socket()

print(f"服务器连接中{HOST}:{PORT}")

#连接服务器

s.connect(ADDR)

print("服务器连接成功")

s.send("hellloo".encode())

while True:

data = s.recv(BUFFER_SIZE)

if data :

print('data:', data)

s.send("end".encode())

break

print("已断开连接!")

s.close()

server:

import socket

import random

SERVER_HOST = ''

SERVER_PORT = 7700

BUFFER_SIZE = 4096

ADDR = (SERVER_HOST,SERVER_PORT)

#创建server

s = socket.socket()

s.bind(ADDR)

#设置连接监听数

s.listen(5)

print(f"服务器监听{SERVER_HOST}:{SERVER_PORT}")

while True:

print("等待客户端连接...")

#接受客户端连接

client_socket,address = s.accept()

#打印客户端ip

print(f"客户端{address}已连接")

while True:

#接受客户端信息

received = client_socket.recv(BUFFER_SIZE).decode()

if received:

print("received:", received)

if received == 'end':

break

client_socket.send("pwd:1234".encode())

print('关闭客户端连接')

#关闭资源

client_socket.close()

s.close()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值