Doppeltes Paket
Verfasst: Donnerstag 2. Oktober 2014, 02:26
Hi Leute,
ich muss sagen ich bin komplett neu bei python, und habe mir diese Sprache ausgesucht um eine kleine Aufgabe mit Sockets zu bewältigen. Ich möchte einen kleinen Kommandozeile-gesteuerten Server schreiben, der Simple Strings speichern kann. Jetzt habe ich mit Hilfe von Wireshark gemerkt, dass ich jedes mal, wenn ich eine Antwort schicke, vorher noch ein leeres Paket mit schicke.
Das würde ich gerne verhindern, da unnötiger Netzwerkverkehr zu vermeiden ist. Ich hoffe jemand sieht, was ich hier falsch gemacht habe, da ich einfach nicht drauf komme wo das eine Paket herkommen soll.
Anbei der Code... Es ist noch nicht so fertig, wie ich das möchte, da ich bisher an diesem Problem hing. Die eingegebene Zahl, die der Länge des zu speichernden/auszugebenen Strings entsprechen soll, ist bisher noch irrelevant.
Danke schonmal im vorraus - alle Anregungen (evtl. auch Off-Topic sind hilfreich)!
ich muss sagen ich bin komplett neu bei python, und habe mir diese Sprache ausgesucht um eine kleine Aufgabe mit Sockets zu bewältigen. Ich möchte einen kleinen Kommandozeile-gesteuerten Server schreiben, der Simple Strings speichern kann. Jetzt habe ich mit Hilfe von Wireshark gemerkt, dass ich jedes mal, wenn ich eine Antwort schicke, vorher noch ein leeres Paket mit schicke.
Das würde ich gerne verhindern, da unnötiger Netzwerkverkehr zu vermeiden ist. Ich hoffe jemand sieht, was ich hier falsch gemacht habe, da ich einfach nicht drauf komme wo das eine Paket herkommen soll.
Anbei der Code... Es ist noch nicht so fertig, wie ich das möchte, da ich bisher an diesem Problem hing. Die eingegebene Zahl, die der Länge des zu speichernden/auszugebenen Strings entsprechen soll, ist bisher noch irrelevant.
Danke schonmal im vorraus - alle Anregungen (evtl. auch Off-Topic sind hilfreich)!
Code: Alles auswählen
import socket
import sys
import re
from thread import *
HOST = '' # symbolic name meaning all available interfaces
PORT = 31337
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# print 'socket created'
try:
s.bind((HOST, PORT))
except socket.error, msg:
print 'binding failed, code: ' + str(msg[0]) + ' message: ' + msg[1]
sys.exit()
# print 'socket bind complete'
s.listen(10)
print 'socket listening'
def clientthread(conn):
memory = dict()
key = ''
# infinite loop
dataToSave = ''
waitingForData = False
conn.sendall('000\n')
while True:
# receive from client
data = conn.recv(1024)
# split up received data
result = data.split()
count = len(result)
print('Client: ' + data)
if waitingForData:
# TODO ask just for NEWLINE PERIOD NEWLINE
if '.' in data:
dataToSave = dataToSave + data
dataToSave = dataToSave.replace(' ', '')[:-3]
memory[key] = dataToSave
print('PUT: Stored: ' + dataToSave + ' under ' + key)
dataToSave = ''
waitingForData = False
reply = '000\n'
else:
reply = '001\n'
print('PUT: Receiving more data')
dataToSave = dataToSave + data
else:
if count > 0:
if result[0] == 'PUT' or result[0] == 'GET':
if count == 3:
length = result[1]
key = result[2]
if result[0] == 'PUT':
# PUT
if key in memory:
print('PUT: Key is already in system')
reply = '102\n'
else:
print('PUT: Awaiting data')
reply = '001\n'
waitingForData = True
else:
# GET
if key in memory:
# TODO send data
print('GET: Client demands ' + key)
print(memory[key])
reply = memory[key] + '\n'
reply = reply + '000\n'
else:
print('GET: Key already in system')
reply = '102\n'
else:
# less than 2 different keywords
print('Not exactly 3 words received')
reply = '100\n'
elif result[0] == 'CLEAR':
if count == 2:
key = result[1]
if key in memory:
print('CLEAR: Key accepted, deleting data')
reply = 'deleting data\n'
# TODO delete data
else:
print('CLEAR: nNot exactly 2 words received')
reply = '100\n'
elif result[0] == 'QUIT':
# quit
print('QUIT: Client demands quit, quitting')
conn.close()
else:
print('Unknown Command')
reply = '100\n'
else:
print('No words received')
reply = '100\n'
if not data:
break
conn.sendall(reply)
conn.close()
# keep talking with client
while 1:
#wait to accept a connection - blocking call
conn, addr = s.accept()
# display client information
print 'Connected with: ' + addr[0] + ' : ' + str(addr[1])
# start new thread 1st argument is function to be run second is tuple of arguments for function
start_new_thread(clientthread, (conn,))
s.close()