2017-11-19 3 views
0

Nehmen Sie es einfach mit mir, ich bin neu in Socket-Programmierung.Multi-Funktions-Buchse Java, Buchse vs NIO-Buchse

Ich bin dabei, ein Programm zu machen, das Teamviewer ähnlich ist. Ich könnte eine einfache Server/Client-Anwendung erstellen, die Multithread ist. Aber das Problem ist, ich konnte nicht herausfinden, wie etwas zu tun wie: Lassen Sie uns sagen, ich habe Server und einen Client mit dem Server verbunden. Ich könnte eine Datei vom Client zum Server übertragen. Ich könnte ein einfaches Gespräch mit einem Kunden führen. Aber mein Problem ist: Wie kann ich mit dem Client chatten, während die Datei zur gleichen Zeit übertragen wird? Ich meine, ich könnte nicht mehr als eine Funktion in einer Zeit machen. Weil wir nur einen Eingang und einen Ausgang für Server und Client haben. Wie also könnte ich mehr als eine Funktion an den Client senden und wie könnte der Kunde mehr als eine Funktion gleichzeitig lesen und auf Anfragen antworten? Ich habe so etwas wie: Ich schickte eine Anfrage an den Client und ich bekam die Antwort in einem neuen Thread, der einen neuen DataInputStream enthält, aber ich konnte nicht herausfinden, wie der Haupt DataInputStream eine neue Antwort vom Client erhalten wird, da was die Anfragen auf diese Weise ist der neue DataInputStream. Ich bin wirklich in dieser Situation verloren, weil ich denke, dass mein Konzept völlig falsch ist, aber ich konnte nicht das richtige Konzept finden, um so etwas zu tun. Ist es mit ServerSocket möglich oder sollte ich auf NIO Socket schauen?

HINWEIS: Ich möchte kein Stück Code, ich würde gerne das Konzept der gesamten Operation für so etwas verstehen. Danke

Antwort

0

Verwenden Sie ein Paket basierend Massieren System über eine einzige Verbindung

Outgoing

{"type":"chat", "message":"hi"} 
{"type":"xfer", "fileName":"fileX", "data":"some_binary_data"} 

Incoming

switch(getString("type")){ 

    case "chat": 
     System.out.println("User said" + getString("message")); 
     break; 

    case "xfer": 
     File f = new File(getString("fileName")); 
     f.write(getString("data")); 
     break; 

    ... 
} 

Offensichtlich, wenn die binäre Datei ziemlich groß ist, sollten Sie brechen es in viele verschiedene Nachrichten und wieder zusammensetzen auf der anderen Seite, dies würde ermöglichen Chat-Nachrichten zu machen Weg über den Draht, während die Übertragung auch noch stattfindet.

+0

Danke für die Lösungen. Die erste ist eigentlich mehr als Port ich denke, und ich bevorzuge es nicht zu verwenden. Die zweite, ich habe es versucht, aber hier ist das Problem. Wenn ich wie ein Beispiel screen sharing beginne, funktioniert es gut, aber wenn ich eine andere Funktion senden möchte: Ich habe eine Antwort bekommen, aber dann bin ich konfrontiert Ausnahme im Thread "Thread-3" java.lang.NullPointerException was bedeutet, die Daten konnten überhaupt nicht ankommen. Und da fing ich an, mich zu verirren. Wie ich denke, weil ich eine Eingabe und Ausgabe verwende. Aber ich wusste nicht wirklich, was los ist! Selbst wenn ich sie zu Threads hinzugefügt habe, habe ich die gleichen Ergebnisse erhalten. – kaj

+1

Das kommt nun in ein sehr spezifisches und komplexes Problem, das ohne Code unmöglich ist. Sie müssen alle Nachrichten und Threads ordnungsgemäß verwalten, die den Socket verwenden. Alles, was ich gab, war eine einfache Theorie, wie es gemacht werden kann, der Pseudocode allein ist nicht threadsicher. –

+0

Ich bin großartig über das, was du gerade gesagt hast, ich wollte sicher sein, dass ich in die richtige Richtung bin, bevor ich weitermache. Wenn die von Ihnen genannte Lösung funktionieren könnte, fange ich an, hier einige Codes zu schreiben, um das Problem herauszufinden. Kann ich diese Frage bearbeiten, um den Server/Client-Code hinzuzufügen? Es tut mir leid, dass ich neu hier bin und Entschuldigung für mein schlechtes Englisch. – kaj