java多客户端通讯原理及实现

            java多客户端通信主要使用Socket编程,理论上是通过服务器广播的方式进行通信。

做个例子来实现这个理论,打开服务端后,登录多个客户端,一个客户端发出消息,对所有客户端进行广播。

服务器的主内,主要用于接受多个客户端连接,以及客户端数据

服务器端:

 1 package services;
 2
 3 import java.io.IOException;
 4 import java.net.ServerSocket;
 5 import java.net.Socket;
 6 import java.util.ArrayList;
 7 import java.util.List;
 8
 9 public class Server
10     {
11
12         /**
13          * Author:至尊龙
14          */
15         public static int PORT = 90;
16         public static String HOST = "127.0.0.1";
17         public static List msg=new ArrayList();
18         public static void main(String[] args)
19             {
20                 ServerSocket serverSocket = null;
21                 Socket socket = null;
22                 try
23                     {
24                         serverSocket = new ServerSocket(PORT);
25                         // 等待请求,无请求一直等待
26                         while (true)
27                             {
28                                 System.out.println("等待连接");
29                                 socket = serverSocket.accept();// 接受请求
30                                 System.out.println("有连接接接入");
31                                 new ThreadedServer(socket);
32                             }
33                     }
34                 catch (Exception e)
35                     {
36                         try
37                             {
38                                 socket.close();
39                             }
40                         catch (IOException e1)
41                             {
42                                 e1.printStackTrace();
43                             }
44                     }
45                 finally
46                     {
47                        try
48                         {
49                             serverSocket.close();
50                         }
51                     catch (IOException e)
52                         {
53                             e.printStackTrace();
54                         }
55                     }
56
57             }
58
59     }  

服务器端辅助线程

  1 package services;
  2
  3 import java.io.BufferedReader;
  4 import java.io.BufferedWriter;
  5 import java.io.IOException;
  6 import java.io.InputStreamReader;
  7 import java.io.OutputStreamWriter;
  8 import java.io.PrintWriter;
  9 import java.net.Socket;
 10
 11 public class ThreadedServer extends Thread
 12     {
 13
 14         private Socket socket = null;
 15         private BufferedReader br = null;
 16
 17           PrintWriter pw = null;
 18
 19         public ThreadedServer(Socket s)
 20             {
 21                 socket = s;
 22                 try
 23                     {
 24                         br = new BufferedReader(new InputStreamReader(
 25                                 socket.getInputStream()));
 26                         pw = new PrintWriter(
 27                                 new BufferedWriter(new OutputStreamWriter(
 28                                         socket.getOutputStream())), true);
 29                         start();
 30                     }
 31                 catch (Exception e)
 32                     {
 33
 34                         e.printStackTrace();
 35                     }
 36             }
 37
 38         public void run()
 39             {
 40                 new ReadClientMessage(br, socket);//读取客户端数据
 41                 while (true)//向客户端发送数据
 42                     {
 43                         try
 44                             {
 45                             if(Server.msg.size()>0){
 46                                 for(int i=0;i<Server.msg.size();i++){
 47                                 pw.println(Server.msg.get(i));
 48                                 pw.flush();
 49                                 Server.msg.remove(i);
 50                                 }
 51                             }
 52                             }
 53                         catch (Exception e)
 54                             {
 55                             //这段异常需要根据情况处理..
 56 //                                try
 57 //                                    {
 58 //                                        br.close();
 59 //                                        pw.close();
 60 ////                                        socket.close();
 61 //                                    }
 62 //                                catch (IOException e1)
 63 //                                    {
 64 //                                        e1.printStackTrace();
 65 //                                    }
 66                            }
 67                     }
 68             }
 69
 70     }
 71
 72 class ReadClientMessage extends Thread
 73     {
 74         BufferedReader bReader;
 75         Socket socket;
 76
 77         public ReadClientMessage(BufferedReader br,Socket s)
 78             {
 79                 this.bReader = br;
 80                 this.socket=s;
 81                 start();
 82             }
 83
 84         public void run()
 85             {
 86                 String str = "";
 87                 while (true)
 88                     {
 89                         try
 90                             {
 91                             if(bReader!=null){
 92                                 str = bReader.readLine();
 93                                 if (str.equals("q"))
 94                                     {
 95                                       bReader.close();
 96                                       socket.close();
 97                                       break;
 98                                     }
 99                             }
100                             }
101                         catch (IOException e)
102                             {
103                                 e.printStackTrace();
104                             }
105                         if(str!=null){
106                         Server.msg.add(str);
107                         str=null;
108                         }
109                     }
110             }
111     }  

客户端:

 1 package client;
 2
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.IOException;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStreamWriter;
 8 import java.io.PrintWriter;
 9 import java.net.Socket;
10 import java.util.Scanner;
11
12 public class Client
13     {
14
15         /**
16          * Author: 至尊龙
17          * 客户端
18          */
19         public static void main(String[] args)
20             {
21                 Socket socket = null;
22                 BufferedReader br = null;
23                 PrintWriter pw = null;
24                 Scanner scanner = new Scanner(System.in);// 从键盘读取
25                 try
26                     {
27                         // 创建客户端socket
28                         socket = new Socket("127.0.0.1", 90);
29                         // 读取从客户端发来的消息
30                         br = new BufferedReader(new InputStreamReader(
31                                 socket.getInputStream()));
32                         // 写入信息到服务器端
33                         pw = new PrintWriter(
34                                 new BufferedWriter(new OutputStreamWriter(
35                                         socket.getOutputStream())));
36                         new ReadServerMessage(br);// 从服务器读取消息
37                         while (true)
38                             {
39                                 String temp = scanner.nextLine();// 从键盘读取一行
40                                 pw.println(temp);// 写到服务器
41                                 pw.flush();
42                                 if (temp.equals("q"))
43                                     break;
44                             }
45                     }
46                 catch (Exception e)
47                     {
48                         e.printStackTrace();
49                     }
50                 finally
51                     {
52                         try
53                             {
54                                 System.out.println("关闭......");
55                                 br.close();
56                                 pw.close();
57                                 socket.close();
58                             }
59                         catch (IOException e)
60                             {
61                                 e.printStackTrace();
62                             }
63                     }
64
65             }
66
67     }
68   

客户端辅助线程:

 1 package client;
 2
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.net.Socket;
 6
 7 public class ReadServerMessage extends Thread
 8 {
 9     BufferedReader bReader;
10     Socket socket;
11     public ReadServerMessage(BufferedReader br)
12         {
13             this.bReader = br;
14             start();
15         }
16
17     public void run()
18         {
19             String str = "";
20             while (true)//一直等待着服务器的消息
21                 {
22                     try
23                         {
24                         if(bReader!=null){
25                             str = bReader.readLine();
26                             if (str.equals("q"))
27                                 {
28                                   bReader.close();
29                                   socket.close();
30                                   break;
31                                 }
32                         }
33                         }
34                     catch (IOException e)
35                         {
36                             e.printStackTrace();
37                         }
38                     System.out.println("Server Message:" + str);
39                 }
40         }
41 }  

只是简单的实现,如果有更好的方法,欢迎补充。

时间: 2024-10-25 06:13:35

java多客户端通讯原理及实现的相关文章

java的nio之:java的nio的原理

转载:http://weixiaolu.iteye.com/blog/1479656 Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.可以参考:http://baike.baidu.com/view/32726.htm )机制时,发现hadoop的RPC机制的实现主要用到了两个技术:动态代理(动态代理可以参考

java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互

java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等.只有全面提升内存的管理效 率,才能提高整个应用程序的性能. 本篇文章首先简单介绍GC的工作原理,然后再对GC的几个关键问题进行深入探讨,最后提出一些Java程序设计建议,从GC角度提高Java程序的性能. GC的基本原理     Java 的内存管理实际上就是对象的管

Java NIO使用及原理分析(4) 来自网上资料整理

在上一篇文章中介绍了关于缓冲 区的一些细节内容,现在终于可以进入NIO中最有意思的部分非阻塞I/O.通常在进行同步I/O操作时,如果读取数据,代码会阻塞直至有 可供读取的数据.同样,写入调用将会阻塞直至数据能够写入.传统的Server/Client模式会基于TPR(Thread per Request),服务器会为每个客户端请求建立一个线程,由该线程单独负责处理一个客户请求.这种模式带来的一个问题就是线程数量的剧增,大量的线程会 增大服务器的开销.大多数的实现为了避免这个问题,都采用了线程池模型

QQ通讯原理及QQ是怎么穿透内网的(转)

QQ是一个基于TCP/UDP协议的通讯软件 发送消息的时候是UDP打洞,登陆的时候使用HTTP~因为登陆服务器其实就是一个HTTP服务器,只不过不是常用的那些,那个服务器是腾讯自行开发的!!! 一.登录 QQ客户端在局域网内,当你打开QQ登录到QQ服务器时,通过外网,你的客户端与QQ服务器建立了一个长连接.你可以用netstat -bn  看到此连接的状态是 establish 此时,在QQ服务器那面看到的连接的IP是你们局域网对外的IP.举个例子:       QQ服务器      IP:12

【Java】Servlet 工作原理解析

Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的基本要求.本文将带你认识 Java Web 技术是如何基于 Servlet 工作,你将知道:以 Tomcat 为例了解 Servlet 容器是如何工作的?一个 Web 工程在 Servlet 容器中是如何启动的? Servlet 容器如何解析你在 web.xml 中定义的 Servlet ?用户的请

Java NIO使用及原理分析 (四)(转)

在上一篇文章中介绍了关于缓冲区的一些细节内容,现在终于可以进入NIO中最有意思的部分非阻塞I/O.通常在进行同步I/O操作时,如果读取数据,代码会阻塞直至有 可供读取的数据.同样,写入调用将会阻塞直至数据能够写入.传统的Server/Client模式会基于TPR(Thread per Request),服务器会为每个客户端请求建立一个线程,由该线程单独负责处理一个客户请求.这种模式带来的一个问题就是线程数量的剧增,大量的线程会增大服务器的开销.大多数的实现为了避免这个问题,都采用了线程池模型,并

java web 后台运行原理

java web 后台运行原理 当Web服务器接收到一个HTTP请求时,它会先判断请求内容--如果是静态网页数据,Web服务器将会自行处理,然后产生响应信息:如果牵涉到动态数据,Web服务器会将请求转交给Servlet容器.此时Servlet容器会找到对应的处理该请求的Servlet实例来处理,结果会送回Web服务器,再由Web服务器传回用户端. 针对同一个Servlet,Servlet容器会在第一次收到http请求时建立一个Servlet实例,然后启动一个线程.第二次收到http请求时,Ser

http 基础与通讯原理

目录 http 基础与通讯原理 Internet 与中国 1990年10月 注册CN顶级域名 1993年3月2日 接入第一根专线 1994年4月20日 实现与互联网的全功能连接 1994年5月21日 设置CN域名服务器 1996年1月 正式进入Internet TCP/IP协议 socket 套接字 套接字转发过程 套接字连接过程 套接字相关系统函数 HTTP 服务 通讯过程 相关术语 工作机制 HTTP的多种连接模式 URL URL的组成 网站访问量 IP PV UV QPS PV,QPS,并

大神必修课系列之java 分布式架构的原理解析

分布式术语 1.1. 异常 服务器宕机 内存错误.服务器停电等都会导致服务器宕机,此时节点无法正常工作,称为不可用. 服务器宕机会导致节点失去所有内存信息,因此需要将内存信息保存到持久化介质上. 网络异常 有一种特殊的网络异常称为--网络分区 ,即集群的所有节点被划分为多个区域,每个区域内部可以通信,但是区域之间无法通信. 磁盘故障 磁盘故障是一种发生概率很高的异常. 使用冗余机制,将数据存储到多台服务器. 1.2. 超时 在分布式系统中,一个请求除了成功和失败两种状态,还存在着超时状态. 可以