Avatar billede aslan Nybegynder
10. august 2002 - 18:09 Der er 8 kommentarer og
1 løsning

Sende en string til socket server på Action

Jeg forsøger at sende en string til en socket server på knap tryk, men serveren modtager ikke stringen. Har nogen en ide til hvorfor?

serveren:

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Server extends JApplet
{
ServerSocket srvr;
Socket skt;
PrintWriter out;
BufferedReader in;

Server()
{
String data = "server";
try
{
srvr = new ServerSocket(5555);
skt = srvr.accept();
out = new PrintWriter(skt.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(skt.getInputStream()));

while (in.ready())
{
System.out.println(in.readLine());
}
out.print(data);
out.close();
in.close();
skt.close();
srvr.close();
}
catch(Exception e)
{
System.out.print(e);
}
}
public static void main(String[] aslan)
{
new Server();
}

}
-------------------------------------------------------

Appleten med clienten:

......................
Socket skt;
BufferedReader in;
PrintWriter out;
......................
try
{
skt = new Socket("localhost", 5555);
out = new PrintWriter(skt.getOutputStream(),true);


in = new BufferedReader(new InputStreamReader(skt.getInputStream()));


while (in.ready())
{
System.out.println(in.readLine());
}




in.close();
}
catch(Exception e)
{
System.out.print(e);
}

......................
public void actionPerformed( ActionEvent e )
{
if(e.getSource() == button)
{
out.println("test");

}
-------------------------------------------------------
Avatar billede carstenknudsen Nybegynder
10. august 2002 - 18:35 #1
Der er et par ting der kan være problemet.
Det første er at du kan prøve at flush'e
out i din actionPerformed for at sikre
at der bliver sendt information. Det andet
er at du ikke behøver at teste med ready,
hvis du bare skal sende en streng, du kan
bare læse direkte idet læsningen blokerer.
Du har ikke skrevet hvad der sker når du
kører programmerne, kastes der en exception
eller sker der intet?
Avatar billede aslan Nybegynder
10. august 2002 - 18:41 #2
appleten modtager strengen "server", mens der ikke sker noget på serveren og ingen exceptions...
Avatar billede aslan Nybegynder
10. august 2002 - 18:51 #3
Jeg prøvede at køre dem uden :

while (in.ready())

det resulterede i at appleten slet ikke startede op, den står bare venter på et eller andet?

Og out.flush() gjorde ikke forskel..
Avatar billede carstenknudsen Nybegynder
11. august 2002 - 11:01 #4
Jeg har kigget på det og har et par kommentarer.
Jeg har ikke set hele koden så jeg ved ikke
hvordan du starter det op. For det første skal
du starte server og klient op i forskellige
tråde, ellers lever de ikke samtidigt.
Det antager jeg at du gør.
Det der så sker er at serveren modtager en
connection fra klienten, og forsøger straks
at læse hvad der kommer fra klienten. Der kommer
dog intet fra klienten, så den lukker serveren.
Så når din gui er poppet up så trykker du
på knappen og den forsøger at sende, men
da er serveren forlængst lukket ned.
Det du kan gøre er at lade serveren køre
i en uendelig løkke hvor den kalder accept.
Klienten opretter så en forbindelse og sender
data når du klikker på en knap (for først da)
er der data der kan sendes. Så udveksler du
data og klienten og serveren lukkes ned.
Så kaldes accept igen og serveren venter.
Problemet er altså at du ikke kan vente
på at der kommer noget data fra klienten,
for så exit'er serveren hvis ikke der er data.
Jeg kan smide et lille eksempel op.
En pæn løsning vil iøvrigt være at oprette
en ny instans af en klasse der servicerer
requests fra klienten hver gang accept returnerer
med en Socket. Så kan serveren direkte sætte
sig til at vente på en ny klient, og klienterne
kan serviceres parallelt.
Hvis du gerne vil have det skal jeg smide
en kode op der gør det.
Avatar billede aslan Nybegynder
11. august 2002 - 14:06 #5
Jeg vil meget gerne se nogle koder carstenknudsen, men de skal bare være så simple som muligt så jeg har let ved at forstå dem :-)
Avatar billede carstenknudsen Nybegynder
11. august 2002 - 15:57 #6
Her er et simpelt eksempel der illustrerer
de ting jeg beskrev tidligere. Når en
klient connect'er til serveren oprettes
en ny instans der behandler den. I løsningen
her foregår det dog ikke i en tråd, men
ved at lave en tråd hvor der står XXX
kan du servicere flere klienter samtidigt.
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class SC {   
    public static void main( String[] args ){
    Thread t1 = new Thread() {
        public void run() {
            Server server = new Server();
        }
        };
    t1.start();
    Thread t2 = new Thread() {
        public void run() {
            Client client = new Client();
        }
        };
    t2.start();
    }   
    private static class Server {
    ServerSocket serverSocket;
    Socket socket;
    public Server() {
        try {
        serverSocket = new ServerSocket( 5555 );
        while ( 0 == 0 ) {
            socket = serverSocket.accept();
            new ServeClient( socket ); // XXX
        } // while
        } // try
        catch( Exception e ) {
        System.out.print( "Server exception: " + e );
        } // catch
    } // Server
    private static class ServeClient {
        public ServeClient( Socket socket ) {
        try {
            PrintWriter out;
            BufferedReader in;
            out = new PrintWriter( socket.getOutputStream(), true );
            in = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
            String line = "";
            while ( ( line = in.readLine() ) != null ) {
            System.out.println( "server received: " + line );
            } // while
        } // try
        catch ( Exception e ) {
            System.out.println( "Exception in ServerClient: " + e );
        } // catch
        } // ServeClient
    } // ServeClient
    } // Server
    private static class Client extends JFrame {
    public Client() {
        try {
        Container c = getContentPane();
        c.setLayout( new FlowLayout () );
        JButton button1 = new JButton( "Date" );
        button1.addActionListener( new ActionListener() {
            public void actionPerformed( ActionEvent ae ) {
                try {
                Socket socket = new Socket( "localhost", 5555 );
                final PrintWriter out = new PrintWriter( socket.getOutputStream(), true );
                BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream() ) );
                Date date = new Date();
                out.println("message from client at " + date );
                socket.close();
                } // try
                catch ( Exception e ) {
                System.out.println( "Exception in actionPerformed: " + e );
                } // catch
            } // actionPerformed
            } );
        JButton button2 = new JButton( "Calendar" );
        button2.addActionListener( new ActionListener() {
            public void actionPerformed( ActionEvent ae ) {
                try {
                Socket socket = new Socket( "localhost", 5555 );
                final PrintWriter out = new PrintWriter( socket.getOutputStream(), true );
                BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream() ) );
                Calendar calendar = Calendar.getInstance();
                out.println("message from client, day is " + calendar.get(Calendar.DAY_OF_MONTH) );
                out.println("message from client, month is " + calendar.get(Calendar.MONTH) );
                out.println("message from client, year is " + calendar.get(Calendar.YEAR) );
                socket.close();
                } // try
                catch ( Exception e ) {
                System.out.println( "Exception in actionPerformed: " + e );
                } // catch
            } // actionPerformed
            } );
        c.add( button1 );
        c.add( button2 );
        pack();
        show();
        } // try
        catch ( Exception e ) {
        System.out.print( "Client exception: " + e );
        } // catch
    } // Client
    } // Client
} // SC
Avatar billede aslan Nybegynder
21. august 2002 - 22:12 #7
Undskyld fraværet, men jeg havde gang i andre projekter:-)..... Jeg er ikke helt med på dit eksampel. For det første får jeg en fejl når jeg kører 2 "clienter":
Server exception: java.net.BindException: Address already in use: JVM_Bind

Og for det andet kan de jo ikke se hvad de skriver til hinanden?
Avatar billede aslan Nybegynder
25. august 2002 - 17:59 #8
ligemeget du....
Avatar billede carstenknudsen Nybegynder
25. august 2002 - 21:31 #9
Det forstår jeg ikke helt? Serveren
modtager da data og udskriver det
til skærmen? Har du overhovedet forsøgt
at køre programmet? Hos mig virker det
fint.
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

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Bliv en del af vores nye mobiludviklingsteam i Cyberdivisionen i Hvidovre

Capgemini Danmark A/S

IGNITE Graduate Program 2026

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Ingeniør til Satellitkommunikation