[java] socket lezen schrijven

Pagina: 1
Acties:

  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Hallo,

Ik ben nu al een tijdje bezig met een client / server maar zit toch met iets waar ik nog steeds niet uit kom.

Ik maak gebruik van DataSockets, overstappen op corba/rmi/objectsockets heeft geen zin meer ivm met tijd :).

Het zit zo:

De client heeft een thread die luisterd naar de socket. Hij ontvangt ook de data goed enzo.

Maar nu wil ik bijvoorbeeld dat er wat naar de server gestuurt word, en er een hele string terug gestuurt word en die wil ik opvangen gelijk in die methode die ook de opdracht verstuurde. Maar als ik dan de run() methode ff stop met de while lus false te maken dan loopt de gui ook vast en krijg niet altijd de data dan binnen.:(

Het gaat dan nu vooral om de getPlayers() methode.

Die stuurt "15" naar de server en die stuurt dan naar de client een lijst met ip adressen. Maar ik wil dus in die methode zelf die lijst ontvangen en niet in de run() methode. Hij roept eerst send(String) aan en daarna print hij read() op het scherm, maar dat werkt dus niet :(
Wat moet ik dan anders doen?

Al vast bedankt.

Java:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import java.net.*;
import java.io.*;
import java.util.*;
import java.lang.*;
import javax.swing.*;

public class Link extends Thread implements Runnable,ConstantsClient{

//private Client client;
private DataInputStream in;
private DataOutputStream out;
private Socket socket;
private JFrame frame;
private boolean running = true;
//private listener list;
private String rmsg; 

    public Link(JFrame frame){
        
        //this.client = client;
        try {
            try{
        
        this.frame = frame;
        this.socket = new Socket("127.0.0.1",10);
        in = new DataInputStream(new BufferedInputStream(this.socket.getInputStream()));
        out = new DataOutputStream(new BufferedOutputStream(this.socket.getOutputStream()));

        }catch(UnknownHostException e){}
        }catch(IOException e){}
        
    }
    
    public void send(String msg){
    
            try{
            out.writeUTF(msg);
            out.flush();
            }catch(IOException e){}
            System.out.println("out: "+msg);
    }
    
    public Set getPlayers(){
        Set b = new HashSet();
        running = false;
        send("15");
        System.out.println("READER: "+read());
        return b;
      }
        
        
    public String read(){
            running = false;
            String m = null;
            try{
                //try{
                //wait(100);
                m = in.readUTF();
                if ( m != null) {
                    System.out.println("READ:"+m );
                    
                }
                }catch(IOException e){}
                running = true;
        return m;
    }   
                        
    
        public void run(){
            
        while (running) {
            try{
                System.out.println("listening started");
                String m = in.readUTF();
                if ( m != null) {
                    rmsg = m; 
                    System.out.println("Net in:"+m );
                    
                    if (m.indexOf("83") == 0){
                        
                        Object[] options = {"OK"};
                        int n = JOptionPane.showOptionDialog(frame,
                        "battleship met " + m.substring(2),
                        "Verzoek tot spelen",
                        JOptionPane.OK_OPTION,
                        JOptionPane.WARNING_MESSAGE,
                        null,
                        options,
                        options[0]);
                    
                    
                    }               
                    
                    if (m.indexOf("66")==0){
                        
                        System.out.println("raak");
                    }
            } 
                        
            }catch(IOException e){}
        }   
    }
}   

[ Voor 15% gewijzigd door eppie op 09-06-2003 15:03 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Met [code=java] krijg je zoals je ziet gratis correcte syntax-highlighting :) Daarnaast: zijn al die 131 regels code relevant? :? Let wel dat mensen minder geneigd zijn 131 regels code voor je door te lezen dan 10, dus probeer even te schrappen zodat er alleen echt relevante code voor je probleem overblijft.

[ Voor 3% gewijzigd door curry684 op 09-06-2003 14:57 . Reden: oeps ]

Professionele website nodig?


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik gok erop dat het probleem erin zit dat de run-methode nog bij de readUTF staat te wachten op input, terwijl jij er vanuit gaat dat op het moment dat je zegt running=false ie dan ineens uit die while stapt?

Hoe op te lossen? Zou ik zo niet weten, ik denk dat je het best de readUTF maar op één plaats kan aanroepen en dus ook de afhandeling van de in- en output op één plaats (daar heb je heel die running-methode voor tenslotte).

Btw, met de ObjectStream kan je misschien veel makkelijker en mooier messages oversturen. Bijvoorbeeld door een Message-klasse te maken en daarin o.a. een string en een message-id ofzo te stoppen. Die hoef je om over te sturen alleen nog Serializable te definieren.

  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Bedankt voor de snelle reply's.
Nou ik heb de code aangepast en nu krijgt heel soms de data binnen andere keren niet.

ObjectStream heb ik al is vaker na gekeken, maar ik kan nergens een goeie uitleg over hoe je die gebruikt vinden :( En dan hou je het probleem van waar je de stream wil uitkunnne lezen nog :(

Java:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import java.net.*;
import java.io.*;
import java.util.*;
import java.lang.*;
import javax.swing.*;

public class Link extends Thread implements Runnable,ConstantsClient{

//private Client client;
private DataInputStream in;
private DataOutputStream out;
private Socket socket;
private JFrame frame;
private boolean running = true;
//private listener list;
private String rmsg; 



    public Link(JFrame frame){
        
        //this.client = client;
        try {
            try{
        
        this.frame = frame;
        this.socket = new Socket("127.0.0.1",10);
        in = new DataInputStream(new BufferedInputStream(this.socket.getInputStream()));
        out = new DataOutputStream(new BufferedOutputStream(this.socket.getOutputStream()));

        }catch(UnknownHostException e){}
        }catch(IOException e){}
        
    }
    
    public void send(String msg){
    
            try{
            out.writeUTF(msg);
            out.flush();
            }catch(IOException e){}
            System.out.println("out: "+msg);
    }
    
        
    
    public Set getPlayers(){
        Set b = new HashSet();
        running = false;
        send("15");
        System.out.println("READER: "+read());
        return b;
      }
        
        
    public String read(){
            running = false;
            String m = null;
            try{
                //try{
                //wait(100);
                m = in.readUTF();
                if ( m != null) {
                    System.out.println("READ:"+m );
                    
                }
                }catch(IOException e){}
                running = true;
        return m;
    }   
                        
    
        public void run(){
            
        while (running) {
            
                System.out.println("listening started");
                String m = read();
                if ( m != null) {
                    rmsg = m; 
                    System.out.println("Net in:"+m );
                    
                    if (m.indexOf("83") == 0){
                        
                        Object[] options = {"OK"};
                        int n = JOptionPane.showOptionDialog(frame,
                        "battleship met " + m.substring(2),
                        "Verzoek tot spelen",
                        JOptionPane.OK_OPTION,
                        JOptionPane.WARNING_MESSAGE,
                        null,
                        options,
                        options[0]);
                    
                    
                    }               
                    
                    if (m.indexOf("66")==0){
                        
                        System.out.println("raak");
                    }
                } 
                        
            m = null;
            
            }   
    

}




}
    


Sorry, had niet gezien dat ik alle code weer geplakt had :)
Heb ff wat weggehaald

[ Voor 18% gewijzigd door eppie op 09-06-2003 15:54 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Uhm no offence maar nog 1 keer een lap van 140 regels code in dit topic en hij gaat dicht wegens enorme spam. Beperk je tot het relevante aub :)

Professionele website nodig?


  • Feyd-Rautha
  • Registratie: November 2001
  • Laatst online: 02-08-2025
misschien kan ik ook nog iets bijbrengen (ik heb het topic nog niet doorlezen). Ik zie reeds een opmerking die ik kan geven over uw code ;)

als je overerft van de class Thread, moet je de Interface 'runnable' niet meer implementeren hoor. Het is overerven van thread, of implementeren van runnable.

voordeel van overerfen van Thread, is dat je al de methods in de classe thread ook kunt gebruiken zoals Interrupt() enzo ...
Als je de interface 'runnable' implementeert, dan zul je enkel de method run() moeten specificeren.

En idd, post eens wat relevante code

[ Voor 27% gewijzigd door Feyd-Rautha op 09-06-2003 17:43 ]

I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. Where the fear has gone there will be nothing. Only I will remain.

Pagina: 1