nach langer Zeit versuche ich mal wieder was neues und arbeite zum allererstenmal mit Netzwerkcode + Threading. Soweit bin ich derzeit:
Code: Alles auswählen
import socket
import select
import json
class Server:
def __init__(self):
self.startServer()
self.Connections = [self.Server]
print self.Connections;
self.run()
def startServer(self):
# Set up the server
self.Server = socket.socket()
host = socket.gethostname()
self.Server.bind((host, 12344))
self.Server.listen(5) # Wait for client
def run(self):
# The 'main' function
print 'Running ... '
Running = True
while Running:
InList,OutList,ExceptList = select.select(self.Connections,[],[])
print 'Waiting ...'
for Connection in InList:
if Connection == self.Server:
# Server got a new connecting Client
UserSocket, Adress = self.Server.accept() # New User Connection
self.Connections.append(UserSocket) # Store the new User Connection
print 'User ', Adress, ' connected'
print 'All Connections now: ', self.Connections
else:
# Some other Socket got data for the Server
Data = Connection.recv(1024)
if not Data:
print 'No new Data!'
break
print Data
for Connection in OutList:
pass
Code: Alles auswählen
import socket
import json
import select
import threading
class Client:
def __init__(self):
self.Socket = socket.socket()
Host = socket.gethostname()
self.Socket.connect((Host,12344))
self.Connections = [self.Socket]
self.run()
def checkIncoming(self):
# Check for incoming data
InList,OutList,ExceptList = select.select(self.Connections,[],[])
for Connection in InList:
# Handle incoming connection (Which however is only the Connection Server -> Client)
Data = Connection.recv(1024)
if not Data:
break
print Data
def run(self):
# Main function
test = threading.Thread(target=self.checkIncoming())
test.start()
def send(self,Data):
Data = json.dumps(Data) # Encode Data
try:
self.Socket.send(Data)
except socket.error, e:
print 'Error sending data: %s' % e
def kill(self):
self.Socket.close()
Den Client "dreiteilen". Ein Thread soll beim Client eingehende Nachrichten / Requests bearbeiten, einer ausgehende und einer Nutzerrequests, also wenn der Nutzer z.B. instance.send() anfordert. Vom dem was ich bisher verstanden habe müsste ich so vorgehen:
1. Eine Mainfunktion haben, die bei mir run() heißt und die 3 Threads startet.
2. Jeder der drei Threads muss eine Endlosschleife sein, da ja immer wieder neu nach neuen Requests geschaut werden muss.
Ist das so richtig? Ich habe das ganze vorher ohne Threads versucht und konnte dann zwar z.B. instance.send() vom Client wunderbar benutzen und beim Server kam alles an, allerdings hing sich alles in einer Endlosschleife auf, wenn ich dann noch hinzugefügt habe, dass der Clients permanent nach einkommenden Requests schaut. Lösung wäre ja das angesprochene Threading hierfür.
Und jetzt sagt mir bitte nicht, dass es fertige Lösungen dafür gibt. Ich mache das um was zu lernen.
Also wichtig für mich wäre:
1. Ist mein genereller Gedankengang richtig?
2. Wo liegen meine Fehler?
3. Wieso funktioniert der obige Code nicht?
Vielen Dank!