tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
2290
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    knopper knopper ist offline Mitglied Bronze
    Registriert seit
    Oct 2004
    Beiträge
    35
    Hallo,

    Ich habe einProzess A, welches ein Socket ständig <100 ms oeffnet,lesen und schreiben.

    Nun kommt ein Prozess B, welches auch dieses Socket öffnen will.
    Wie kann ich der Prozess B steuern, dass er wartet bis das Socket wieder frei ist,
    Muss man mit Thread arbeiten oder geht es irgendwie mit einer For Schleife ?

    Gruss
     

  2. #2
    4men 4men ist offline Mitglied Silber
    Registriert seit
    Oct 2004
    Beiträge
    64
    Hi

    Könntest du mir bitte noch diese Fragen beantworten?

    1. Handelt es sich um 2 Programme oder um zwei Programmteile die das Socket nutzen sollen?
    2. Soll das Programm als Server oder Client fungieren?
    3. Was stellst du dir konkret vor wie das am Ende funktionieren soll?

    mfg 4men
     
    world:~ # cd /
    world:/ # rm -rf *

  3. #3
    knopper knopper ist offline Mitglied Bronze
    Registriert seit
    Oct 2004
    Beiträge
    35
    Hallo ?

    1. Es handelt sich um 2 Programmteile

    2. Client

    3. Wo gibt es Beispiele von Socket mit Semaphoren ?
    Gruss
     

  4. #4
    4men 4men ist offline Mitglied Silber
    Registriert seit
    Oct 2004
    Beiträge
    64
    Du Legst eine Klasse an die dein Socket initialiesiet und dir die Methoden für Lesen, Schreiben, Öffnen und Schließen bereitstellt. Des weiteren muss ein boolean her mit passender get und set Methode welcher angibt ob das Socket benutzt wird.

    Als nächstes legst du die Threads an. Die Prozesse bekommen immer wieder mal etwas Zeit zugeteil und in dieser schauen sie nun ob das Socket frei ist. Wenn das der Fall ist belegen sie es. Wenn sie schließlich fertig sind geben sie das Socket wieder frei und werden terminiert.

    Wenn du es jetzt so realiesren willst das ein bestimmter Ablauf eingehalten wird dann musst du das ganze noch um einen Zähler erweitern d.h. der Prozess bekommt das Socket nur wenn er auch die richtige Position in der Reihe hat. Die Position bekommen sie bei der Initialiesierung gesetzt.

    Sollen die Prozesse endlos laufen und die Anzahl ist bekannt kannst du einen Reset einbauen welcher beim erreichen der letzen Position den Zähler zurücksetzt. Ist die Anzahl unbekannt kannst du das nur durch die Zeit wo du sie schlafen legst Regeln.

    mfg 4men
    Geändert von 4men (15.03.05 um 18:33 Uhr)
     
    world:~ # cd /
    world:/ # rm -rf *

  5. #5
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Schau doch mal hier:
    (Java 5)
    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
    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
    116
    117
    
    /**
     * 
     */
    package de.tutorials;
     
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.Semaphore;
     
    /**
     * @author Administrator
     * 
     */
    public class SocketSynchronizer {
     
        private Socket socket;
     
        private Semaphore semaphore = new Semaphore(1);
     
        private BufferedWriter bw;
     
        /**
         * @param args
         */
        public static void main(String[] args) throws Exception {
            new SocketSynchronizer().start();
        }
     
        private void start() throws Exception {
     
            Runtime.getRuntime().addShutdownHook(new Thread() {
                public void run() {
                    System.out.println("Shuting down...");
                    try {
                        if (bw != null) {
                            bw.close();
                        }
                        if (socket != null) {
                            socket.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
     
            startServer(7777);
            initSocket("localhost", 7777);
     
            startClient("A");
            startClient("B");
            startClient("C");
     
        }
     
        private void startClient(String name) {
            new Thread(name) {
                public void run() {
                    while (true) {
                        try {
                            semaphore.acquire();
     
                            bw.write(this.getName());
                            bw.newLine();
     
                            bw.flush();
                            sleep(1000L + (long) (1000L * Math.random()));
     
                            semaphore.release();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
        }
     
        private void initSocket(String hostname, int port) throws Exception {
            socket = new Socket(hostname, port);
            bw = new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream()));
        }
     
        private void startServer(final int port) {
            new Thread() {
                public void run() {
                    try {
                        System.out.println("starting server @ " + port);
                        ServerSocket ss = new ServerSocket(port);
                        socket = ss.accept();
     
                        System.out.println("connected");
     
                        BufferedReader br = new BufferedReader(
                                new InputStreamReader(socket.getInputStream()));
     
                        String line = null;
                        while ((line = br.readLine()) != null) {
                            System.out.print("received: ");
                            System.out.println(line);
                        }
     
                        br.close();
     
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
     
    }

    Gruß Tom
     

  6. #6
    knopper knopper ist offline Mitglied Bronze
    Registriert seit
    Oct 2004
    Beiträge
    35
    Hi,
    Danke für die Ratschläge !

    Ich bekomme die Fehlermeldung :

    SocketSynchronizer.java:9: package java.util.concurrent does not exist

    Welche Java Version ist das ?

    Gruss
     

  7. #7
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Wie ich schon schrieb verwende ich Java 5 genauer gesagt
    C:\>java -version
    java version "1.5.0_02"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_02-b09)
    Java HotSpot(TM) Client VM (build 1.5.0_02-b09, mixed mode, sharing)
    Gruß Tom
     

  8. #8
    knopper knopper ist offline Mitglied Bronze
    Registriert seit
    Oct 2004
    Beiträge
    35
    Danke Thomas,

    Ich habe bis jetzt noch nicht mit Semaphoren programmiert. Für Java 1.4 muss ich selber eine Semaphore Klasse definieren oder ?

    Gruss
     

  9. #9
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Nicht unbedingt ... das in Java 5 concurrent package basiert auf der Conncurent Library von Doug Lea...
    http://gee.cs.oswego.edu/dl/classes/...ent/intro.html

    Damit kannst du also "genauso" unter 1.4 entwickelen wie mit dem concurrent Package unter Java 5.

    Gruß Tom
     

  10. #10
    knopper knopper ist offline Mitglied Bronze
    Registriert seit
    Oct 2004
    Beiträge
    35
    Es scheint zu funktionieren.
    Ich habe den Code ein bisschen umgeschrieben:
    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
    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
    
    import java.io.BufferedReader;
      import java.io.BufferedWriter;
      import java.io.IOException;
      import java.io.InputStreamReader;
      
      import java.io.BufferedInputStream;
      import java.io.InputStream;
      import java.io.OutputStream;
      import java.io.OutputStreamWriter;
      
      
      import java.net.ServerSocket;
      import java.net.Socket;
      import java.util.concurrent.Semaphore;
      
      /**
       * @author Administrator
       *
       */
      public class SocketSynchronizer {
      
        private Socket socket;
      
        private Semaphore semaphore = new Semaphore(1);
      
        private BufferedWriter bw;
        
            private OutputStreamWriter sockout = null;
            
            private BufferedInputStream sockin = null;
      
        /**
         * @param args
         */
        public static void main(String[] args) throws Exception {
            new SocketSynchronizer().start();
        }
      
        private void start() throws Exception {
      
            Runtime.getRuntime().addShutdownHook(new Thread() {
                public void run() {
                    System.out.println("Shuting down...");
                    try {
                        if (bw != null) {
                            bw.close();
                        }
                        if (socket != null) {
                         socket.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
      
            initSocket("localhost", 7777);
      
            System.out.println(startClient("command1"));
            System.out.println(startClient("command2"));
      
      
        }
      
        private void startClient(String name) {
      
                    new Thread(name) {
                public void run() {
                    while (true) {
                        try {
                         semaphore.acquire();
      
                                                     try {
                                                         sockout.write(this.getName());
                                                         sockout.flush();
                                                     }
                                                     catch (Exception e) {
                                                         e.printStackTrace();
                                                     }
                                                         String str = "";
                                                         try {
                                                         byte[] bline = new byte[6048];
                                                         sockin.read(bline);
                                                         str = new String(bline);
                                                     }
                                                     catch (Exception e) {
                                                         e.printStackTrace();
                                                     }
      
                                            sleep(1000L + (long) (1000L * Math.random()));
      
                         semaphore.release();
                        } catch (Exception e) {
                         e.printStackTrace();
                        }
                    }
                }
            }.start();
        }
      
        private void initSocket(String hostname, int port) throws Exception {
            socket = new Socket(hostname, port);
        //  bw = new BufferedWriter(
        //          new OutputStreamWriter(socket.getOutputStream()));
      
            InputStream ISsockin = socket.getInputStream();
              OutputStream OSsockout = socket.getOutputStream();
      
              sockin = new BufferedInputStream(ISsockin);
      
              sockout = new OutputStreamWriter(OSsockout);
        }
      
      }

    Nun wie kann ich str als Ruckgabewert zurückliefern ?

    Gruss
     

  11. #11
    knopper knopper ist offline Mitglied Bronze
    Registriert seit
    Oct 2004
    Beiträge
    35
    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
    
        private void startClient(String name) {
            String str = "";
            new Thread(name) {
                String str = "";
                public void run() {
                    while (true) {
                        try {
                            semaphore.acquire();
                            try {
                        sockout.write(this.getName());
                        sockout.flush();
                        } catch (Exception e) {
                        e.printStackTrace();
                            }
                        String str = "";
                            try {
                        byte[] bline = new byte[6048];
                        sockin.read(bline);
                        str = new String(bline); // soll sofort wieder geben
                        } catch (Exception e) {
                        e.printStackTrace();
                            }
      
                        sleep(1000L + (long) (1000L * Math.random()));
      
                            semaphore.release();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
        }

    Was ich machen wollte ist die Methode startClient mit einem String als Rückgabewert(new String(bline) umzuschreiben.
    Der Thread ist aber eine eigene Klasse. Wie kann ich dieses Problem umgehen.

    System.out.println(startClient("socket_command"));

    gruss
     

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 27.01.08, 10:45
  2. Antworten: 2
    Letzter Beitrag: 18.01.08, 19:42
  3. Antworten: 2
    Letzter Beitrag: 17.02.06, 19:52
  4. MC angeklickt, dann warten
    Von Blattspinat im Forum Flash Plattform
    Antworten: 1
    Letzter Beitrag: 13.11.05, 13:51
  5. warten... und dann...
    Von Cynic110 im Forum PHP
    Antworten: 2
    Letzter Beitrag: 02.05.03, 17:59