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

2024-05-23 16:24:09 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,stackoverflow社区, 我编写了一个简单的基于套接字的Python脚本并执行了20次。 它做了18次它应该做的,但2次它打印了一些随机字母。你知道吗

(它应该发送并打印特定目录中的每个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

感谢阅读:)


Tags: pyloopwindowreqoneusershasdesktop
1条回答
网友
1楼 · 发布于 2024-05-23 16:24:09

我想你误解了插座的工作原理。套接字不跟踪作为单个send的一部分发送或通过单个recv接收的任何类型的数据“块”。插座就像一根管子,一端塞进数据,另一端拔出数据。你知道吗

如果你发送nameimageStrdesc,这就等同于把这三个元素一起发送到一个大的blob中。另一方面,您的客户机代码无法判断name结束和imageStr开始的位置。你知道吗

这种行为的间歇性是由于客户机和服务器的独立操作的不可预测的时间造成的。如果您的服务器在客户机执行recv之前同时发送nameimageStr,那么客户机将同时接收这两个。如果客户机恰好在您发送两个数据段之间执行recv,那么recv将只接收该点发送的任何内容。在你的案例中,前者发生了两次,后者发生了一次。你知道吗

这些问题在Socket Programming HOWTO中有解释,您应该阅读。尤其是这一部分:

Now if you think about that a bit, you’ll come to realize a fundamental truth of sockets: messages must either be fixed length (yuck), or be delimited (shrug), or indicate how long they are (much better), or end by shutting down the connection.

由于您的消息不执行这些操作,因此您根本无法可靠地使用套接字。你知道吗

插座对你没用。它不会以任何方式对数据进行定界、分块、分组或结构化。它只是把字节推到另一端。如果您想发送单独的数据片段,然后将它们作为单独的片段重新捕获,那么您必须自己处理(按照文档中的建议对数据进行定界或长度标记)。或者,也可以使用某种更高级别的网络协议,而不是直接使用套接字,因为由于这些限制,直接使用套接字通常是件麻烦事。你知道吗

相关问题 更多 >