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(); }
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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?
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.
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
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?
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.
Synes godt om
Ny brugerNybegynder
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.