Java Socket分发服务负载均衡

Posted yanxinyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Socket分发服务负载均衡相关的知识,希望对你有一定的参考价值。

 

技术图片

技术图片
  1 1、 设备请求分发服务器,分发服务器返回有效的socket服务器ip与port,然后断开连接。
  2 a) 设备与服务器建立连接。
  3 b) 服务器接收到连接请求后,立即将分配好的socket服务器ip与port信息响应给设备。
  4 c) 服务器主动断开socket连接。
  5 2、 设备得到ip与port以后,设备去连接socket服务器,然后与其进行协议通讯。
  6 a) 设备连接到socket服务器。
  7 b) socket服务器响应连接成功响应信息。
  8 c) 设备与socket服务器保持长链接通讯。
  9 
 10 *. 若设备未收到连接成功响应则再次尝试连接,若三次请求依旧没有成功建立连接,那么设备需要去请求分发服务器然后再重新上述操作。
 11 *. 当设备在异常情况下链接不上socket服务器时,依旧尝试三次若不能成功,则直接请求分发服务器,然后再重复上述操作。
 12 
 13 分发服务器代码:
 14 分发服务与客户端是短链接:
 15 package com.easygo.server;
 16 
 17 import java.io.IOException;
 18 import java.net.ServerSocket;
 19 import java.net.Socket;
 20 import java.util.concurrent.ExecutorService;
 21 import java.util.concurrent.Executors;
 22 
 23 public class CenterServer implements Runnable{
 24     ServerSocket serverSocket=null;
 25     static volatile String server_ip="127.0.0.1";
 26     static volatile int serverport1=8085;
 27     static volatile int serverport2=8086;
 28     public static void main(String[] args) {
 29         new Thread(new CenterServer()).start();
 30         
 31     }
 32 
 33     @Override
 34     public void run() {
 35          ExecutorService cachedThreadPool = null;//线程池
 36             cachedThreadPool = Executors.newCachedThreadPool();//线程池
 37             try {
 38                 serverSocket=new ServerSocket(9999);
 39             } catch (IOException e1) {
 40                 // TODO Auto-generated catch block
 41                 e1.printStackTrace();
 42             }
 43         while(true){
 44             try {
 45                 
 46                 cachedThreadPool.execute(new ServerRun(serverSocket.accept()));
 47                 System.out.println("有一个客户端连进来了..");
 48             } catch (IOException e) {
 49                 // TODO Auto-generated catch block
 50                 e.printStackTrace();
 51             }
 52             
 53         }
 54     }
 55 
 56     
 57     
 58 }
 59 class ServerRun implements Runnable{
 60     Socket socket=null;
 61     ServerRun(Socket socket){
 62         this.socket=socket;
 63         
 64     }
 65     @Override
 66     public void run() {
 67         
 68         receive();
 69         
 70         
 71     }
 72     public void send(String message){
 73         try {
 74             socket.getOutputStream().write(message.getBytes());
 75             socket.getOutputStream().flush();
 76         } catch (IOException e) {
 77             // TODO Auto-generated catch block
 78             e.printStackTrace();
 79         }
 80         
 81         
 82     }
 83     public void receive(){
 84         
 85         byte[]tmp=null;
 86         String message=null;
 87         
 88         boolean runs=true;
 89         while(runs){
 90             if(null!=socket){
 91                 tmp=new byte[30];
 92                 
 93                 @SuppressWarnings("unused")
 94                 int count =0;
 95                 try {
 96                     while((count=socket.getInputStream().read(tmp))!=-1){
 97                         message=new String(tmp);
 98                         System.out.println("Clent:"+message.trim());
 99                         if(message.trim().split(",")[0].equals("login")&&message.trim().split(",")[1].equals("1")){
100                             
101                             send("login,"+CenterServer.server_ip+","+CenterServer.serverport1);
102                         }else if(message.trim().split(",")[0].equals("login")&&message.trim().split(",")[1].equals("2")){
103                             
104                             send("login,"+CenterServer.server_ip+","+CenterServer.serverport2);
105                         }else if(message.equals("0")){
106                             if(socket!=null){
107                                 socket.close();
108                                 
109                             }
110                             
111                             
112                         }
113                         if(socket.isClosed()){
114                             runs=false;
115                         }
116                         tmp=null;
117                         message=null;
118                         tmp=new byte[30];
119                     }
120                     
121                     
122                 } catch (IOException e) {
123                     
124                 }
125                 
126             }
127             
128             
129         }
130     }
131     
132 }
133 
134 
135 
136 客户端代码案例:
137 
138 package com.easygo.server;
139 
140 
141 import java.io.IOException;
142 import java.net.Socket;
143 
144 
145 public class Client implements Runnable{
146     Socket socket=null;
147     final int CENTER_SERVER_PORT=9999;//分发服务器端口
148     final String CENTER_SERVER_IP="127.0.0.1";
149      int CENTER_SERVER_PORTS;
150      String CENTER_SERVER_IPS;
151     boolean conn=false;
152     volatile boolean receive;
153 public static void main(String[] args) {
154     new Thread(new Client()).start();
155 }
156 
157 @Override
158 public void run() {
159     try {
160         connection();
161     } catch (Exception e) {
162         // TODO Auto-generated catch block
163         e.printStackTrace();
164     }
165     
166     
167 }
168 
169 public void connection() throws Exception{
170     
171     while(true){
172         if(null==socket&&conn==false){//登入分发服务器
173             socket=new Socket(CENTER_SERVER_IP, CENTER_SERVER_PORT);
174             receive=true;
175             
176             send("login,1");//login,登入分发服务器,1指定登入服务
177                     
178             
179             new Thread(){
180                 public void run(){
181                     try {
182                         receiveX();
183                     } catch (IOException e) {
184                         // TODO Auto-generated catch block
185                         e.printStackTrace();
186                     }
187                     
188                 }
189                 
190             }.start();
191         }else if(null==socket&&conn==true){//登入指定服务
192             socket=new Socket(CENTER_SERVER_IPS, CENTER_SERVER_PORTS);
193             receive=true;
194             new Thread(){
195                 @Override
196                 public void run(){
197                     while(true){
198                         send("message,我是客户端");
199                         
200                         try {
201                             Thread.sleep(1000);
202                         } catch (InterruptedException e) {
203                             // TODO Auto-generated catch block
204                             e.printStackTrace();
205                         }
206                     }
207                     
208                     
209                 }
210                 
211             }.start();
212             new Thread(){
213                 public void run(){
214                     try {
215                         receiveX();
216                     } catch (IOException e) {
217                         // TODO Auto-generated catch block
218                         e.printStackTrace();
219                     }
220                     
221                 }
222                 
223             }.start();
224         }
225         
226         Thread.sleep(1000);
227         
228     }
229 }
230 
231 public void send(String message){
232     System.out.println("send:"+message);
233     try {
234         socket.getOutputStream().write(message.getBytes());
235         socket.getOutputStream().flush();
236     } catch (IOException e) {
237     
238     }
239     
240 }
241 
242 public void receiveX() throws IOException{
243     byte[]tmp=null;
244     String messaage=null;
245     while(receive){
246         if(null!=socket){
247             tmp=new byte[50];
248             @SuppressWarnings("unused")
249             int count=0;
250             while((count=socket.getInputStream().read(tmp))!=-1){
251                 messaage=new String(tmp);
252                 System.out.println("result:"+messaage);
253                 if(messaage.trim().contains("login")){
254                     String[]arr=messaage.trim().split(",");
255                     System.out.println(":"+arr[1]+":"+arr[2]);
256                     CENTER_SERVER_IPS=arr[1];
257                     CENTER_SERVER_PORTS=Integer.parseInt(arr[2]);
258                     
259                     
260                     conn=true;
261                     //send("0");
262                     closeXX();//获取到对应服务ip和端口后断开连接
263                     receive=false;//
264                     
265                     
266                 }else if(messaage.trim().contains("message")){
267                     send(messaage);
268                     
269                 }
270                 tmp=null;
271                 tmp=new byte[50];
272             }
273             
274             
275             
276             
277         }
278         tmp=null;
279         messaage=null;
280     }
281     
282 }
283 public void closeXX(){
284     if(this.socket!=null){
285         try {
286             socket.close();
287             socket=null;
288         } catch (IOException e) {
289             // TODO Auto-generated catch block
290             e.printStackTrace();
291         }
292         
293     }
294 }
295 }
296 
297 
298 指定登入处理客户端服务代码
299 package com.easygo.server;
300 
301 import java.io.IOException;
302 import java.net.ServerSocket;
303 import java.net.Socket;
304 import java.util.concurrent.ExecutorService;
305 import java.util.concurrent.Executors;
306 
307 public class Server implements Runnable{
308     volatile int port=8086;
309     ServerSocket serverSocket=null;
310     public static void main(String[] args) {
311         new Thread(new Server()).start();
312     }
313 
314     @Override
315     public void run() {
316         int count=0;
317         try {
318             serverSocket=new ServerSocket(port);
319             ExecutorService cachedThreadPool = null;//线程池
320             cachedThreadPool = Executors.newCachedThreadPool();//线程池
321             
322             while(true){
323                 cachedThreadPool.execute(new ServerRunS(serverSocket.accept()));
324                 System.out.println("a client conn:"+count++);
325                 
326             }
327         } catch (IOException e) {
328             // TODO Auto-generated catch block
329             e.printStackTrace();
330         }
331         
332     }
333 
334 }
335 class ServerRunS implements Runnable{
336     Socket socket=null;
337     ServerRunS(Socket socket){
338         
339         this.socket=socket;
340     }
341     @Override
342     public void run() {
343         byte[]tmp=null;
344         
345         while(true){
346             
347             if(socket!=null){
348                 tmp=new byte[30];
349                 @SuppressWarnings("unused")
350                 int count=0;
351                 try {
352                     while((count=socket.getInputStream().read(tmp))!=-1){
353                     System.out.println("客户端发来的消息:"+new String(tmp));
354                         
355                     }
356                 } catch (IOException e) {
357                     // TODO Auto-generated catch block
358                     e.printStackTrace();
359                 }
360                 
361             }
362             tmp=null;
363         }
364     }
365     
366     
367     
368 }
369 
370 流程:
371 1启动server
372 2启动CenterServer服务
373 3启动客户端一,参数(login,1)
374 4启动客户端二,参数(login,2)
375 
376 运行结果:
377 客户端1
378 send:login,1
379 result:login,127.0.0.1,8085
380 send:message,我是客户端
381 send:message,我是客户端
382 send:message,我是客户端
383 send:message,我是客户端
384 send:message,我是客户端
385 send:message,我是客户端
386 
387 客户端2
388 send:login,2
389 result:login,127.0.0.1,8086
390 send:message,我是客户端
391 send:message,我是客户端
392 send:message,我是客户端
393 send:message,我是客户端
394 send:message,我是客户端
395 send:message,我是客户端
396 
397 分发服务器:
398 有一个客户端连进来了
399 UUlogin,2
400 有一个客户端连进来了
401 UUlogin,1
402 
403 服务器1(8085端口)
404 8085
405 客户端发来的消息:message,我是客户端
406 客户端发来的消息:message,我是客户端
407 .
408 .
409 .
410 服务器1(8086端口)
411 8086
412 客户端发来的消息:message,我是客户端
413 客户端发来的消息:message,我是客户端
414 .
415 .
416 .
技术图片

 

原文地址

https://www.cnblogs.com/mature1021/articles/9455951.html

以上是关于Java Socket分发服务负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

负载均衡,分布式,集群的理解,多台服务器代码如何同步

负载均衡概述及优缺点对比

负载均衡

全局负载均衡(GSLB)和内容分发网络(CDN)原理及实战

四Nginx负载均衡实例

运维必学:全局负载均衡与CDN内容分发