0

ist die Situation:Können Sie Bilder senden, ohne die anderen Daten durch dieselbe java.net.socket zu blockieren? Diese

Ich bin an einem Projekt arbeiten, wo ich in der Lage sein ein oder mehrere Bilder ab und senden an/vom Server sowie viele andere Arten von Daten dargestellt mit Text. Die Art und Weise, wie es gerade gemacht wird, ist durch Senden einer Nachricht mit dem Zeichen "einkommendes Bild der Größe x, die als y verwendet werden soll" (es ist natürlich nicht so formuliert), und dann rufe ich eine Methode auf, die das nächste x liest Bytes durch einen DataInputStream. Zuerst traf ich einige Probleme mit der Latenz, die Dinge zu vermasseln, aber ich ließ den Server einen neuen Thread spawnen, um die Nachricht "eingehendes Bild" zu senden, und dann auf ein Flag warten, das gesetzt wird, wenn der Client mit einem "Ich bin bereit" antwortet für das Bild "Nachricht. Es funktioniert jetzt, aber wenn etwas anderes, zum Beispiel eine Chat-Nachricht, gesendet wird, während das Bild übertragen wird, wird diese Nachricht für einen BufferedReader als rohe Bytes gelesen und als Teil des Bildes verwendet. Daher muss ich alle ausgehenden Daten blockieren (und sie zu einer Warteschlange hinzufügen), wenn ein Bild gesendet wird. Aber das scheint sehr falsch und ärgerlich, da Benutzer der Anwendung nicht in der Lage sein werden zu chatten, während sie ein großes Bild empfangen/hochladen.

Das ist, was ich brauche: Also muss ich entweder einen unabhängigen Kanal für die Verwendung von Rohdaten einrichten. Was, soweit ich das verstehen kann, ist, dass ich einen neuen Socket über einen neuen Port einrichten muss, der unnötig erscheint. Der andere Weg, den ich sehen könnte, um dies zu lösen, wäre es irgendwie jedes Paket mit einem "Dies ist Text/Rohdaten" Bit zu versehen, aber ich habe keine Idee wie man das mit Java macht? Können Sie Informationen zum Paket-Header hinzufügen, wenn Sie etwas in den Stream schreiben (das jedes Paket enthält, das diese Informationen enthält) und dann die Paketdaten am anderen Ende lesen und entsprechend handeln?

Wie Sie sehen können, habe ich nicht viel Erfahrung mit dem Networking, noch habe ich Java für eine lange Zeit verwendet. Dies ist auch mein erster Beitrag hier, also sei nett. Wenn etwas unklar war, bitte fragen Sie, und ich werde angeben. Alle Ideen sind willkommen! (Es gibt möglicherweise einen Standard Weg, dies zu tun?)

Vielen Dank!

Antwort

3

Es gibt nichts im TCP-Protokoll selbst, das Ihnen helfen kann. Sie öffnen entweder eine neue Socket-Verbindung (kann zum selben Server-Port gehören), oder Sie teilen Ihre Bilder in kleinere Stücke und wickeln diese Stücke in Hüllen ein, die sagen, welche Art von Nachricht es ist: Bild oder Chat. Und dann rekonstruieren Sie das Bild auf der Empfängerseite aus diesen Chunks. Aber das wird Bandbreite verschwenden und eigene Komplexitäten hinzufügen (z. B. wie groß machst du einen Teil dieses Bildes?).
Ich würde mit der separaten binären Datenverbindung gehen.

+0

Ok, vielen Dank :) Ich werde diese Frage für eine Weile beobachten, und wahrscheinlich für eine separate Datenverbindung gehen? * Nachschlagen, wie man mehrere Verbindungen am selben Port einrichtet * –

+0

Sie öffnen nur die zweite Verbindung wie die erste. Server-Seite kann auf einem Server-Socket in einer Schleife akzeptieren. –

+0

Ja, ich habe es zur Arbeit :) Danke nochmal. Ich werde immer noch etwas Zeit brauchen, um alles funktionieren zu lassen, aber ich kann sehen, wie ich es jetzt machen werde. –

2

Java sollte eine Standardunterstützung für das HTTP-Protokoll haben - verwenden Sie HTTP, um Ihre Bildübertragungen durchzuführen, da Sie den Datentyp festlegen können, der in der Kopfzeile übertragen wird. Grundsätzlich würde Ihre Client/Server-Architektur für jede neue Datenübertragung (sei es Text oder Bild) eine separate Anfrage erstellen, so dass Sie die Verarbeitung in einer einfachen Schleife durchführen können.

Dies könnten Sie eine Hilfe sein: How to use java.net.URLConnection to fire and handle HTTP requests?

+0

Danke, ich werde mich darum kümmern. Schlägst du vor, dass ich meine gesamte Architektur von TCP auf HTTP-Protokoll ändere? So weit ich das verstehe, würde es möglich sein, es auch zu einem Web-Applet zu machen? –

+0

Sie ändern nicht zu HTTP von TCP, da HTTP ON TOP von TCP ausgeführt wird (es ist ein Protokoll auf Anwendungsebene). Es hat nichts damit zu tun, dass Ihre App ein "Web-Applet" ist, Sie können eine Desktop-App als HTTP-Client verwenden - einer davon ist Ihr Browser. Und Web-Applets sind so etwas wie eine uralte Vergangenheit. Ich kenne heute niemanden mehr, der ernsthaft an Web-Applets arbeitet. – Jas

+0

Ja, ich bin mir bewusst, wie es funktioniert :) Aber aus der Perspektive der Programmierer (ich) müsste ich den Code ändern, um es über HTTP zu senden, obwohl es immer noch technisch TCP ist. Und ich weiß auch, dass es immer noch als Desktop-Anwendung funktionieren wird, aber ich dachte, dass es nett sein könnte, eine Applet-Version des Clients zu haben, aber da ich Sockets benutzte, war es nicht möglich. Ich habe mich nicht wirklich damit befasst, aber es klingt wie das, was Sie vorschlagen, ist die gleiche Art, wie Sie Applets zu Ihrem Server kommunizieren? Wie auch immer, das ist nicht meine Hauptsorge, wäre nur süß, um die Option zu haben. Danke vielmals. –

Verwandte Themen