11

所以我只是进入 python 并尝试一些东西。首先,我正在创建一个服务器,它执行简单的操作,例如“GET”存储文本、“STORE”旧存储文本上的新文本以及“TRANSLATE”小写文本到大写。但我有几个问题。到目前为止,这是我的代码:

import socket

HOST = ''   # Symbolic name meaning the local host
PORT = 24069    # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'
try:
    s.bind((HOST, PORT))
except socket.error , msg:
    print 'Bind failed. Error code: ' + str(msg[0]) + 'Error message: ' + msg[1]
    sys.exit()
print 'Socket bind complete'
s.listen(1)
print 'Socket now listening'
while 1:
    conn, addr = s.accept()
    print 'Connected with ' + addr[0] + ':' + str(addr[1])
    data = conn.recv(1024)
    reply = 'OK...' + data
    if not data: break
    conn.send(data)
conn.close()
s.close()

要开始将客户端的文本更改为大写,根据我的其他编程知识,我假设我会将客户端的文本存储在一个变量中,然后在其上运行一个函数以将其更改为大写。python中有这样的功能吗?有人可以给我一个片段吗?

最后,我将如何在 python 中执行 GET 或 STORE 之类的操作?我最好的猜测是:

data = conn.recv(1024)
if data == GET: print text
if data == STORE: text = data #Not sure how to reference the text that the client has entered

非常感谢您的帮助!:)

注意自我:

import socket

HOST = ''   # Symbolic name meaning the local host
PORT = 24069    # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'
try:
    s.bind((HOST, PORT))
except socket.error , msg:
    print 'Bind failed. Error code: ' + str(msg[0]) + 'Error message: ' + msg[1]
    sys.exit()
print 'Socket bind complete'
s.listen(1)
print 'Socket now listening'

# Accept the connection
(conn, addr) = s.accept()
print 'Server: got connection from client ' + addr[0] + ':' + str(addr[1])
storedText = 'Hiya!'
while 1:
    data = conn.recv(1024)
    tokens = data.split(' ', 1)
    command = tokens[0]
    if command == 'GET':
        print addr[0] + ':' + str(addr[1]) + ' sends GET'
        reply = storedText
    elif command == 'STORE':
        print addr[0] + ':' + str(addr[1]) + ' sends STORE'  
        storedText = tokens[0]
        reply = '200 OK\n' + storedText
    elif command == 'TRANSLATE':
        print addr[0] + ':' + str(addr[1]) + ' sends TRANSLATE'
        storedText = storedText.upper()
        reply = storedText
    elif command == 'EXIT':
        print addr[0] + ':' + str(addr[1]) + ' sends EXIT'
        conn.send('200 OK')
        break
    else:
        reply = '400 Command not valid.'

    # Send reply
    conn.send(reply)
conn.close()
s.close()
4

1 回答 1

13

我看到你对 Python 很陌生。您可以尝试查找一些代码示例,并且您还应该学习如何解释错误消息。错误消息将为您提供应该查看的行号。您应该考虑该行或上一行,因为错误可能是由以前的错误引起的。

无论如何,在您编辑之后,您仍然有缩进错误吗?

关于你真正的问题,首先是概念。

要运行客户端/服务器,您需要两个脚本:一个作为客户端,一个作为服务器。

在服务器上,脚本只需要绑定到一个套接字并监听该连接、接收数据、处理数据然后返回结果。这是您正确完成的操作,只是您只需要在发送响应之前处理数据。

首先,您不需要accept在 while 循环中包含 ,只需接受一个连接,然后一直使用它直到客户端关闭。

所以你可能会在服务器上做这样的事情:

# Accept the connection once (for starter)
(conn, addr) = s.accept()
print 'Connected with ' + addr[0] + ':' + str(addr[1])
stored_data = ''
while True:
    # RECEIVE DATA
    data = conn.recv(1024)

    # PROCESS DATA
    tokens = data.split(' ',1)            # Split by space at most once
    command = tokens[0]                   # The first token is the command
    if command=='GET':                    # The client requests the data
        reply = stored_data               # Return the stored data
    elif command=='STORE':                # The client want to store data
        stored_data = tokens[1]           # Get the data as second token, save it
        reply = 'OK'                      # Acknowledge that we have stored the data
    elif command=='TRANSLATE':            # Client wants to translate
        stored_data = stored_data.upper() # Convert to upper case
        reply = stored_data               # Reply with the converted data
    elif command=='QUIT':                 # Client is done
        conn.send('Quit')                 # Acknowledge
        break                             # Quit the loop
    else:
        reply = 'Unknown command'

    # SEND REPLY
    conn.send(reply)
conn.close() # When we are out of the loop, we're done, close

在客户端:

import socket

HOST = ''   # Symbolic name meaning the local host
PORT = 24069    # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST,PORT))
while True:
    command = raw_input('Enter your command: ')
    if command.split(' ',1)[0]=='STORE':
        while True:
            additional_text = raw_input()
            command = command+'\n'+additional_text
            if additional_text=='.':
                break
    s.send(command)
    reply = s.recv(1024)
    if reply=='Quit':
        break
    print reply

在客户端控制台上运行示例(首先运行服务器,然后运行客户端):

输入你的命令:STORE this is a text
好的
输入你的命令:GET
这是一个文本
输入您的命令:翻译
这是一个文本
输入你的命令:GET
这是一个文本
输入你的命令:QUIT

我希望你能从那里继续。

另一个重要的一点是,您使用的是 TCP ( socket.SOCK_STREAM),因此您实际上可以在使用 接受连接后保留连接s.accept(),并且只有在完成该连接上的任务时才应关闭它(接受新连接有其开销)。您当前的代码将只能处理单个客户端。但是,我认为首先,这已经足够了。在你对此有信心之后,你可以尝试通过使用threading来处理更多的客户端。

于 2013-09-24T02:31:46.037 回答