Python套接字服务器读取客户端的多命令[关闭]
Posted
技术标签:
【中文标题】Python套接字服务器读取客户端的多命令[关闭]【英文标题】:Python socket server read multi command of client [closed] 【发布时间】:2021-12-08 10:10:33 【问题描述】:我创建了套接字服务器来读取来自套接字客户端的命令。
import socket
import sys
host = socket.gethostname()
port = 12345
server_tcp = socket.socket()
server_tcp.bind((host, port))
server_tcp.listen(5)
while True:
c, addr = server_tcp.accept()
data = c.recv(1024)
print ('data received: %s') % data
if 'ABC' == data:
print ('sending back ok to the client')
texte = 'OK';
n=c.send(texte)
else:
print ('I did not get the right command ABC')
break
data = c.recv(1024)
print ('data received: %s') % data
if 'DEF' == data:
print ('sending back ok to the client')
texte = 'OK';
n=c.send(texte)
else:
print ('I did not get the right command DEF')
break
c.close()
套接字客户端:
import socket
import sys
host = socket.gethostname()
port = 12345
client_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
rc = client_tcp.connect((host, port))
except:
print('Server not found')
texte = 'ABC';
n=client_tcp.send(texte)
data=client_tcp.recv(1024);
print (data)
if 'OK' == data:
print('good')
else:
print('bad')
texte = 'DEF';
n=client_tcp.send(texte)
data=client_tcp.recv(1024);
print (data)
if 'OK' == data:
print('good')
else:
print('bad')
client_tcp.close() # Close the socket when done
当我在客户端中按照 ABC 然后 DEF 的顺序设置命令时,它运行良好,但是当我更改为 DEF ABC 时,它不起作用。请告诉我我必须更改代码。我还考虑使用缓冲区。有什么理想吗?
最好的问候
【问题讨论】:
请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 【参考方案1】:我对您的代码进行了一些更改以对其进行测试。问题是您没有发送客户端正在等待的响应。当错误的命令到达时会发生这种情况。
如果您的客户正在等待信息,您的服务器必须发送信息!...而另一端(服务器)也是如此。
最后,您的问题是协议问题。您必须设计将在不同部分之间更改什么样的消息,并确保发送和接收这些消息
服务器:
import socket
import sys
host = socket.gethostname()
port = 9966
server_tcp = socket.socket()
server_tcp.bind((host, port))
server_tcp.listen(5)
n = 0
while n < 2:
c, addr = server_tcp.accept()
inData = c.recv(1024)
data = inData.decode()
texte = '';
print ('data received: 0'.format(data))
if 'ABC' == data:
print ('sending back ok to the client')
texte = 'OK';
else:
print ('I did not get the right command ABC')
texte = 'FAIL';
#break
print("Respose: 0".format(texte))
#ALWASY SEND THE RESPONSE IF YOUR CLIENT WAITS FOR IT
c.sendall(texte.encode(encoding = 'UTF-8'))
inData = c.recv(1024)
data = inData.decode()
print ('data received: 0'.format(data))
if 'DEF' == data:
print ('sending back ok to the client')
texte = 'OK';
#n=c.send(texte.encode(encoding = 'UTF-8'))
else:
print ('I did not get the right command DEF')
texte = 'FAIL';
#break
print("Respose: 0".format(texte))
#ALWASY SEND THE RESPONSE IF YOUR CLIENT WAITS FOR IT
c.sendall(texte.encode(encoding = 'UTF-8'))
print ('Closing Socket Client')
c.close()
n += 1
客户:
import socket
import sys
host = socket.gethostname()
port = 9966
client_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
rc = client_tcp.connect((host, port))
except:
print('Server not found')
#texte = "ABC"
texte = "DEF"
n=client_tcp.send(texte.encode(encoding = 'UTF-8'))
inData=client_tcp.recv(1024)
data = inData.decode()
print ("[" + data + "]")
if 'OK' == data:
print('good')
else:
print('bad')
#texte = "DEF"
texte = "ABC"
n=client_tcp.send(texte.encode(encoding = 'UTF-8'))
inData=client_tcp.recv(1024)
data = inData.decode()
print ("[" + data + "]")
if 'OK' == data:
print('good')
else:
print('bad')
client_tcp.close()
客户的输出订单ABC DEF:
[OK]
good
[OK]
good
客户的输出订单 DEF ABC:
[FAIL]
bad
[FAIL]
bad
【讨论】:
感谢您的回答,我想我在澄清问题时不清楚。事实上,即使我们改变客户端命令 ABC DEF 或 DEF ABC 的顺序,服务器也必须发送响应 [OK] good [OK] good 在C语言中,我使用char recv_buffer [1024]来存储客户端的所有命令,如果服务器收到ABC DEF甚至DEF ABC,两种情况都可以响应OK OK。但我不知道如何在 Python 中做到这一点。任何帮助将不胜感激 尝试更改服务器中的 ifs。从这个, if “ABC” == data:
到这个if “ABC” == data or “DEF” == data:
谢谢你们的cmets,我想我会改用char缓冲区来解决这个问题,但直到现在我都不知道怎么做。下面的链接给了我这个想法,但似乎 python 中的 char 缓冲区过宽了。 ***.com/questions/34675555/…以上是关于Python套接字服务器读取客户端的多命令[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
服务器端的 C++ TCP 套接字多次写入()被视为客户端的单次读取
使用来自另一个客户端的广播发射从节点服务器发送的数据无法被 c++ 套接字 io 客户端读取