为什么 split() 从一个字符串中返回两个列表?
Why split() is returning two lists from a string?
我正在 Python 3.7.2 中实现一个简单的客户端和服务器。客户端会向服务器发送两个数字,服务器会将它们相加并发送回客户端。
这是我的实现:-
客户:-
import socket
s = socket.socket()
host = socket.gethostname()
port = 4444
a = input('Enter 1st no: ')
b = input('Enter 2nd no: ')
c = (a + ',' + b).encode()
print(c)
s.connect((host, port))
print('Sending string {} to the server'.format(c.decode()))
s.sendall(c)
data = s.recv(1024)
print(int(data))
s.close()
服务器:-
import socket
s = socket.socket()
host = socket.gethostname()
port = 4444
s.bind((host, port))
s.listen(10)
print('Waiting for connections...')
conn, addr = s.accept()
while True:
data = conn.recv(1024)
d = data.decode().split(',')
print(d)
print(type(d))
data_add = int(d[0]) +int(d[1])
conn.sendall(str(data_add).encode())
conn.close()
输出:-
服务器:-
Waiting for connections...
['3', '6']
<class 'list'>
['']
<class 'list'>
Traceback (most recent call last): File "addserver.py", line 19, in
data_add = int(d[0]) +int(d[1]) ValueError: invalid literal for int() with base 10: ''
客户:-
Enter 1st no: 3
Enter 2nd no: 6
b'3,6'
Sending string 3,6 to the server
9
出于调试目的,我添加了一些打印语句。现在这里的问题是我只向服务器发送一个字节(参见客户端的输出)但服务器从该数据返回两个列表(一个字符串),第一个是预期的,第二个是空列表。这怎么可能?这也是 ValueError
发生的原因。
虽然我在客户端得到了预期的输出,但我很想知道为什么 split()
返回两个列表而不是一个列表?
一切都很简单。当客户端关闭连接时,你得到空 d
。
实际上我看到服务器和客户端关系背后的错误逻辑。
我的意思是,你这样做:
1。
客户端连接到服务器
2。
客户端和服务器做他们的事情:a + b
3。
客户端关闭连接,而服务器等待数据 <-- 问题出在这里!
也许您想为每个客户端使用一个连接?
是的你是。如果你不这样做,那才奇怪。
所以...只需将 conn, addr = s.accept()
移动到 while
块:
... # some server init code
#conn, addr = s.accept()
while True:
conn, addr = s.accept()
data = conn.recv(1024)
... # some per client code
我正在 Python 3.7.2 中实现一个简单的客户端和服务器。客户端会向服务器发送两个数字,服务器会将它们相加并发送回客户端。
这是我的实现:-
客户:-
import socket
s = socket.socket()
host = socket.gethostname()
port = 4444
a = input('Enter 1st no: ')
b = input('Enter 2nd no: ')
c = (a + ',' + b).encode()
print(c)
s.connect((host, port))
print('Sending string {} to the server'.format(c.decode()))
s.sendall(c)
data = s.recv(1024)
print(int(data))
s.close()
服务器:-
import socket
s = socket.socket()
host = socket.gethostname()
port = 4444
s.bind((host, port))
s.listen(10)
print('Waiting for connections...')
conn, addr = s.accept()
while True:
data = conn.recv(1024)
d = data.decode().split(',')
print(d)
print(type(d))
data_add = int(d[0]) +int(d[1])
conn.sendall(str(data_add).encode())
conn.close()
输出:-
服务器:-
Waiting for connections...
['3', '6']
<class 'list'>
['']
<class 'list'>
Traceback (most recent call last): File "addserver.py", line 19, in data_add = int(d[0]) +int(d[1]) ValueError: invalid literal for int() with base 10: ''
客户:-
Enter 1st no: 3
Enter 2nd no: 6
b'3,6'
Sending string 3,6 to the server
9
出于调试目的,我添加了一些打印语句。现在这里的问题是我只向服务器发送一个字节(参见客户端的输出)但服务器从该数据返回两个列表(一个字符串),第一个是预期的,第二个是空列表。这怎么可能?这也是 ValueError
发生的原因。
虽然我在客户端得到了预期的输出,但我很想知道为什么 split()
返回两个列表而不是一个列表?
一切都很简单。当客户端关闭连接时,你得到空 d
。
实际上我看到服务器和客户端关系背后的错误逻辑。
我的意思是,你这样做:
1。 客户端连接到服务器
2。 客户端和服务器做他们的事情:a + b
3。 客户端关闭连接,而服务器等待数据 <-- 问题出在这里!
也许您想为每个客户端使用一个连接? 是的你是。如果你不这样做,那才奇怪。
所以...只需将 conn, addr = s.accept()
移动到 while
块:
... # some server init code
#conn, addr = s.accept()
while True:
conn, addr = s.accept()
data = conn.recv(1024)
... # some per client code