Commit 7a495aa06fb1c48148d5c2c4b139f5a477f222d6
1 parent
bbe83807
git-svn-id: svn://imanolbarba.net/PAD@23 c2ee353e-ed0d-4329-bf56-03aec153487f
Showing
10 changed files
with
163 additions
and
24 deletions
JChatServer/bin/pad/prac2/JChat.class
No preview for this file type
JChatServer/bin/pad/prac2/MyServerSocket.class
No preview for this file type
JChatServer/bin/pad/prac2/MySocket.class
No preview for this file type
JChatServer/bin/pad/prac2/Server.class
No preview for this file type
JChatServer/bin/pad/prac2/Worker.class
No preview for this file type
JChatServer/src/pad/prac2/JChat.java
@@ -7,13 +7,22 @@ public class JChat | @@ -7,13 +7,22 @@ public class JChat | ||
7 | public static void main(String[] args) | 7 | public static void main(String[] args) |
8 | { | 8 | { |
9 | String ip; | 9 | String ip; |
10 | - int port; | 10 | + int port, roomSize; |
11 | Scanner in = new Scanner(System.in); | 11 | Scanner in = new Scanner(System.in); |
12 | System.out.print("IP: "); | 12 | System.out.print("IP: "); |
13 | ip = in.nextLine(); | 13 | ip = in.nextLine(); |
14 | System.out.print("Port: "); | 14 | System.out.print("Port: "); |
15 | port = in.nextInt(); | 15 | port = in.nextInt(); |
16 | + System.out.print("Size of chatroom: "); | ||
17 | + roomSize = in.nextInt(); | ||
16 | in.close(); | 18 | in.close(); |
17 | - Server serv = new Server(ip,port); | 19 | + Server serv = new Server(ip,port,roomSize); |
20 | + serv.startServer(); | ||
18 | } | 21 | } |
22 | + /* | ||
23 | + * TODO | ||
24 | + * | ||
25 | + * capture SIGINT | ||
26 | + * | ||
27 | + */ | ||
19 | } | 28 | } |
JChatServer/src/pad/prac2/MyServerSocket.java
1 | package pad.prac2; | 1 | package pad.prac2; |
2 | 2 | ||
3 | -import java.io.BufferedReader; | ||
4 | import java.io.IOException; | 3 | import java.io.IOException; |
5 | -import java.io.PrintWriter; | ||
6 | import java.net.InetSocketAddress; | 4 | import java.net.InetSocketAddress; |
7 | import java.net.ServerSocket; | 5 | import java.net.ServerSocket; |
8 | import java.net.SocketAddress; | 6 | import java.net.SocketAddress; |
9 | 7 | ||
10 | public class MyServerSocket extends ServerSocket | 8 | public class MyServerSocket extends ServerSocket |
11 | { | 9 | { |
12 | - private PrintWriter output; | ||
13 | - private BufferedReader input; | ||
14 | - | ||
15 | - public MyServerSocket(PrintWriter o, BufferedReader i) throws IOException | 10 | + public MyServerSocket() throws IOException |
16 | { | 11 | { |
17 | super(); | 12 | super(); |
18 | - output = o; | ||
19 | - input = i; | ||
20 | } | 13 | } |
21 | 14 | ||
22 | public MySocket accept() | 15 | public MySocket accept() |
23 | { | 16 | { |
24 | - MySocket incoming = accept(); | ||
25 | - return incoming; | 17 | + try |
18 | + { | ||
19 | + MySocket incoming = (MySocket)super.accept(); | ||
20 | + return incoming; | ||
21 | + } | ||
22 | + catch(IOException ioExc) | ||
23 | + { | ||
24 | + System.out.println("TCP: Error accepting connection"); | ||
25 | + return null; | ||
26 | + } | ||
26 | } | 27 | } |
27 | 28 | ||
28 | public void bind(String ip, int port) | 29 | public void bind(String ip, int port) |
JChatServer/src/pad/prac2/MySocket.java
@@ -70,7 +70,20 @@ public class MySocket extends Socket | @@ -70,7 +70,20 @@ public class MySocket extends Socket | ||
70 | catch(IOException ioExc) | 70 | catch(IOException ioExc) |
71 | { | 71 | { |
72 | System.out.println("TCP: Error retrieving data from remote endpoint"); | 72 | System.out.println("TCP: Error retrieving data from remote endpoint"); |
73 | - return ""; | 73 | + return null; |
74 | + } | ||
75 | + } | ||
76 | + | ||
77 | + public String readLine() | ||
78 | + { | ||
79 | + try | ||
80 | + { | ||
81 | + return input.readLine(); | ||
82 | + } | ||
83 | + catch(IOException ioExc) | ||
84 | + { | ||
85 | + System.out.println("TCP: Error retrieving data from remote endpoint"); | ||
86 | + return null; | ||
74 | } | 87 | } |
75 | } | 88 | } |
76 | 89 |
JChatServer/src/pad/prac2/Server.java
@@ -4,21 +4,73 @@ import java.io.BufferedReader; | @@ -4,21 +4,73 @@ import java.io.BufferedReader; | ||
4 | import java.io.IOException; | 4 | import java.io.IOException; |
5 | import java.io.InputStreamReader; | 5 | import java.io.InputStreamReader; |
6 | import java.io.PrintWriter; | 6 | import java.io.PrintWriter; |
7 | +import java.util.Collection; | ||
8 | +import java.util.Iterator; | ||
9 | +import java.util.concurrent.ConcurrentHashMap; | ||
7 | 10 | ||
8 | public class Server | 11 | public class Server |
9 | { | 12 | { |
10 | private MyServerSocket ss; | 13 | private MyServerSocket ss; |
14 | + private BufferedReader stdin; | ||
15 | + private PrintWriter stdout; | ||
16 | + private int roomSize; | ||
17 | + private boolean run; | ||
11 | 18 | ||
12 | - public Server(String ip, int port) | 19 | + private Worker[] rWorkerPool; |
20 | + private Worker[] wWorkerPool; | ||
21 | + | ||
22 | + private ConcurrentHashMap<String,MySocket> activeConnections; | ||
23 | + | ||
24 | + public Server(String ip, int port, int rS) | ||
13 | { | 25 | { |
14 | try | 26 | try |
15 | { | 27 | { |
16 | - ss = new MyServerSocket(new PrintWriter(System.out),new BufferedReader(new InputStreamReader(System.in))); | 28 | + ss = new MyServerSocket(); |
29 | + stdout = new PrintWriter(System.out); | ||
30 | + stdin = new BufferedReader(new InputStreamReader(System.in)); | ||
31 | + roomSize = rS; | ||
32 | + rWorkerPool = new Worker[roomSize]; | ||
33 | + wWorkerPool = new Worker[roomSize]; | ||
17 | } | 34 | } |
18 | catch(IOException ioExc) | 35 | catch(IOException ioExc) |
19 | { | 36 | { |
20 | System.out.println("TCP: Error initializating server socket"); | 37 | System.out.println("TCP: Error initializating server socket"); |
21 | } | 38 | } |
22 | } | 39 | } |
23 | - | 40 | + |
41 | + public void startServer() | ||
42 | + { | ||
43 | + | ||
44 | + } | ||
45 | + | ||
46 | + public void startWorker(Worker r, Worker w, MySocket s) | ||
47 | + { | ||
48 | + if(r == null) | ||
49 | + { | ||
50 | + r = new Worker(s,null,stdout); | ||
51 | + } | ||
52 | + r.awake(); | ||
53 | + if(w == null) | ||
54 | + { | ||
55 | + w = new Worker(s,stdin,null); | ||
56 | + } | ||
57 | + w.awake(); | ||
58 | + } | ||
59 | + | ||
60 | + public void finishWorkers() | ||
61 | + { | ||
62 | + Collection<Worker> worerke= activeConnections.values(); | ||
63 | + Iterator<MySocket> it = sockets.iterator(); | ||
64 | + while(it.hasNext()) | ||
65 | + { | ||
66 | + it.next().close(); | ||
67 | + } | ||
68 | + } | ||
69 | + | ||
70 | + public void killServer() | ||
71 | + { | ||
72 | + run = false; | ||
73 | + ss.close(); | ||
74 | + finishWorkers(); | ||
75 | + } | ||
24 | } | 76 | } |
JChatServer/src/pad/prac2/Worker.java
1 | package pad.prac2; | 1 | package pad.prac2; |
2 | 2 | ||
3 | import java.io.BufferedReader; | 3 | import java.io.BufferedReader; |
4 | +import java.io.IOException; | ||
4 | import java.io.PrintWriter; | 5 | import java.io.PrintWriter; |
5 | 6 | ||
6 | public class Worker extends Thread | 7 | public class Worker extends Thread |
@@ -8,24 +9,87 @@ public class Worker extends Thread | @@ -8,24 +9,87 @@ public class Worker extends Thread | ||
8 | private PrintWriter output; | 9 | private PrintWriter output; |
9 | private BufferedReader input; | 10 | private BufferedReader input; |
10 | private MySocket sock; | 11 | private MySocket sock; |
12 | + private boolean run; | ||
13 | + private boolean kill; | ||
14 | + private boolean sleep; | ||
15 | + private Server serv; | ||
11 | 16 | ||
12 | - public Worker(MySocket s, PrintWriter o, BufferedReader i) | 17 | + public Worker(Server srv, MySocket s, BufferedReader i, PrintWriter o) |
13 | { | 18 | { |
14 | sock = s; | 19 | sock = s; |
15 | output = o; | 20 | output = o; |
16 | input = i; | 21 | input = i; |
22 | + run = false; | ||
23 | + kill = false; | ||
24 | + sleep = true; | ||
25 | + serv = srv; | ||
26 | + } | ||
27 | + | ||
28 | + public void finish() | ||
29 | + { | ||
30 | + kill = true; | ||
31 | + run = false; | ||
32 | + sleep = false; | ||
33 | + sock.close(); | ||
17 | } | 34 | } |
18 | 35 | ||
19 | public void run() | 36 | public void run() |
20 | { | 37 | { |
21 | - if(output == null) | ||
22 | - { | ||
23 | - | ||
24 | - } | ||
25 | - else if(input == null) | 38 | + while(!kill) |
26 | { | 39 | { |
27 | - | 40 | + while(sleep) |
41 | + { | ||
42 | + try | ||
43 | + { | ||
44 | + wait(); | ||
45 | + } | ||
46 | + catch (InterruptedException e) | ||
47 | + { | ||
48 | + e.printStackTrace(); | ||
49 | + } | ||
50 | + } | ||
51 | + while(run) | ||
52 | + { | ||
53 | + if(output == null && input != null) | ||
54 | + { | ||
55 | + String str, length; | ||
56 | + while(true) | ||
57 | + { | ||
58 | + try | ||
59 | + { | ||
60 | + str = input.readLine(); | ||
61 | + length = new Integer(str.length()).toString(); | ||
62 | + sock.write(length, length.length()); | ||
63 | + sock.write(str, str.length()); | ||
64 | + } | ||
65 | + catch(IOException ioExc) | ||
66 | + { | ||
67 | + run = false; | ||
68 | + sleep = true; | ||
69 | + break; | ||
70 | + } | ||
71 | + } | ||
72 | + } | ||
73 | + else if(input == null && output != null) | ||
74 | + { | ||
75 | + String len, str; | ||
76 | + while((len = sock.readLine()) != null) | ||
77 | + { | ||
78 | + int length = Integer.parseInt(len); | ||
79 | + str = sock.read(length); | ||
80 | + output.println(str); | ||
81 | + } | ||
82 | + run = false; | ||
83 | + sleep = true; | ||
84 | + } | ||
85 | + } | ||
28 | } | 86 | } |
29 | } | 87 | } |
30 | - | 88 | + |
89 | + public void awake() | ||
90 | + { | ||
91 | + run = true; | ||
92 | + sleep = false; | ||
93 | + this.notify(); | ||
94 | + } | ||
31 | } | 95 | } |