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 客户端读取

虽然没有来自客户端的连接操作,但服务器尝试接受连接并因“非套接字上的套接字操作”而失败

python学习-网络编程