如何解决检索套接字中的空文本
我正在将数据从客户端发送到服务器。我正在从客户端检索数据,并将其存储在变量中并调用一个函数,但是当我运行程序时,在输出中得到空值。 收到以下输出
Received b''
我也希望将字符串与字符串一起打印。谢谢 导入套接字
HOST = '127.0.0.1' # Standard loopback interface address (localhost)
PORT = 65432 # Port to listen on (non-privileged ports are > 1023)
def ceaser(data):
shift = 3 # defining the shift count
encrypted_text = data
plain_text = ""
for c in encrypted_text:
# check if character is an uppercase letter
if c.isupper():
# find the position in 0-25
c_unicode = ord(c)
c_index = ord(c) - ord("A")
# perform the negative shift
new_index = (c_index - shift) % 26
# convert to new character
new_unicode = new_index + ord("A")
new_character = chr(new_unicode)
# append to plain string
plain_text = plain_text + new_character
return plain_text
else:
# since character is not uppercase,leave it as it is
plain_text += c
return plain_text
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
s.bind((HOST,PORT))
s.listen()
conn,addr = s.accept()
with conn:
print('Connected by',addr)
while True:
data = conn.recv(1024)
data=ceaser(data)
if not data:
break
conn.sendall(data)
#客户端
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
s.connect((HOST,PORT))
s.sendall(b'KHOOR ZRUOG')
data = s.recv(1024)
print('Received',repr(data))
解决方法
尽管要找出造成这种麻烦的直接原因,但我还是建议开发一种协议来使用,甚至只是一个基本协议。我的意思是首先发送有关即将到来的消息的信息,例如它包含的字节数。通过使用空字节填充此信息,可以将其保留在固定长度的数据包中。这样,您首先读取了一个大小为512的数据包。然后,您对该数据进行了解码并知道了该消息的大小,并可以调整public ActionResult Index()
{
var data = db.jobs.
AsEnumerable().
OrderByDescending(x => x.JobDateTime).
Select(a => new JobViewModel
{
MassDateTime = a.JobDateTime.ToString("dddd,dd MMMM yyyy hh:mm")
}).ToList();
return View(data);
}
来接受该字节数。
要记住的另一件事是消息的编码。处理消息时使用str是个好习惯,但是在发送和接收消息时,请使用.decode()和.encode()将其转换为字节。
,下面是正确的代码。现在可以正常工作。
服务器
import socket
HOST = '127.0.0.1' # Standard loopback interface address (localhost)
PORT = 65432 # Port to listen on (non-privileged ports are > 1023)
def ceaser(data):
shift = 3 # defining the shift count
encrypted_text = data.decode('utf-8')
plain_text = ""
for c in encrypted_text:
# check if character is an uppercase letter
if c.isupper():
# find the position in 0-25
c_unicode = ord(c)
c_index = ord(c) - ord("A")
# perform the negative shift
new_index = (c_index - shift) % 26
# convert to new character
new_unicode = new_index + ord("A")
new_character = chr(new_unicode)
# append to plain string
plain_text = plain_text + new_character
#return plain_text
else:
# since character is not uppercase,leave it as it is
plain_text += c
return plain_text
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
s.bind((HOST,PORT))
s.listen()
conn,addr = s.accept()
with conn:
print('Connected by',addr)
while True:
data = conn.recv(1024)
data=ceaser(data)
if not data:
break
conn.sendall(data.encode('utf-8'))
客户
import socket
HOST = '127.0.0.1'
PORT = 65432
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
s.connect((HOST,PORT))
s.sendall(b'KHOOR ZRUOG')
data = s.recv(1024)
print('Received',repr(data))
出了什么问题?
- 您必须先解密接收到的内容,然后再解密,然后再发送。在服务器的第6行和最后一行。
- 您需要在caeser函数的for循环之外使用return语句
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。