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     @Override34     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 block41                 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 block50                 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     @Override66     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 block78             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/p/9493184.html

Java Socket分发服务负载均衡相关推荐

  1. java socket负载均衡_Java Socket分发服务负载均衡

    1 1. 设备请求分发服务器,分发服务器返回有效的socket服务器ip与port,然后断开连接.2 a) 设备与服务器建立连接.3 b) 服务器接收到连接请求后,立即将分配好的socket服务器ip ...

  2. java服务负载均衡_适用于Java开发人员的微服务:配置,服务发现和负载平衡

    java服务负载均衡 1.配置,服务发现和负载平衡–简介 我们正在缓慢但稳定地朝着准备好将微服务部署到生产中的方向发展. 在本教程的这一部分中,我们将讨论三个主要主题:配置,服务发现和负载平衡. 我们 ...

  3. socket 获取回传信息_基于netty框架的socket长连接负载均衡解决方案 oswl

    前言 物联网如今是一个大的趋势,但是概念还比较新颖.大家对这一块的技术积累也比较匮乏,借此前段时间摩拜单车出现了大规模瘫痪的现象.我们今天来讨论一下物联网项目的开发方式. 关于tcp/ip 相关的知识 ...

  4. 基于netty框架的socket长连接负载均衡解决方案

    socket通讯的单机瓶颈 物联网的项目socket使用方式有两种: 短连接的socket请求 维持socket长连接的请求 对于socket短链接来说就好比是http请求,请求服务器,服务器返回数据 ...

  5. nodejs负载均衡(一):服务负载均衡

    什么是负载均衡 负载平衡(Load balancing)是一种 计算机技术,用来在多个计算机( 计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载,以达到最优化资源使用.最大化吞吐率.最小 ...

  6. 基于Docker + Consul + Nginx + Consul-template的服务负载均衡实现

    前言 上一篇文章使用 Consul 和 Registrator 在 docker 的容器环境中搭建了服务注册和发现集群.在服务发现和注册的基础上,本文将引入 Nginx反向代理服务器和 Consul- ...

  7. Java实现5种负载均衡算法

    Java实现5种负载均衡算法 1. 轮询算法 import com.google.common.collect.Lists;import java.util.List; import java.uti ...

  8. 【GRPC】JAVA调用go实现负载均衡(RoundRobin)

    文章目录 如何实现负载均衡 java远程调用实现负载均衡 测试负载均衡 如何实现负载均衡 轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重 ...

  9. 微服务负载均衡实现高可用_使用负载平衡实现大容量可用性

    微服务负载均衡实现高可用 Written by Yona Gidalevitz 由Yona Gidalevitz撰写 Most users of the web are blissfully unaw ...

最新文章

  1. jsp判断字符串相等_最长回文字符串三种解法
  2. python函数学习1
  3. 如何在C++中动态分配二维数组
  4. label y 训练集测试集x_训练集、测试集 train_test_split
  5. uni.request POST 请求后台接收不到参数
  6. 二叉树的遍历 C/C++语言实现
  7. 【Qt教程】1.1 - Qt5.12.9 安装
  8. Visual Studio 2015开发Android App问题集锦
  9. Android10获取唯一ID最佳做法
  10. js中定义变量的符号
  11. Cfs三层靶机内网渗透模拟
  12. JavaScript---去除字符串中的空格(五种方式,总有一种适合你)
  13. 关于博弈论的硬币问题
  14. Axis2 WS-Security 签名和加密
  15. 介绍几款AI开源平台
  16. 数据分析:数据处理篇1
  17. 求复杂多边形面积的算法
  18. 跟CEO、CSO们一起来上保险科技精品课:众安在线、泛华金控...30家标杆企业案例8小时深度闭门研讨...
  19. 关于.wmv的兼容问题
  20. “最敬业变脸”值得点赞

热门文章

  1. 15 张前端高清知识地图,强烈建议收藏
  2. 大学生转行IT,零基础非计算机专业可以学会吗?
  3. 计算机专业学生前端该怎么自学?
  4. ssm框架下web项目,web.xml配置文件的作用(详解)
  5. python从入门到实践答案第四章_python从入门到实践课后习题第四章
  6. 进程间通信(未完成)
  7. VS对.ini文件的操作
  8. php mysql 排序规则_使用PHP的MySQL最好的排序规则是什么?
  9. c mysql 返回自增id_mysql返回自增id
  10. 我的世界服务器自定义怪物怎么用,我的世界 教你自定义怪物属性