Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[java] serversocket

Pagina: 1
Acties:

  • tec
  • Registratie: Juni 2001
  • Laatst online: 17-12-2024
Hoi allemaal,

ik wordt helemaal gek van het volgende probleem. Nadat mijn eigen code niet werkte heb ik meerdere code samples van het internet geplukt om te testen maar elke keer werkt het niet en geeft het hetzelfde probleem. Connecten van een client naar de server lukt maar verstuurde data van de client naar de server komt niet aan. Pas als ik disconnect (vanuit de client, ik gebruik hier Socket Workbench voor als test) print de server de ontvangen data... :/

de server print het volgende naar de console, de schuingedrukte tekst komt pas als ik disconnect...
Attempting to listen for clients on port: 4444
Listening for clients on port: 4444
RECEIVED:test tekst


Op de client krijg ik helemaal niks terug van de server... Ik snap het niet meer :'(

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import java.net.*;
import java.io.*;

public class ServerGeval {
    
    public static void main(String[] args) throws IOException {
        boolean _listening = true;
        ServerSocket _serverSocket = null;
        
        try {
            System.out.println ("Attempting to listen for clients on port: 4444");
            _serverSocket = new ServerSocket(4444);
        }
        catch (IOException  e) {
            System.out.println("Could not listen on port: 4444");
            System.exit(-1);
        }
        
        System.out.println ("Listening for clients on port: 4444");
        
        while(_listening) {
            new ServerGevalThread(_serverSocket.accept()).start();
        }
        
        _serverSocket.close();      
    }
}




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

public class ServerGevalThread extends Thread {
    
    private Socket _clientSocket; 
    private BufferedReader _in;
    private PrintWriter _out;
    
    public ServerGevalThread(Socket clientSocket) {
        super("ServerGevalThread");
        this._clientSocket = clientSocket;
    }
    
    public void run() {

        try {
            String inputLine;
            
            _in = new BufferedReader(new InputStreamReader(_clientSocket.getInputStream()));
            _out = new PrintWriter(_clientSocket.getOutputStream(),true);
            
            while ((inputLine = _in.readLine()) != null)
            {
                _out.println("THANKYOU FOR THIS LINE:" + inputLine);
                _out.flush();
                
                System.out.println("RECEIVED:" + inputLine);
            }
        } 
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 17-11 22:11

Nick_S

++?????++ Out of Cheese Error

Toon ons ook even je clientcode. Je server code ziet er op het eerste gezicht goed uit.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 18-11 20:06

Robtimus

me Robtimus no like you

Je doet een readLine. Dat betekent dat deze method pas output geeft zodra er een line break komt, of de hele stream is gelezen. Daarom print hij dus meteen zodra de client disconnect - de stream houdt gewoon op.

Probeer dus ook println aan de client kant te gebruiken. Die stuurt dan de line break mee.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • momania
  • Registratie: Mei 2000
  • Laatst online: 17-11 18:29

momania

iPhone 30! Bam!

En vergeet de flush() aan de client kant niet ;)

En leer aub dat underscore prefix voor class variabelen af :X Gebruik een goede IDE, dan zie je aan de subtiele kleurverschillen van je variabelen wel of het class variablen zijn of niet. ;)

Neem je whisky mee, is het te weinig... *zucht*


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Klinkt inderdaad als een buffering probleem. Laat de client na elke send de buffer flushen. Ik ben zelf niet bekend met Java, maar als er een auto-flush feature is wil je dat wel gebruiken denk ik.

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea


  • LAN
  • Registratie: Oktober 2000
  • Niet online

LAN

Voor testdoeleinden:
Probeer eens met telnet: telnet localhost 4444
En vervolgens je zin gevolgd door enter.

Dan kun je in ieder geval testen of deze server code bij jou werkt.

Voor de client kant: Inderdaad wat anderen zeggen, waarschijnlijk vergeet je te flushen.

  • tec
  • Registratie: Juni 2001
  • Laatst online: 17-12-2024
thanks!

er moest een \r\n meegestuurd worden vanuit de client...

telnet doet dit schijnbaar automagisch.

  • Marcj
  • Registratie: November 2000
  • Laatst online: 12:39
Waarom hardcoded \r\n? Dit is windows-specifiek. Je kunt dan beter of een println() uitvoeren, of printf() met een %n in de format.

  • tec
  • Registratie: Juni 2001
  • Laatst online: 17-12-2024
De client is niet in java maar in actionscript 3. Het is een AIR applicatie, voor zover ik zie kan ik niet een line sturen.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:55

Janoz

Moderator Devschuur®

!litemod

Ten eerste, telnet doet dat niet automagisch, maar gewoon wanneer je op de enter knop drukt. Daarnaast buffert telnet niks dus elk teken dat je tikt wordt ook gelijk doorgestuurd.

Ten eerste zou je ipv readline ook read kunnen gebruiken. Dan hoef je niet op een enter te wachten. Wanneer je vervolgens ook ervoor zorgt dat de client zijn buffer flushed op het moment dat hij het bericht wil versturen moet dat ook goed gaan.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Kleine ietwat offline tip:
Als het allemaal scalable moet enzo, zou je kunnen kijken naar Apache MINA
Pagina: 1