Przesłanie ArrayList<String> przez socket

0

Cześć

W jaki sposób wysłać i odebrać ArrayList<String> przez socket?

Znalazłem taki kod ale nie potrafię go użyć w moich aplikacjach.

// example input list
List<String> list = new ArrayList<String>();
list.add("foo");
list.add("bar");
list.add("baz");

// write to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(baos);
for (String element : list) {
    out.writeUTF(element);
}
byte[] bytes = baos.toByteArray();

// read from byte array
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
DataInputStream in = new DataInputStream(bais);
while (in.available() > 0) {
    String element = in.readUTF();
    System.out.println(element);
}

Problem mam z tym, że ja posiadam dwie aplikacje, Client i Server . U Clienta użyłem tej części.

List<String> list = new ArrayList<String>();
list.add("foo");
list.add("bar");
list.add("baz");

// write to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(baos);
for (String element : list) {
    out.writeUTF(element);
}
byte[] bytes = baos.toByteArray();

natomiast na Serverze tej:

ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
DataInputStream in = new DataInputStream(bais);
while (in.available() > 0) {
    String element = in.readUTF();
    System.out.println(element);

Wadzi mi tu ta zmienna bytes na serverze. Jak ją odczytać?

0

Ja w jednym programie zrealizowałem zapis i odczyt tablicy stringów w .NET w poniższy sposób, w ten sposób można oczywiście zrobić w Javie, a nawet w sytuacji, gdy klient i serwer są napisane w różnych technologiach.

Wyglada to tak:

Tworzysz obiekt strumienia w pamięci, a następnie metody, które zapisują i odczytują z tego strumienia.
Strona wysyłająca tworzy strumień w pamięci, zapełnia go, konwertuje na tablicę bajtową i wysyła, natomiast strona odbierająca konwertuje otrzymaną tablicę bajtową na strumień w pamięci i wyciąga z niego dane w odpowiedni sposób. Oczywiście należy sprawdzić poprawność i kolejność odczytów po obu stronach, w przeciwnym wypadku się rozjedzie i i może dojść do próby odczytania danych poza strumieniem lub nieodczytanie całego strunienia, a dane będą z całą pewnością błędne. Do odczytu i zapisu danych trzeba sobie przygotować odpowiednie metody. W jednym programie w C# mam takie metody, w Javie mozna zrobić analogicznie. Wśród ponizszych metod jest właśnie odczyt i zapis listy.

    // Zamiana napisu na ciag bajtow
    public static byte[] ToBytes(string str)
    {
        return Encoding.UTF8.GetBytes(str);
    }

    // Zamiana ciagu bajtow na napis
    public static string ToStr(byte[] bytes)
    {
        return Encoding.UTF8.GetString(bytes);
    }

    // Zapis do strumienia
    public static void StreamWrite(Stream Str, bool S)
    {
        if (S)
        {
            Str.WriteByte(1);
        }
        else
        {
            Str.WriteByte(0);
        }
    }
    public static void StreamWrite(Stream Str, byte[] S)
    {
        int L = S.Length;
        StreamWrite(Str, L);
        Str.Write(S, 0, L);
    }
    public static void StreamWrite(Stream Str, string S)
    {
        StreamWrite(Str, ToBytes(S));
    }
    public static void StreamWrite(Stream Str, List<string> S)
    {
        if (S == null)
        {
            StreamWrite(Str, 0);
        }
        else
        {
            StreamWrite(Str, S.Count);
            for (int i = 0; i < S.Count; i++)
            {
                StreamWrite(Str, S[i]);
            }
        }
    }
    public static void StreamWrite(Stream Str, List<byte[]> S)
    {
        if (S == null)
        {
            StreamWrite(Str, 0);
        }
        else
        {
            StreamWrite(Str, S.Count);
            for (int i = 0; i < S.Count; i++)
            {
                StreamWrite(Str, S[i]);
            }
        }
    }
    public static void StreamWrite(Stream Str, int S)
    {
        int IB1 = (S >> 24) & 255;
        int IB2 = (S >> 16) & 255;
        int IB3 = (S >> 8) & 255;
        int IB4 = S & 255;
        Str.WriteByte((byte)IB1);
        Str.WriteByte((byte)IB2);
        Str.WriteByte((byte)IB3);
        Str.WriteByte((byte)IB4);
    }


    // Odczyt ze strumienia
    public static void StreamRead(Stream Str, out bool S)
    {
        if (Str.ReadByte() != 0)
        {
            S = true;
        }
        else
        {
            S = false;
        }
    }
    public static void StreamRead(Stream Str, out byte[] S)
    {
        int L;
        StreamRead(Str, out L);
        S = new byte[L];
        Str.Read(S, 0, L);
    }
    public static void StreamRead(Stream Str, out string S)
    {
        byte[] X;
        StreamRead(Str, out X);
        S = ToStr(X);
    }
    public static void StreamRead(Stream Str, out int S)
    {
        byte[] B = new byte[4];
        Str.Read(B, 0, 4);
        int IB1 = ((int)B[0]) << 24;
        int IB2 = ((int)B[1]) << 16;
        int IB3 = ((int)B[2]) << 8;
        int IB4 = ((int)B[3]);
        S = IB1 + IB2 + IB3 + IB4;
    }
    public static void StreamRead(Stream Str, out List<string> S)
    {
        int L;
        StreamRead(Str, out L);
        S = new List<string>();
        for (int i = 0; i < L; i++)
        {
            string X;
            StreamRead(Str, out X);
            S.Add(X);
        }
    }
    public static void StreamRead(Stream Str, out List<byte[]> S)
    {
        int L;
        StreamRead(Str, out L);
        S = new List<byte[]>();
        for (int i = 0; i < L; i++)
        {
            byte[] X;
            StreamRead(Str, out X);
            S.Add(X);
        }
    }
0

Wysyłanie:

ObjectOutputStream oos = null;
ArrayList<String> lista = new ArrayList<String>();
lista.add("Kowalski");
lista.add("Nowak");
try
{
      Socket socket = new Socket(host,port);
      oos = new ObjectOutputStream(socket.getOutputStream());
      oos.writeObject(lista);
      oos.flush();
      oos.close();
}
catch(Exception e) 
{
      System.out.println(e);
}

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