python - 如何在 Python 中同步套接字消息
问题描述
所以我有我编写的这个服务器脚本,它应该接收用户名,然后继续执行其他代码。但我收到了这个错误:
“OSError:[WinError 10057] 不允许发送或接收数据的请求,因为未连接套接字并且(使用 sendto 调用在数据报套接字上发送时)未提供地址”
我的理论是服务器和客户端没有同步,所以服务器认为它没有收到消息。如何改进我的代码以便服务器真正收到消息?(我尝试了一个尝试块)
我的代码:
import socket
port = int(input("Server port: "))
try:
socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket.bind(("localhost",port))
socket.listen(1)
except Exception:
print("error while starting server")
input()
exit()
def receive(con,buffer):
return str(con.recv(buffer).decode())
while True:
con,ip = socket.accept()
print(str(ip) + " Connected!")
username = receive(socket,1024) # <-- error
#other code
socket.close()
客户端代码:
import socket
ip = input("Server IP: ")
port = int(input("Server port: "))
socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
socket.connect((ip,port))
except Exception:
print("Error while connectine to the server!")
input()
exit()
def send(s,msg):
s.send(bytes(msg,"utf-8"))
username = input("Username: ")
send(socket,username)
# other code
socket.close()
解决方案
您不应该使用类似于任何库名称的变量名称。在您的情况下,您已使用该变量socket
来存储服务器套接字对象。因此,您的代码是模棱两可的,因为您使用了同名的库。
下面是工作代码。
import socket
port = int(input("Server port: "))
try:
SERVER = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
SERVER.bind(("localhost",port))
SERVER.listen(1)
except Exception:
print("error while starting server")
input()
exit()
def receive(con,buffer):
return str(con.recv(buffer).decode())
while True:
con,ip = SERVER.accept()
print(str(ip) + " Connected!")
username = receive(con,1024) # <-- error
#other code
socket.close()
推荐阅读
- r - R:水平条形图(简单甘特图)
- go - 在测试二进制文件中禁用竞争检测
- python - 提高语音识别,python
- flutter - 如何知道应用程序何时在 Flutter 中加载?
- java - Apache Beam - 重复数据删除功能的限制是什么
- c# - 除了声明变量之外,无法在线为变量赋值
- powershell - 为什么“调用命令”没有采取任何措施? - 电源外壳
- apache-kafka - Kafka Transaction 以防多线程
- c# - CsvHelper 的 Filestream 和 datagridview 内存问题
- react-native - 如何将本机模块作为依赖项集成到自定义模块/库中以响应本机