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 @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分发服务负载均衡相关推荐
- java socket负载均衡_Java Socket分发服务负载均衡
1 1. 设备请求分发服务器,分发服务器返回有效的socket服务器ip与port,然后断开连接.2 a) 设备与服务器建立连接.3 b) 服务器接收到连接请求后,立即将分配好的socket服务器ip ...
- java服务负载均衡_适用于Java开发人员的微服务:配置,服务发现和负载平衡
java服务负载均衡 1.配置,服务发现和负载平衡–简介 我们正在缓慢但稳定地朝着准备好将微服务部署到生产中的方向发展. 在本教程的这一部分中,我们将讨论三个主要主题:配置,服务发现和负载平衡. 我们 ...
- socket 获取回传信息_基于netty框架的socket长连接负载均衡解决方案 oswl
前言 物联网如今是一个大的趋势,但是概念还比较新颖.大家对这一块的技术积累也比较匮乏,借此前段时间摩拜单车出现了大规模瘫痪的现象.我们今天来讨论一下物联网项目的开发方式. 关于tcp/ip 相关的知识 ...
- 基于netty框架的socket长连接负载均衡解决方案
socket通讯的单机瓶颈 物联网的项目socket使用方式有两种: 短连接的socket请求 维持socket长连接的请求 对于socket短链接来说就好比是http请求,请求服务器,服务器返回数据 ...
- nodejs负载均衡(一):服务负载均衡
什么是负载均衡 负载平衡(Load balancing)是一种 计算机技术,用来在多个计算机( 计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载,以达到最优化资源使用.最大化吞吐率.最小 ...
- 基于Docker + Consul + Nginx + Consul-template的服务负载均衡实现
前言 上一篇文章使用 Consul 和 Registrator 在 docker 的容器环境中搭建了服务注册和发现集群.在服务发现和注册的基础上,本文将引入 Nginx反向代理服务器和 Consul- ...
- Java实现5种负载均衡算法
Java实现5种负载均衡算法 1. 轮询算法 import com.google.common.collect.Lists;import java.util.List; import java.uti ...
- 【GRPC】JAVA调用go实现负载均衡(RoundRobin)
文章目录 如何实现负载均衡 java远程调用实现负载均衡 测试负载均衡 如何实现负载均衡 轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重 ...
- 微服务负载均衡实现高可用_使用负载平衡实现大容量可用性
微服务负载均衡实现高可用 Written by Yona Gidalevitz 由Yona Gidalevitz撰写 Most users of the web are blissfully unaw ...
最新文章
- jsp判断字符串相等_最长回文字符串三种解法
- python函数学习1
- 如何在C++中动态分配二维数组
- label y 训练集测试集x_训练集、测试集 train_test_split
- uni.request POST 请求后台接收不到参数
- 二叉树的遍历 C/C++语言实现
- 【Qt教程】1.1 - Qt5.12.9 安装
- Visual Studio 2015开发Android App问题集锦
- Android10获取唯一ID最佳做法
- js中定义变量的符号
- Cfs三层靶机内网渗透模拟
- JavaScript---去除字符串中的空格(五种方式,总有一种适合你)
- 关于博弈论的硬币问题
- Axis2 WS-Security 签名和加密
- 介绍几款AI开源平台
- 数据分析:数据处理篇1
- 求复杂多边形面积的算法
- 跟CEO、CSO们一起来上保险科技精品课:众安在线、泛华金控...30家标杆企业案例8小时深度闭门研讨...
- 关于.wmv的兼容问题
- “最敬业变脸”值得点赞
热门文章
- 15 张前端高清知识地图,强烈建议收藏
- 大学生转行IT,零基础非计算机专业可以学会吗?
- 计算机专业学生前端该怎么自学?
- ssm框架下web项目,web.xml配置文件的作用(详解)
- python从入门到实践答案第四章_python从入门到实践课后习题第四章
- 进程间通信(未完成)
- VS对.ini文件的操作
- php mysql 排序规则_使用PHP的MySQL最好的排序规则是什么?
- c mysql 返回自增id_mysql返回自增id
- 我的世界服务器自定义怪物怎么用,我的世界 教你自定义怪物属性