Progtwigción de servidor / cliente de socket Python

Así que me estoy metiendo en Python y probando algunas cosas. Para empezar, estoy creando un servidor que hace cosas simples como “GET” s texto almacenado, “STORE” nuevo texto sobre el texto almacenado antiguo y “TRANSLATE” s minúscula en mayúsculas. Pero tengo algunas preguntas. Aquí está mi código hasta ahora:

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

Para comenzar a cambiar el texto de un cliente a mayúsculas, de mis otros conocimientos de progtwigción, asumo que almacenaría el texto del cliente en una variable y luego ejecutaría una función en él para cambiarlo a mayúsculas. ¿Existe tal función en python? ¿Podría alguien, por favor, darme un fragmento de cómo se vería esto?

Y por último, ¿cómo haría algo como GET o STORE en python? Mi mejor conjetura sería:

 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 

¡Muchísimas gracias por toda ayuda! 🙂

Nota personal:

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

Veo que eres bastante nuevo en Python. Puede intentar encontrar algún ejemplo de código y también debería aprender a interpretar el mensaje de error. El mensaje de error le dará el número de línea donde debe mirar. Debe considerar esa línea o línea anterior, ya que el error puede ser causado por errores anteriores.

De todos modos, después de sus ediciones, ¿todavía tiene un error de sangría?

Sobre tu verdadera pregunta, primero, el concepto.

Para ejecutar cliente / servidor, necesitará dos scripts: uno como cliente y otro como servidor.

En el servidor, el script solo tendrá que vincularse a un socket y escuchar esa conexión, recibir datos, procesar los datos y luego devolver el resultado. Esto es lo que ha hecho correctamente, excepto que solo necesita procesar los datos antes de enviar la respuesta.

Para empezar, no necesita incluir la accept en el bucle while, solo acepte una conexión, luego continúe hasta que el cliente cierre.

Así que podrías hacer algo como esto en el servidor:

 # 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 

y en el cliente:

 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 

Ejecución de muestra (primero ejecute el servidor, luego ejecute el cliente) en la consola del cliente:

 Ingrese su comando: GUARDAR este es un texto
 DE ACUERDO
 Ingrese su comando: GET
 este es un texto
 Ingrese su comando: TRADUCIR
 ESTE ES UN TEXTO
 Ingrese su comando: GET
 ESTE ES UN TEXTO
 Ingrese su comando: SALIR

Espero que puedas continuar desde allí.

Otro punto importante es que estás usando TCP ( socket.SOCK_STREAM ), por lo que puedes retener la conexión después de aceptarla con s.accept() , y solo debes cerrarla cuando hayas completado la tarea en esa conexión ( aceptar una nueva conexión tiene su sobrecarga). Su código actual solo podrá manejar un solo cliente. Pero, creo que para empezar, esto es lo suficientemente bueno. Una vez que haya confiado en esto, puede tratar de manejar más clientes utilizando subprocesos .