Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Socket zu Port 80 und Stream lesen

Empfohlene Antworten

Veröffentlicht

Hi,

mein Programm soll sich mit Sockets zum Port 80 auf einer anderen Maschine connecten, und dort einen Stream lesen und in einen String packen. Das dauert aber elendig lang, kann man das irgenwie beschleunigen?

Dazu mein Code:


package socket.domain;


import java.io.*;

import java.net.*;


public class Time {


	public Time(){};


	/*

	 * Gibt einen String mit der aktuellen Zeit zurück.

	 * 

	 */

	public String printTime(String ip, int port) {

		//Methoden Variablen deklarieren und initialisieren

		int i = 0;

		String s = null;

		StringBuffer sBuf = null;

		Socket sock1 = null;


		try {

			//Verbindung aufbauen

			InetAddress inet = InetAddress.getByName(ip);

			System.out.print("Host: "+ip);

			System.out.println("Connecting...");

			sock1 = new Socket(inet, port);

			System.out.println("Connection available?\t"+sock1.isConnected());

			InputStream ioStream = sock1.getInputStream();

			System.out.println("ioStream angelegt");

			byte[] b = new byte[100];

			sBuf = new StringBuffer();

			while ((i = ioStream.read() != -1) {

				sBuf.append(i);

				System.out.println("i appended.");

			}

			s = sBuf.toString();

			ioStream.close();

			sock1.close();

			System.out.println("*** Socket closed. ***");

		} catch (IOException e) {

			e.printStackTrace();

		}

		return s;

	}


	public static void main(String[] args) {

		Time t = new Time();

	 String s = t.printTime("192.168.0.1", 80);

	 System.out.println(s);

	}


}

[/code]

Danke für eure Mühe.

Schönen Abend noch.

Codefiesler

Ja, ich weiß was so lange dauert...

InetAddress inet = InetAddress.getByName(ip);

... deine Namensauflösung. Übergib lieber die IP direkt an dein Socket (da deine IP eh ein String ist).

sock1 = new Socket(ip, port);

Versuch mal dein byte[100] etwas größer zu machen.

Ich probier den Code bei mir mal aus....

JETZT weiß ich woran das liegt.... :beagolisc

Also folgendes. Dein Programm passt soweit... Nur gibt es ein Problem. Der Webserver antwortet ja erst wenn der Client eine Anfrage schickt. Da du aber nichts durch deinen OutputStream jagst, reagiert der Webserver auch auf nichts...

Verstehst du? Du bist zwar mit dem Webserver verbunden, jedoch gibt's dann irgendwann einen Timeout, weil nichts passiert...

Nimm mal einen anderen Port um sowas zu testen, oder schicke eine "Anfrage" an den Webserver.

  • Autor

Reicht es, wenn ich dann vor dem InputStream, diesen Code schreibe,


OutputStream out = sock1.getOutputStream();

			byte[] byteWrite = {0001};

			out.write(byteWrite);

oder muss ich ein bestimmtes Pattern einhalten? Mein Code sieht dann so aus:
package socket.domain;


import java.io.*;

import java.net.InetAddress;

import java.net.Socket;


public class Time {


	public Time(){};


	/*

	 * Gibt einen String mit der aktuellen Zeit zurück.

	 * 

	 */

	public String printTime(String ip, int port) {

		//Methoden Variablen deklarieren und initialisieren

		int i = 0;

		String s = null;

		StringBuffer sBuf = null;

		Socket sock1 = null;


		try {

			//Verbindung aufbauen

			InetAddress inet = InetAddress.getByName(ip);

			System.out.print("Host: "+ip);

			System.out.println("Connecting...");

			sock1 = new Socket(inet, port);

			System.out.println("Connection available?\t"+sock1.isConnected());

			//Informationen vom Zeitserver holen

			//InputStreamReader ioStream = new InputStreamReader(sock1.getInputStream());

			//Request schicken

			OutputStream out = sock1.getOutputStream();

			byte[] byteWrite = {0001};

			out.write(byteWrite);

			System.out.println("Bytes written.");

			//Zeit vom Server in Stream laden

			InputStream ioStream = sock1.getInputStream();

			System.out.println("ioStream angelegt");

			//zu lesende anzahl festlegen

			byte[] b = new byte[100];

			//solang lesen bis stream keine daten mehr enthält

			sBuf = new StringBuffer();

			while ((i = ioStream.read() != -1) {

				sBuf.append(i);

				System.out.println("i appended.");

			}

			s = sBuf.toString();

			ioStream.close();

			sock1.close();

			System.out.println("*** Socket closed. ***");

		} catch (IOException e) {

			e.printStackTrace();

		}

		return s;

	}


	public static void main(String[] args) {

		Time t = new Time();

	 String s = t.printTime("192.168.0.1", 80);

	 System.out.println(s);

	}


}

[/code]

Naja, du müsstest schon mindestens HTTP 1.0 einhalten, sonst gibt dein Webserver nur Quatsch zurück....

Schreib sowas wie "GET irgendwo/irgendwas" in den Stream und der Webserver gibt dir die entsprechende Seite zurück....

Danke, das meinte ich... ;)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.