Hello stackoverflow社区, 我写了一个基于套接字的简单Python脚本并执行了大约20次。 18次它确实做了它应该做的事情,但是它打印了一些randome Letters。
(它应该发送并打印某个目录中的每个foldername)
服务器:
import socket
import os
import base64
host = ''
port = 6934
s = socket.socket()
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
req = c.recv(512)
print "%s has connected w REQ %s" %(str(addr), str(req))
amount = len(os.listdir("./software"))
c.send(str(amount))
print amount
for dir in os.listdir("./software"):
name = str(dir)
c.send()
with open("./software/"+dir+"/img.jpg", "rb") as image:
image.seek(0)
imageStr = image.read().encode("base64")
c.send(imageStr)
print "imageStr"
with open("./software/"+dir+"/text.txt", "r+") as desc:
desc.seek(0)
descStr = desc.read()
c.send(descStr)
print descStr
c.close()
s.close()
客户端:
import socket
class Connection(object):
def __init__(self, name, desc):
self.name = name
self.desc = desc
objList = []
def fetcher(request):
host = "192.168.178.87"
port = 6934
s = socket.socket()
s.connect((host, port))
s.send(request)
amount = int(s.recv(128))
for i in range(0, amount):
name = s.recv(512)
content = s.recv(32768)
desc = s.recv(8192)
objList.append(Connection(name, desc))
def window():
for i in objList:
print i.name
print i.desc
print "Window loop"
def main(request):
fetcher(request)
window()
main("greetings")
控制台输出(我没有更改代码中的任何内容) 服务器:
('192.168.178.87', 56752) has connected w REQ greetings
1
imageStr
Hallo
('192.168.178.87', 56754) has connected w REQ greetings
1
imageStr
Hallo
('192.168.178.87', 56756) has connected w REQ greetings
1
imageStr
Hallo
('192.168.178.87', 56757) has connected w REQ greetings
1
imageStr
Hallo
('192.168.178.87', 56758) has connected w REQ greetings
1
imageStr
Hallo
('192.168.178.87', 56759) has connected w REQ greetings
1
imageStr
Hallo
('192.168.178.87', 56761) has connected w REQ greetings
1
imageStr
Hallo
('192.168.178.87', 56762) has connected w REQ greetings
1
imageStr
Hallo
('192.168.178.87', 56763) has connected w REQ greetings
1
imageStr
Hallo
('192.168.178.87', 56764) has connected w REQ greetings
1
imageStr
Hallo
('192.168.178.87', 56765) has connected w REQ greetings
1
imageStr
Hallo
('192.168.178.87', 56766) has connected w REQ greetings
1
imageStr
Hallo
('192.168.178.87', 56767) has connected w REQ greetings
1
imageStr
Hallo
控制台输出(我没有更改代码中的任何内容) 客户:(我在这里的原因......)
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
oneQk12AQAAAAAAADYAAAAoAAAACgAAAAoAAAABABgAAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAJBzt
JBztJBztJBztJBztJBztJBztJBztJBztJBztAAAkHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0k
HO0AACQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7QAAJBztJBztJBztJBztJBztJBztJBzt
JBztJBztJBztAAAkHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0AACQc7SQc7SQc7SQc7SQc
7SQc7SQc7SQc7SQc7SQc7QAAJBztJBztJBztJBztJBztJBztJBztJBztJBztJBztAAAkHO0kHO0k
HO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0AACQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7QAA
JBztJBztJBztJBztJBztJBztJBztJBztJBztJBztAAA=
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
oneQk12AQAAAAAAADYAAAAoAAAACgAAAAoAAAABABgAAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAJBzt
JBztJBztJBztJBztJBztJBztJBztJBztJBztAAAkHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0k
HO0AACQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7QAAJBztJBztJBztJBztJBztJBztJBzt
JBztJBztJBztAAAkHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0AACQc7SQc7SQc7SQc7SQc
7SQc7SQc7SQc7SQc7SQc7QAAJBztJBztJBztJBztJBztJBztJBztJBztJBztJBztAAAkHO0kHO0k
HO0kHO0kHO0kHO0kHO0kHO0kHO0kHO0AACQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7SQc7QAA
JBztJBztJBztJBztJBztJBztJBztJBztJBztJBztAAA=
Window loop
C:\Users\LeEmpollon\Desktop\Cream>python cream.py
one
Hallo
Window loop
我使用的是Windows 7 Professional 64位,Python 2.7,两个脚本都在同一台计算机上执行,脚本和文件夹位于同一目录中:
folder
-software
--one
---img.jpg (10x10px)
---text.txt(contains the word "Hello")
--creamserver.py
--cream.py
感谢阅读:)
答案 0 :(得分:2)
我认为你误解了套接字是如何工作的。套接字不会跟踪任何类型的块"作为单个send
的一部分发送的数据,或者与单个recv
一起收到的数据。套接字就像一个管道,你在一端填充数据并将其拉出另一端。
如果你发送name
,imageStr
和desc
,那就像在一个大blob中将所有三个一起发送一样。另一方面,您的客户端代码无法告知name
的结束位置和imageStr
的开始位置。
行为的间歇性是由于客户端和服务器的独立操作的不可预测的时间。如果您的服务器设法在客户端执行name
之前同时发送imageStr
和recv
,则客户端将立即同时接收这两者。如果客户端恰好在您发送两个数据之间执行recv
,那么recv
将只接收该点发送的任何内容。在你的情况下,看起来前者发生了两次而后者发生了一次。
Socket Programming HOWTO中解释了这些问题,您应该阅读这些问题。特别是这部分:
现在,如果你仔细考虑一下,你就会意识到套接字的一个基本事实:消息必须是固定长度的(yuck),或者是分隔的(耸肩),或者表示他们有多长时间(好多了),或者通过关闭连接来结束。
由于您的邮件不会执行任何操作,因此您无法可靠地使用套接字。
套接字不能为您做任何事情。它不会以任何方式划分,分块,分组或构建数据。它只是将字节推到另一端。如果你想做一些事情,比如发送单独的数据然后将它们重新分开,你必须自己处理(通过按照文档中的建议划分或标记数据)。或者,或者,使用某种更高级别的网络协议,而不是直接使用套接字,因为由于这些限制,直接使用套接字通常是痛苦的。