如何在python中从套接字接收数据、处理和发回数据?

如何在python中从套接字接收数据、处理和发回数据?,python,sockets,Python,Sockets,我有以下代码: import socket # Import socket module import sys s = socket.socket() # Create a socket object host = '' # Get local machine name port = 1234 # Reserve a port for your service. s.connect((host, port)) w

我有以下代码:

import socket               # Import socket module
import sys

s = socket.socket()         # Create a socket object

host = ''  # Get local machine name
port = 1234                # Reserve a port for your service.

s.connect((host, port))

while 1:
    data = s.recv(1024)
    print ' data ' , data
    d = data.split('?')  # parsing values from server 
    if len(d) < 2: 
         # if does not contain ?, do nothing
         continue
    else: 
         a = d[0]
         b = d[1].replace('\n', '')
         # check how a compares to b, and send response accordingly
         if (a > b):
            s.send('1')
         elif (a == b):
            s.send('2')
         else: 
            s.send('3')

s.close()                     # Close the socket when done
导入套接字#导入套接字模块
导入系统
s=socket.socket()#创建一个套接字对象
主机=“”#获取本地计算机名
端口=1234#为您的服务保留一个端口。
s、 连接((主机、端口))
而1:
数据=s.recv(1024)
打印“数据”,数据
d=data.split(“?”)#从服务器解析值
如果len(d)<2:
#如果不包含?,则不执行任何操作
持续
其他:
a=d[0]
b=d[1]。替换('\n','')
#检查a与b的比较情况,并相应地发送响应
如果(a>b):
s、 发送('1')
elif(a==b):
s、 发送('2')
其他:
s、 发送('3')
s、 close()#完成后关闭插座
如果没有处理代码,只要发送一个随机值就可以了。但是使用上面的代码,我只能解析第一组行,然后它就停止了。(我想它会关上插座什么的?)

来自套接字的数据看起来像“1”?23岁还是23岁?1',等等。它需要一个响应来确定这两个数字之间的关系

相比之下,如果我有以下代码:

import socket               # Import socket module
import sys

s = socket.socket()         # Create a socket object

host = ''  # Get local machine name
port = 1234                # Reserve a port for your service.

s.connect((host, port))

backlog = ''

while 1:
    data = s.recv(1024)
    sp = data.split('\n')
    if len(sp) < 2:
        backlog += data
        continue
    line = backlog + sp[0]
    backlog = sp[1]
    data = line
    print ' data ' , data
    if not data:
        break
    s.send ('2')

s.close()                     # Close the socket when done
导入套接字#导入套接字模块
导入系统
s=socket.socket()#创建一个套接字对象
主机=“”#获取本地计算机名
端口=1234#为您的服务保留一个端口。
s、 连接((主机、端口))
积压工作=“”
而1:
数据=s.recv(1024)
sp=data.split('\n')
如果len(sp)<2:
积压工作+=数据
持续
行=积压工作+sp[0]
积压工作=sp[1]
数据=行
打印“数据”,数据
如果没有数据:
打破
s、 发送('2')
s、 close()#完成后关闭插座

此代码将生成“正确”的服务器响应或者“不正确……请再试一次!”取决于它是对还是错。

您似乎认为每次调用
read()
都会得到一整行。这是错误的

你应该把你的输入分成几行,只有当你有一整行的时候,你才能继续

backlog = ''
while 1:
    data = s.recv(1024)
    # do we have a line break?
    sp = data.split('\n')
    if len(sp) < 2:
        # no, we haven't...
        backlog += data
        continue
    # yes, we have.
    line = backlog + sp[0] # first part is the now complete line.
    backlog = sp[1] # 2nd part is the start of the new line.
    print ' line ' , line
    d = line.split('?')  # parsing values from server 
    if len(d) < 2: 
         # if does not contain ?, do nothing
         continue
    else: 
         a = int(d[0]) # we want to compare numbers, not strings.
         b = int(d[1])
         # check how a compares to b, and send response accordingly
         if (a > b):
            s.send('1')
         elif (a == b):
            s.send('2')
         else: 
            s.send('3')
backlog=''
而1:
数据=s.recv(1024)
#我们有断线吗?
sp=data.split('\n')
如果len(sp)<2:
#不,我们没有。。。
积压工作+=数据
持续
#是的,我们有。
line=backlog+sp[0]#第一部分是现在完成的行。
backlog=sp[1]#第二部分是新生产线的开始。
打印“行”,行
d=line.split(“?”)#从服务器解析值
如果len(d)<2:
#如果不包含?,则不执行任何操作
持续
其他:
a=int(d[0])#我们要比较的是数字,而不是字符串。
b=int(d[1])
#检查a与b的比较情况,并相应地发送响应
如果(a>b):
s、 发送('1')
elif(a==b):
s、 发送('2')
其他:
s、 发送('3')
试试现在发生的事情


我想到的另一个问题是服务器到底期望什么?真的只有一个字节吗?或者更确切地说是
'1\n'
'2\n'
'3\n'

您所说的“第一组行”是什么意思?进入else子句的第一行仍然挂起。它完成了所有处理并到达s.send(#),但不从服务器读取响应。服务器只需要一个字节。当我硬编码一个随机值时,它会返回一个应答。我不确定是超时还是什么?因此服务器会向您的
1
2
3
发送响应。看起来怎么样?还有,你读了我最后一段关于服务器可能需要一行结尾的完整行的文章了吗?我修改了我的帖子来回答你的问题。@HarmlesDragon我现在很困惑。服务器期望什么<代码>1,
2
3
=
或什么?在第二个示例中,您发送了一个
,似乎从服务器得到了响应。。。也许您还想描述协议和/或显示服务器的代码……很抱歉造成混淆。原来是>,,