Antworten des Servers

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
NicNac
User
Beiträge: 19
Registriert: Sonntag 17. Juni 2012, 12:14

Hallo zusammen,

Ich beschäftige mich momentan mit Sockets und experementiere einfach ein wenig rum. Als Beispiel dient wie so oft eine einfache Client / Server Verbindung die vorab als Chat agieren soll. Es ist mir möglich die beiden zu Verbinden und der Client kann auch Nachrichten versenden und der Server empängt diese auch entsprechend. Das einzige was ich einfach nicht hinbekomme das ich auch Antworten kann vom Server aus. Vllt könnt ihr mal drüber sehen und mir sagen wie ich bzw wo ich die Antwort möglichkeit am besten setze.

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Created on Sun Jun 17 11:47:34 2012

@author: nic
"""
from time import *
from socket import *

server = socket(AF_INET, SOCK_STREAM) 
server.bind(('', 6565)) 
server.listen(1)
clients = []

try:
    
    while True: 
        lesen, schreiben, oob = select.select([server] + clients, [], [])

        for sock in lesen: 
            if sock is server: 
                client, addr = server.accept() 
                clients.append(client) 
                print "+++ Client %s verbunden" % addr[0]
                antwort = raw_input('Antwort: ')
                server.send(antwort)
            else: 
                nachricht = sock.recv(1024) 
                ip = sock.getpeername()[0] 
                if nachricht: 
                    print "[%s] %s" % (ip, nachricht)
                   
                else: 
                    print "+++ Verbindung zu %s beendet" % ip 
                    sock.close() 
                    clients.remove(sock)

        
finally:
    
    for c in clients: 
        c.close() 
        server.close()
Vielen lieben Dank im vorraus
Nic
BlackJack

@NicNac: An der Stelle wo Du beim Server eine Nachricht empfangen hast, kannst Du doch „einfach” antworten.

Wenn das robust sein soll, kannst Du da natürlich nur eine Antwort generieren und zum Beispiel in eine Warteschlange stecken, die dem Client zugeordnet ist und dann in das `select()` die Clients einbauen für die Nachrichten vorliegen um zu schauen bei welchen nicht-blockierend etwas geschrieben werden kann.

Was Du anscheinend nicht berücksichtigst ist das ein `recv()` nicht alles liefern muss was zu einer Nachricht gehört. Es können mehrere nötig sein. Umgekehrt sendet ein `send()` nicht garantiert alles was man übergeben hat. Man muss also selber darauf achten immer alles zu empfangen und zu senden bis eine Nachricht komplett übertragen ist. Dazu muss man sich ein Protokoll überlegen um überhaupt feststellen zu können was alles zu einer Nachricht gehört. Das ist insgesamt sehr puzzelig und fehleranfällig. Weshalb kaum jemand ernsthaft auf dieser untersten Schicht arbeitet, sondern Nachrichten auf einer höheren Abstraktionsebene verschickt. Zum Beispiel per JSON-RPC oder XML-RPC.
NicNac
User
Beiträge: 19
Registriert: Sonntag 17. Juni 2012, 12:14

Meinst du in dem ersten "else" zweig oder wo? ...
Antworten