Avatar billede kamak Praktikant
05. november 2003 - 16:09 Der er 8 kommentarer og
1 løsning

Socket overføre ArrayList

Jeg har følgende kode der godt kan compile uden fejl. Meningen er at klienten kalder serveren med et projektnavn. Serveren kalder så en andenklasse med parameteren projektnavn og der returneres en ArrayList indeholdende Strings. Arraylisten skal så via ObjectOutputStream/ObjectInputStream sendes fra Serveren over til klienten der så udskriver alle Strengene.
Der er indsat nogle System.outPrintln for at finde ud af hvor langt programmet når. Programmet stopper hænger efter både klienten og Serveren har udskrevet "1".
Hvad er der galt?

Koden:

import java.io.*;
import java.net.*;
import java.util.*;

public class Client
{
    public static void main (String[]args)
    {
        try
        {
            ArrayList list;
            Socket s = new Socket("127.0.0.1", 1234);
            //BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
            PrintWriter out = new PrintWriter(s.getOutputStream(), true);
            out.println("Projekt1");
            System.out.println("1");
            ObjectInputStream input = new ObjectInputStream(s.getInputStream());
            System.out.println("2");
            list = (ArrayList)input.readObject();
           
            for(int i = 0; i < list.size(); i++)
            {
                System.out.println((String)list.get(i));
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

import java.io.*;
import java.net.*;
import cs1.Keyboard;

public class Server
{
    public static void main (String[]args)
    {
        try
        {
            ServerSocket s = new ServerSocket(1234);
            IncomingThread t = new IncomingThread(s);
            t.start();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}


import java.io.*;
import java.util.*;
import java.net.*;

class IncomingThread extends Thread
{
    ServerSocket s;
    FileHandler f;
    ArrayList list;

    public IncomingThread(ServerSocket servSock)
    {
        s = servSock;
        f = new FileHandler();
        list = new ArrayList();
    }

    public void run()
    {
        try
        {
            System.out.println("server up and running...");
            Socket incoming = s.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader (incoming.getInputStream()));
            String projektnavn = in.readLine();
            list = f.listFiles(projektnavn);//returnere en ArrayList med Strings
            System.out.println("1");
            Socket soc = s.accept();
            System.out.println("2");
            ObjectOutputStream outObject = new ObjectOutputStream(soc.getOutputStream());
            outObject.writeObject(list);
            soc.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
05. november 2003 - 16:24 #1
"normalt" (hvad det så er), så plejer man at lave en loop
i server main som accepter og laver en tråd som tager den
af accept returnerede socket som argument til constructor.
Avatar billede arne_v Ekspert
05. november 2003 - 16:27 #2
Jeg kan godt forstå at den server hænger.

Client conncter en gang.

Og du laver 2 x accept.

Den sidste accept står og venter på en ny connect.
Avatar billede arne_v Ekspert
05. november 2003 - 16:28 #3
Og du kan sagtens bruge Object*Stream til at sende den String med (en
String er jo også et objekt).
Avatar billede kamak Praktikant
05. november 2003 - 16:30 #4
ok jeg skal lige tygge på den i 2 sek
Avatar billede kamak Praktikant
05. november 2003 - 16:35 #5
kan du eventuel rette lidt i min kode?
Avatar billede arne_v Ekspert
05. november 2003 - 16:36 #6
Jeg har rettet lidt til så det "virker":

import java.io.*;
import java.net.*;
import java.util.*;

public class Client
{
    public static void main (String[]args)
    {
        try
        {
            ArrayList list;
            Socket s = new Socket("127.0.0.1", 1234);
            ObjectOutputStream output = new ObjectOutputStream(s.getOutputStream());
            ObjectInputStream input = new ObjectInputStream(s.getInputStream());
            output.writeObject("Projekt1");
            list = (ArrayList)input.readObject();
            for(int i = 0; i < list.size(); i++)
            {
                System.out.println((String)list.get(i));
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}


import java.io.*;
import java.net.*;
import java.util.*;

public class Server
{
    public static void main (String[]args)
    {
        try
        {
            ServerSocket s = new ServerSocket(1234);
            IncomingThread t = new IncomingThread(s.accept());
            t.start();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}


class IncomingThread extends Thread
{
    Socket s;
    ArrayList list;

    public IncomingThread(Socket sock)
    {
        s = sock;
        list = new ArrayList();
    }

    public void run()
    {
        try
        {
            ObjectInputStream inObject = new ObjectInputStream(s.getInputStream());
            ObjectOutputStream outObject = new ObjectOutputStream(s.getOutputStream());
            String projektnavn = (String)inObject.readObject();
            list.add(projektnavn);
            list.add("OK");
            outObject.writeObject(list);
            outObject.flush();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
05. november 2003 - 16:37 #7
C:\e4>start java Server

C:\e4>java Client
Projekt1
OK

Ser korrekt ud !
Avatar billede arne_v Ekspert
05. november 2003 - 16:37 #8
Og lad os kalde det for et svar !
Avatar billede kamak Praktikant
05. november 2003 - 16:56 #9
Det er kanon godt. Mange tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester