Kat*_*rek 11 python sockets client
所以我只是进入python并尝试了一些东西.首先,我正在创建一个服务器,它可以执行简单的操作,例如"GET"存储的文本,"存储"旧文本上的新文本,以及"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()
Run Code Online (Sandbox Code Playgroud)
要从客户端将文本更改为大写,从我的其他编程知识开始,我假设我将客户端的文本存储在变量中,然后在其上运行一个函数将其更改为大写.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
Run Code Online (Sandbox Code Playgroud)
非常感谢你的帮助!:)
注意自我:
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()
Run Code Online (Sandbox Code Playgroud)
jus*_*alf 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
Run Code Online (Sandbox Code Playgroud)
在客户端:
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
Run Code Online (Sandbox Code Playgroud)
客户端控制台上的示例运行(首先运行服务器,然后运行客户端):
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(),并且只应在完成该连接上的任务时关闭它(接受新连接有其开销).您当前的代码只能处理单个客户端.但是,我认为首先,这已经足够了.在您对此有信心之后,您可以尝试使用线程处理更多客户端.
| 归档时间: |
|
| 查看次数: |
45791 次 |
| 最近记录: |