Python套接字服务器/客户端编程

时间:2013-09-24 01:55:44

标签: python sockets client

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

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()

1 个答案:

答案 0 :(得分:13)

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

无论如何,在你编辑之后,你还有缩进错误吗?

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

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

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

对于初学者,您不需要在while循环中包含accept,只需接受一个连接,然后保持连接直到客户端关闭。

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

# 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

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

Enter your command: STORE this is a text
OK
Enter your command: GET
this is a text
Enter your command: TRANSLATE
THIS IS A TEXT
Enter your command: GET
THIS IS A TEXT
Enter your command: QUIT

我希望你能从那里继续。

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