Przesyłanie bajtów za pomocą ByteArrayInput(Output)Stream

0

Mam problem z przesłaniem tablicy bajtów lokalnie z klienta do serwera przy użyciu ByteArrayInput(Output)Stream. Wydaje mi się, że źle odczytuję to co wysyłam. Poniżej kawałek kodu z serwera, który wysyła dane do klienta (wycięte niektóre try, catch itd):

            gniazdo = new ServerSocket(4444);
            polaczenie = gniazdo.accept();
            wy = polaczenie.getOutputStream();

            if(wy != null)
            {
                zapis = new ByteArrayOutputStream();
            }

        System.out.println("Próba wysyłania...");

        try
        {
            if(zapis != null)
            {
                String str = "napis";
                byte[] byte_arr = str.getBytes();
                zapis.write(byte_arr);                
                System.out.println("String do wysłania:"+str);
                System.out.println("Tablica do wysłania:");
                for(int k=0;k<byte_arr.length;k++)
                {
                    System.out.println(byte_arr[k]);
                }
                
            }
        }
 

Wynik działania:

Próba wysyłania...
String do wysłania:napis
Tablica do wysłania:
110
97
112
105
115

Kawałek kodu klienta odbierającego dane (wycięte niektóre try, catch itd):

    Socket gniazdo = null;    
    InputStream we = null;
    ByteArrayInputStream odczyt = null;
            
        gniazdo = new Socket("localhost",4444);
        System.out.println("Klient połączony:"+gniazdo.isConnected());
        we = gniazdo.getInputStream();
        try
        {
            if(we!=null)
            {
                System.out.println("we avaible: "+we.available());
                byte[] buf = new byte[5];
                odczyt = new ByteArrayInputStream(buf);
            }
        }

        try
        {
            if(odczyt.available() > 0)
            {                            
                System.out.println("Odczyt avaible: "+odczyt.available());
                int i = -1;
                byte[] cbuf = new byte[odczyt.available()];
                i = odczyt.read(cbuf);
                String str = new String(cbuf);
                if(i!=-1)
                {                                
                    System.out.println("Bajty: "+i+" Informacja z serwera: "+str);
                }
                System.out.println("Bajty z tablicy:");
                for(int k=0;k<cbuf.length;k++)
                {
                    System.out.println(cbuf[k]);
                }
            }

Wynik działania klienta:

Klient połączony:true
we avaible: 0
Odczyt avaible: 5
Bajty: 5 Informacja z serwera:

Czy ktoś wie czemu nic nie zostało odebrane? Czy to dlatego, że metoda avaible() dla inputStream zwraca 0? Jeśli tak to dlaczego ona zwraca 0?

EDIT: Wynik polecenia netstal -tln po uruchomieniu programu serwera:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN
tcp6 0 0 :::139 :::* LISTEN
tcp6 0 0 :::4444 :::* LISTEN
tcp6 0 0 :52989 :::* LISTEN
tcp6 0 0 :::445 :::* LISTEN

0

we = gniazdo.getInputStream();
Skoro strumień we czyta z gniazda, to używaj we.read(). Ty natomiast próbujesz odczytać dane z gniazda za pomocą ByteArrayInputStream odczyt
Z czego to niby ma czytać? Bo na pewno nie z gniazda.

0

Dzięki za zainteresowanie. Z tym, że we.avaible() zwraca 0, także nie ma co odczytać (we.read() zwraca -1) i właśnie nie wiem dlaczego nie ma nic do oczytania.

0
SoyeR napisał(a):

Z tym, że we.avaible() zwraca 0, także nie ma co odczytać (we.read() zwraca -1) i właśnie nie wiem dlaczego nie ma nic do oczytania.

No skoro nie ma danych to zwraca 0. Prościej zadeklarować stały rozmiar bufora odbiorczego.

Socket gniazdo = null;    
InputStream we = null;
ByteArrayInputStream odczyt = null;
byte[] cbuf = new byte[8192];
 
gniazdo = new Socket("localhost",4444);
System.out.println("Klient połączony:"+gniazdo.isConnected());
we = gniazdo.getInputStream();
        
while ( true ) {
	try {
		int i = we.read( cbuf );
		if ( i <= 0 ) {
			System.out.println("Socket error.");
			break;
		}
		else {
			System.out.println("Bajty z tablicy:");
			for(int k=0;k<i;k++)
			{
				System.out.println(cbuf[k]);
			}
		}
	} catch ( Exception ignored ) {}
			
}
0

Dzięki za zwrócenie uwagi na niepotrzebny ByteArrayStream, po przejsciu na InputStream i OutputStream działa.

0

Nie łatwiej stworzyć klasę z jednym polem typu Object, wpakować w niego byte[] i za pomocą ObjectOutputStream wysłać jako jedną rzecz?

Podobne rozwiązanie, tylko rozszerzone sugerowałem tutaj:
http://4programmers.net/Forum/Java/210324-outputstreamclose_wymiana_plikow

1 użytkowników online, w tym zalogowanych: 0, gości: 1