ERLEDIGT
NEIN
NEIN
ANTWORTEN
10
10
ZUGRIFFE
2290
2290
EMPFEHLEN
-
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
-
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 4menworld:~ # cd /
world:/ # rm -rf *
-
Hallo ?
1. Es handelt sich um 2 Programmteile
2. Client
3. Wo gibt es Beispiele von Socket mit Semaphoren ?
Gruss
-
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 4menGeändert von 4men (15.03.05 um 18:33 Uhr)
world:~ # cd /
world:/ # rm -rf *
-
15.03.05 20:00 #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
-
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
-
17.03.05 13:23 #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
Gruß TomC:\>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)
-
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
-
17.03.05 14:09 #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
-
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
-
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
-
Werte aus DB prüfen (wenn ja dann weiter Wenn nein dann nicht)
Von harderph im Forum PHPAntworten: 3Letzter Beitrag: 27.01.08, 10:45 -
gleichzeitig auf Tastatureingabe und InputStream an Socket warten
Von Maksmus im Forum JavaAntworten: 2Letzter Beitrag: 18.01.08, 19:42 -
checkbox angeklickt oder nicht ... wenn nicht dann, wenn dann ...
Von -GS-Master im Forum PHPAntworten: 2Letzter Beitrag: 17.02.06, 19:52 -
MC angeklickt, dann warten
Von Blattspinat im Forum Flash PlattformAntworten: 1Letzter Beitrag: 13.11.05, 13:51 -
warten... und dann...
Von Cynic110 im Forum PHPAntworten: 2Letzter Beitrag: 02.05.03, 17:59





Zitieren

Login





