View difference between Paste ID: k1D46cV7 and F6GS3Vpk
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
}