在Python

时间:2015-07-31 14:09:38

标签: python string sockets string-parsing

我在python中制作了一个侦听端口4444的小服务器,当我用telnet连接时,一切都很好,我可以发送消息,服务器正确显示消息。 我只有一个问题: 当我尝试“解析”telnet消息时,我无法正确执行此操作。 事实上如果输出==“截图”,我想如果我发送的消息是“截图”,服务器在控制台上打印一条消息。 这不起作用。 这是我的来源,我是Python和网络编程的新手。 提前致谢 **即使我使用==如果声明是相同的** Coogle

来源

import head
print("SockShot Server Starting\n")
sock=head.Server("localhost",4444)
print("Server STARTED")
while True:
    sock.s.listen(1)
    conn,addr=sock.s.accept()
    print("Connessione stabilita con : {0}:{1} \n".format(addr[0],str(addr[1])))
    conn.send("Benvenuto \n".encode())
    sock.ricevi(conn)

HEAD.py

import socket
import sys
class Server:
    server=""
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    def __init__(self,server,porta):
        self.server=server
        try:
            self.s.bind((server,porta))
            print("Server binding complete \n")
        except:
            print("Binding server incomplete")
            sys.exit(2)

    def ricevi(self,socket):
        result=socket.recv(1024)
        while len(result)>0:
            try:
                print(result.decode())
                result=socket.recv(1024)
                self._check(str(result.decode()))
            except:
                print("Connection CLOSED BY CLIENT \n")
                break;
        socket.close()

    def _check(self,output):
        if output is "screenshot":
            print("Screenshot ESEGUITO \n")
        else:
            print(output)

1 个答案:

答案 0 :(得分:4)

可能的问题之一是您在使用is时使用==来比较字符串:

if output == "screenshot":

==用于进行«标准»比较(即值的相等),在大多数情况下你将使用的那个:

>>> 1 == 1
True
>>> [1, 2] == [1, 2]
True

is用于检查两个变量是否指向同一个对象:

>>> [1, 2] is [1, 2]
False
>>> l1 = [1, 2]
>>> l2 = l2
>>> l1 is l2
True # Same object, if you update l1 you will also update l2
>>> l1[0] = 4
>>> l1, l2
([4, 2], [4, 2])

is可能会产生误导,因为在某些情况下它等同于标准==

>>> 1 is 1
True
>>> a = 1
>>> b = 1
>>> a is b
True
>>> s = 'hello'
>>> s is 'hello'
True
>>> s = s.lower()
>>> s, s is 'hello'
('hello', False)

那么,这里发生了什么?

执行[1, 2]时,它会创建一个值为12的新列表(新内存块),因此,如果您执行[1, 2]两次,则会生成两个不同的列表已创建,每个都有唯一的内存位置,因此[1, 2] is [1, 2]False

但是,当您键入'hello'时,您第一次分配内存,但是当再次键入'hello'时,因为它是常量string,它指向第一个({1}}为避免重复相同的内存块,所以s = 'hello' ; s is 'hello'True。在lower上调用s后,您将创建一个新的内存块,即使此块包含与'hello'相同的数据,它也不在同一地址,因此{{1是假的。