Avatar billede dresen Nybegynder
26. februar 2004 - 19:18 Der er 8 kommentarer og
2 løsninger

Problemer med klient server program

Hej eksperter.

Jeg kæmper med at lave et klient- og et server program der kan kommunikerer med hinanden.

Det volder mig dog store problemer, og min overordnede programstruktur er efterhånden sønderbombet af de mange fejlkorrektioner jeg har forsøgt mig med.

Mit håb er nu, at en eller flere af jer kan hjælpe mig igennem til en løsning, og give input til mit videre arbejde.

Jeg arbejder med pt. med 3 klasser:

Server: klasse som lytter efter klienter, og opretter en tråd (ClientHandler) der håndterer den videre kommunikation med klienten

Client: klasse der opretter en socket forbindelse til severen, og forsøger at sende beskeder til denne. Her har jeg forsøgt mig med en grafisk brugergrænseflade.

ClientHandler: klasse der arver fra Thread. Håndterer komunikationen med en klient.

Der er main metoder i klasserne Client og Server.

Kørsel:

- kører klassen ServerSocket.
- kører klassen Client
- leverer input i textfield i gui'en til Client

Af mærkværdige grunde kan jeg kun få sendt en enkelt besked fra klienten til serveren (dvs. ClientHandleren). Jeg har hardkodet 7 reads i klassen ClientHandler,men som sagt er det kun den første der læses, ellers modtages null.

Output:

client wrote: hej
client wrote: null
client wrote: null
client wrote: null
client wrote: null
client wrote: null
client wrote: null

-----------------------------------------------------
// class Server


import java.net.*;

public class Server{
   
    public void listen(){

        try{
           
            int port = 8000;
           
            ServerSocket serverSocket = new ServerSocket(port);

            while( true ){
               
                Socket incoming = serverSocket.accept();

                ClientHandler CH = new ClientHandler(incoming);
                CH.start();

            }
        }
        catch( Exception e ){
            e.printStackTrace();
        }
    }

    public static void main(String[] args){
       
       
        Server s = new Server();
        s.listen();

    }
}


//--------------------------------

// class ClientHandler

mport java.net.*;
import java.io.*;

public class ClientHandler extends Thread
{
    private Socket connectionSocket = null;
    private String clientSentence;
    private String capitalizedSentence;
   
    public ClientHandler(Socket incoming)
    {
        connectionSocket = incoming;
    }

    public void run()
    {
        try
        {
            BufferedReader inFromClient =
              new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));

            DataOutputStream  outToClient =
              new DataOutputStream(connectionSocket.getOutputStream());



           
            clientSentence = inFromClient.readLine();
            System.out.println("client wrote: " + clientSentence);

            clientSentence = inFromClient.readLine();
            System.out.println("client wrote: " + clientSentence);

            clientSentence = inFromClient.readLine();
            System.out.println("client wrote: " + clientSentence);


            clientSentence = inFromClient.readLine();
            System.out.println("client wrote: " + clientSentence);


            clientSentence = inFromClient.readLine();
            System.out.println("client wrote: " + clientSentence);

            clientSentence = inFromClient.readLine();
            System.out.println("client wrote: " + clientSentence);


            clientSentence = inFromClient.readLine();
            System.out.println("client wrote: " + clientSentence);



            //capitalizedSentence = clientSentence.toUpperCase() + '\n';

            //outToClient.writeBytes(capitalizedSentence);

            inFromClient.close();
            outToClient.close();

        }
        catch( Exception e )
        {
            e.printStackTrace();
        }

        try
        {
            connectionSocket.close();
        }
        catch( Exception e )
        {
        }

    }
}

//----------------------------------

// class Client

   
// java core packages
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;

// java extension packages
import javax.swing.*;


public class Client extends JFrame{

    private DataOutputStream outToServer;   
    private BufferedReader inFromServer;
       
    private Socket clientSocket;
    private String message;
    private String username;
    private String hostIP;
    private JTextArea outputArea;
    private JTextField inputField;

    public Client(String host, String name){
       
        // set frames title
        super(name );
       
        // set serverInternetAddr and username     
        hostIP = host;   
        username = name;
               
        Container containter = getContentPane();       
   
        // set up area and field - add ActionListener   
        outputArea = new JTextArea();
        inputField = new JTextField();
        inputField.addActionListener(new ActionHandler());
       
        containter.add(new JScrollPane(outputArea) , BorderLayout.CENTER);
        containter.add(inputField, BorderLayout.SOUTH);
               
        this.setSize(300, 150);
        this.setVisible(true);
       
        System.out.println("sluningen af konstruktøren");
       
    } // end constructor


    private void testConversation() throws UnknownHostException, IOException{
   
        String sentence = "";
        String modifiedSentence;

        //BufferedReader inFromUser =  new BufferedReader(new InputStreamReader(System.in));


        connectToServer();
       
        openStreams();

        System.out.println("efter openstreams i konstruktøren");

/*

// 1 write til server
        // in from user
        sentence = inFromUser.readLine();
        System.out.println("dit input var: " + sentence);

        // output til server
        outToServer.writeBytes(sentence + '\n');

// 2. write til server
        sentence = inFromUser.readLine();
        System.out.println("dit input var: " + sentence);

        // output til server
        outToServer.writeBytes(sentence + '\n');
*/


        // input from server
    //    modifiedSentence = inFromServer.readLine();
    //    System.out.println("FROM SERVER: " + modifiedSentence);

       
   
    }








/*
    public void runConversation(){
       
        try{
       
            System.out.println("we connected to server");
       
            // step 1 - connect to server
            connectToServer();
           
       
            // step 2 - open communication streams
            openStreams();
       
            //step 3 - proces connection
            //processConnection();
       
            //step 4 - close streams and connection
            //closeConnection();
       
        }
        catch(IOException ioExc){
            ioExc.printStackTrace();       
        }
           
    }

*/

    private void connectToServer() throws IOException{
   
        outputArea.setText("Client (" + username + "): atempting connection\n");
   
        // create socket to make connection to server
        clientSocket = new Socket("127.0.0.1", 8000);
           
        outputArea.append("Connected to: " + clientSocket.getInetAddress().getHostName());
       
    }



    // step 2
    private void openStreams() throws IOException{

        // @ spgm1 spørg om forskellige streams

        // open outputStream
        outToServer =  new DataOutputStream(clientSocket.getOutputStream());
       
        //outToServer.flush(); // ved ikke om dette flush er nødvendigt
   
        // open buffered inputStreamReader
        inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
           
        outputArea.append("\nGot I/O streams\n");

    }


    private void sendData(String userMessage){
   
        // send object to server
           
        //inputField.setText("");
   
        System.out.println("i starten af metoden sendData");
   
        System.out.println("Dette input er sendt med til sendData: " + userMessage);
   
    /*
        try {

            outToServer.writeBytes( username + ">>> " + userMessage );
            //outToServer.flush();
            outputArea.append( "\n" + username + ">>>" + userMessage);
         
          }

          // process problems sending object
          catch ( IOException ioException ) {
            outputArea.append( "\nError writing to server" );
          }
                             
        System.out.println("i slutningen  af metoden send data");   
    */                     
    }
   

    private class ActionHandler implements ActionListener{

        public void actionPerformed(ActionEvent event){
       
            String userInput = inputField.getText();
           
            System.out.println("er nu inde i actionPErformed - user skrev: " + userInput);
       
            sendData(userInput);   
            try {
                outToServer.writeBytes(userInput + '\n');
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           
           
            //sendData(userInput);       
        }
   
    } // end inner class ActionHandler


    public static void main(String[] args){
       
        Client application;
       
        if(args.length == 0){
            application = new Client("127.0.0.1", "Lille_Virgil");
        }else{
            application = new Client(args[0], args[1]);
        } 
       
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   
        //application.runConversation();
       
        try {
            application.testConversation();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
    }


}

/*
private void connect() throws IOException{
   
    outputArea.setText("Client (" + username + "): atempting connection\n");
   
    // create socket to make connection to server
    clientSocket = new Socket(InetAddress.getByName(hostIP), 8000);
           
    outputArea.append("Connected to: " + clientSocket.getInetAddress().getHostName());
       
}
*/



Jeg beklager for det meget rodede udtryk i klasserne :]
Avatar billede jakoba Nybegynder
26. februar 2004 - 19:41 #1
Rodet er din værste fjende. Det er det du skal have gjort noget ved.
Derefter har du så en chance for at overskue problemet og løse det.

Så isetedet for at fokusere på "Jeg vil have det til at virke"
vil jeg anbefale du fokusererer på "Jeg vil gøre det overskueligt"
for en tid.
Avatar billede bootie Nybegynder
26. februar 2004 - 21:50 #2
Jeg er ikke 100meter mester i Java og netværk, men kunne det ikke tænkes at når du har lavet den første clientSentence = inFromClient.readLine(); er den efterfølgende tom bagefter?
Hvis der ikke kommer 7 linier fra klienten KAN man jo ikke bare lige læse 7 linier...
Så vil de næste 6 linier jo helt automatisk være tomme..

Bare et forslag
Avatar billede bootie Nybegynder
26. februar 2004 - 21:53 #3
Jeg er faktisk overbevist om at det er der du har problemet nu.
Avatar billede arne_v Ekspert
26. februar 2004 - 22:31 #4
readLine er blocking d.v.s. at den venter på der er en linie.

Hvis client lukker ned bør man få en exception.

Men ingen tvivl om at den klassiske:

while((clientSentence = inFromClient.readLine()) != null) {
    System.out.println("client wrote: " + clientSentence);
}

ville være en god ting.

Jeg kan imidlertid ikke genskabe problemet.

C:\>java Server
client wrote: 1
client wrote: 2
client wrote: 3
client wrote: 4
client wrote: 5
client wrote: 6
client wrote: 7       

En anden ting som jeg synes at du skal lave om er at erstatte DataOutputStream
og writeBytes med PrintStream og println.

Men det burde imidlertid heller ikke give fejlen.
Avatar billede bootie Nybegynder
26. februar 2004 - 22:31 #5
Jeg vil istedet foreslå at du fra klienten sender 7 gange, men at du på serverens RUN metode kun har een clientSentence = inFromClient.readLine();

Så tror jeg du vil se en hel anden adfærd i dit program :)
Ellers finder vi ud af noget andet.
Avatar billede dresen Nybegynder
26. februar 2004 - 23:23 #6
Det var da en ejendommelig omgang - hvorfor blocking når readLine er inde i while, men ikke når det er hardcodet ??!!!

Jeg har prøvet med while løkke og det virker.

Jeg havde netop valgt at hardcode det til at starte med, for så efterfølgende at indhylde det i en løkke.

arne, du skriver at du ikke kan genskabe problemet. Har du nogen idé til hvorfor det ikke virker hos mig, og evt. hvorfor readLine ikke "blocker".

Tak for hjælpen !!
Avatar billede arne_v Ekspert
27. februar 2004 - 09:05 #7
Forskellig JDK, forskellig operativ system, forskellige versioner - et eller
andt sted må der være en lille forskel.
Avatar billede dresen Nybegynder
29. februar 2004 - 00:36 #8
Hej.

Smid et svar så I kan få jeres velfortjente point.

Tak for hjælpen
Avatar billede arne_v Ekspert
29. februar 2004 - 08:50 #9
svar
Avatar billede bootie Nybegynder
29. februar 2004 - 17:36 #10
Her
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