SHOW:
|
|
- or go back to the newest paste.
1 | /** | |
2 | * Brogaming server | |
3 | * http://brogaming.ru | |
4 | */ | |
5 | ||
6 | import java.io.*; | |
7 | import java.lang.reflect.InvocationTargetException; | |
8 | import java.net.*; | |
9 | import java.security.MessageDigest; | |
10 | import java.util.Properties; | |
11 | ||
12 | public class BrogamingServer extends Thread{ | |
13 | ||
14 | Socket s; | |
15 | int num; | |
16 | ||
17 | public BrogamingServer(int num, Socket s) { | |
18 | // copy data | |
19 | this.num = num; | |
20 | this.s = s; | |
21 | ||
22 | // and run new stream (look function run()) | |
23 | setDaemon(true); | |
24 | setPriority(NORM_PRIORITY); | |
25 | start(); | |
26 | } | |
27 | ||
28 | public static void main(String args[]) { | |
29 | try { | |
30 | int i = 0; // счетчик подключений | |
31 | ||
32 | // create socket on 3128 port | |
33 | ServerSocket server = new ServerSocket(3128);//, 0, InetAddress.getByName("192.168.1.9")); | |
34 | ||
35 | System.out.println("server is started"); | |
36 | ||
37 | // listening port | |
38 | while(true) { | |
39 | new BrogamingServer(i, server.accept()); | |
40 | i++; | |
41 | } | |
42 | }catch(Exception e){System.out.println("init error: " + e);} | |
43 | } | |
44 | ||
45 | ||
46 | ||
47 | public void run() { | |
48 | try { | |
49 | Thread t = new Thread(new Runnable() { | |
50 | @Override | |
51 | public void run() { | |
52 | System.out.println("client connected"); | |
53 | RecieveDataFromClient(); | |
54 | } | |
55 | }); | |
56 | t.setDaemon(true); | |
57 | t.start(); | |
58 | }catch(Exception e){System.out.println("init error: " + e);} | |
59 | } | |
60 | ||
61 | private void RecieveDataFromClient() { | |
62 | try { | |
63 | InputStream is = s.getInputStream(); | |
64 | OutputStream os = s.getOutputStream(); | |
65 | ||
66 | startConnection(is, os); | |
67 | ||
68 | while(s.isConnected()) | |
69 | { | |
70 | ||
71 | ||
72 | byte buf[] = new byte[64*1024]; | |
73 | int r = is.read(buf); | |
74 | ||
75 | if (buf.length == 0 || r == 0) | |
76 | { | |
77 | os.write(new String("Buffer is empty").getBytes()); | |
78 | continue; | |
79 | } | |
80 | ||
81 | // create String with received data from client | |
82 | String data = new String(buf, 0, r); //"UTF-8"); | |
83 | ||
84 | if (data == null || data.isEmpty()) | |
85 | { | |
86 | os.write(new String("Recieved data is empty").getBytes()); | |
87 | continue; | |
88 | } | |
89 | System.out.println("Recieved Data: " + data); | |
90 | os.write(new String("pong").getBytes()); | |
91 | os.flush(); | |
92 | } | |
93 | } | |
94 | catch(Exception e) {System.out.println("RecieveDataFromClient: " + e);} | |
95 | } | |
96 | ||
97 | private void startConnection(InputStream is, OutputStream os) { | |
98 | try { | |
99 | String ss; | |
100 | readLine(is); // first line, ignore it for now | |
101 | Properties props = new Properties(); | |
102 | while((ss=readLine(is))!=null && !ss.equals("")) | |
103 | { | |
104 | String[] q = ss.split(": "); | |
105 | props.put(q[0], q[1]); | |
106 | } | |
107 | String key = (String) props.get("Sec-WebSocket-Key"); | |
108 | String r = key + "" + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; // append "magic" key to it | |
109 | ||
110 | MessageDigest md = MessageDigest.getInstance("SHA-1"); | |
111 | md.update(r.getBytes("iso-8859-1"), 0, r.length()); | |
112 | byte[] sha1hash = md.digest(); | |
113 | ||
114 | String returnBase = base64(sha1hash); | |
115 | ||
116 | String ret = "HTTP/1.1 101 Switching Protocols\r\n"; | |
117 | ret+="Upgrade: websocket\r\n"; | |
118 | ret+="Connection: Upgrade\r\n"; | |
119 | ret+="Sec-WebSocket-Accept: "+returnBase+"\r\n"; | |
120 | ret+="\r\n"; | |
121 | os.write(ret.getBytes()); | |
122 | os.flush(); | |
123 | }catch(Exception e){System.out.println("start connection error: " + e);} | |
124 | ||
125 | } | |
126 | ||
127 | private String base64(byte[] input) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException | |
128 | { | |
129 | Class<?> c = Class.forName("sun.misc.BASE64Encoder"); | |
130 | java.lang.reflect.Method m = c.getMethod("encode", new Class<?>[]{byte[].class}); | |
131 | String s = (String) m.invoke(c.newInstance(), input); | |
132 | return s; | |
133 | } | |
134 | ||
135 | private String readLine(InputStream in) { | |
136 | try { | |
137 | String line = ""; | |
138 | int pread; | |
139 | int read = 0; | |
140 | while(true) | |
141 | { | |
142 | pread = read; | |
143 | read = in.read(); | |
144 | if(read!=13&&read!=10) | |
145 | line += (char) read; | |
146 | if(pread==13&&read==10) break; | |
147 | } | |
148 | return line; | |
149 | }catch(IOException ex){} | |
150 | return null; | |
151 | } | |
152 | ||
153 | } |