相同的python脚本,但结果不同

时间:2016-12-22 21:30:47

标签: python windows python-2.7 sockets networking

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

感谢阅读:)

1 个答案:

答案 0 :(得分:2)

我认为你误解了套接字是如何工作的。套接字不会跟踪任何类型的块"作为单个send的一部分发送的数据,或者与单个recv一起收到的数据。套接字就像一个管道,你在一端填充数据并将其拉出另一端。

如果你发送nameimageStrdesc,那就像在一个大blob中将所有三个一起发送一样。另一方面,您的客户端代码无法告知name的结束位置和imageStr的开始位置。

行为的间歇性是由于客户端和服务器的独立操作的不可预测的时间。如果您的服务器设法在客户端执行name之前同时发送imageStrrecv,则客户端将立即同时接收这两者。如果客户端恰好在您发送两个数据之间执行recv,那么recv将只接收该点发送的任何内容。在你的情况下,看起来前者发生了两次而后者发生了一次。

Socket Programming HOWTO中解释了这些问题,您应该阅读这些问题。特别是这部分:

  

现在,如果你仔细考虑一下,你就会意识到套接字的一个基本事实:消息必须是固定长度的(yuck),或者是分隔的(耸肩),或者表示他们有多长时间(好多了),或者通过关闭连接来结束

由于您的邮件不会执行任何操作,因此您无法可靠地使用套接字。

套接字不能为您做任何事情。它不会以任何方式划分,分块,分组或构建数据。它只是将字节推到另一端。如果你想做一些事情,比如发送单独的数据然后将它们重新分开,你必须自己处理(通过按照文档中的建议划分或标记数据)。或者,或者,使用某种更高级别的网络协议,而不是直接使用套接字,因为由于这些限制,直接使用套接字通常是痛苦的。