码迷,mamicode.com
首页 > 其他好文 > 详细

Socket聊天程序——初始设计

时间:2016-12-10 22:40:28      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:sockets   记录   mil   action   one   请求   tar   nal   return   

写在前面:

  可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了几个晚上的空闲时间敲了一个,目前仅支持单聊,群聊,文件传送这些功能。首先,贴出一个丑丑的程序图(UI是用java swing写的,这个早就忘光了,无奈看着JDK的API写了一个),如下图:  

技术分享

 服务端设计:

  服务端主要有两个操作,一是阻塞接收客户端的socket并做响应处理,二是检测客户端的心跳,如果客户端一段时间内没有发送心跳则移除该客户端,由Server创建ServerSocket,然后启动两个线程池去处理这两件事(newFixedThreadPool,newScheduledThreadPool),对应的处理类分别是SocketDispatcher、SocketSchedule,其中SocketDispatcher根据socket不同的请求分发给不同SocketHandler去处理,而SocketWrapper则是对socket加了一层外壳包装,用lastAliveTime记录socket最新的交互时间,SocketHolder存储当前跟服务端交互的socket集合。设计如下:技术分享

客户端设计:

  客户端设计主要分成两个部分,分别是socket通讯模块设计和UI相关设计

  客户端socket通讯设计,这里的设计其实跟服务端的设计差不多,不同的是服务端是接收心跳包,而客户端是发送心跳包,由于客户端只与一个服务端进行通讯(客户端之间的通讯也是由服务端进行分发的),所以这里只使用了一个大小为2的线程池去处理这两件事(newFixedThreadPool(2)),对应的处理类分别是ReceiveListener、KeepAliveDog,其中ReceiveListener在初始化的时候传入一个Callback作为客户端收到服务端的消息的回调,Callback的默认实现是DefaultCallback,DefaultCallback根据不同的时间通过HF分发给不同Handler去处理,而ClientHolder则是存储当前客户端信息,设计如下:技术分享

  UI相关设计,这里我不打算自己写UI,毕竟自己写出来的太丑了,所以后期可能会叫同学或朋友帮忙敲一下,所以我将UI的事件处理都交由Action去处理,将UI设计和事件响应简单分离,所有UI继承JFrame并实现View接口,上面的Handler实现类通过Router获取(存在则直接返回,不存在则创建并存储)指定的UI,View中提供了UI的创建create()、获取container()、获取UI中的组件getComponent(),显示display(),回收trash();ResultWrapper和ResultHolder只是为了创建和存储聊天选项卡。

技术分享

 Common模块设计:

  Common模块主要是数据交互,这里使用JSON数据进行交互,common模块定义了各类交互信息,SendHelper实现的socket信息的传送,I18N是语言话,ConstantValue是系统中的配置以及常量(这里常量都是用接口,这个可能不太好),对于ReturnMessage拥有一系列的DTO作为其content属性。

技术分享

 

程序入口:

  最后给出服务端和客户端的入口程序(完整代码挂在csdn上,有时间会持续更新,文章最后又地址)

  服务端入口:

 1 package yaolin.chat.server;
 2 
 3 import java.io.IOException;
 4 import java.net.ServerSocket;
 5 import java.util.Date;
 6 import java.util.concurrent.ExecutorService;
 7 import java.util.concurrent.Executors;
 8 import java.util.concurrent.ScheduledExecutorService;
 9 import java.util.concurrent.TimeUnit;
10 
11 import yaolin.chat.common.ConstantValue;
12 import yaolin.chat.util.LoggerUtil;
13 
14 /**
15  * 服务器
16  * @author yaolin
17  */
18 public class Server {
19 
20     private final ServerSocket server;
21     private final ExecutorService pool;
22     
23     public Server() throws IOException {
24         server = new ServerSocket(ConstantValue.SERVER_PORT);
25         pool = Executors.newFixedThreadPool(ConstantValue.MAX_POOL_SIZE);
26     }
27 
28     public void start() {
29         try {
30             ScheduledExecutorService schedule = Executors.newScheduledThreadPool(1);
31             // Watch dog.  Exception??
32             schedule.scheduleAtFixedRate(new SocketSchedule(), 10, ConstantValue.TIME_OUT, TimeUnit.SECONDS);
33 
34             while (true) {
35                 pool.execute(new SocketDispatcher(server.accept()));
36                 LoggerUtil.info("ACCEPT A CLIENT AT " + new Date());
37             }
38         } catch (IOException e) {
39             pool.shutdown();
40         }
41     }
42     
43     
44     public static void main(String[] args) {
45         try {
46             new Server().start();
47         } catch (IOException e) {
48             LoggerUtil.error("Server start failed! -> " + e.getMessage(), e);
49         }
50     }
51 }

  客户端入口:

 1 package yaolin.chat.client;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.swing.JOptionPane;
 6 
 7 import yaolin.chat.client.callback.DefaultCallback;
 8 import yaolin.chat.client.view.Router;
 9 import yaolin.chat.client.view.impl.RegisterAndLoginView;
10 
11 /**
12  * 
13  * @author yaolin
14  *
15  */
16 public class NiloayChat {
17 
18     public static void main(String[] args) {
19         RegisterAndLoginView v = (RegisterAndLoginView) Router.getView(RegisterAndLoginView.class).create();
20         try {
21             v.display();
22             Client client = new Client(new DefaultCallback());
23             client.start();
24             ClientHolder.setClient(client);
25         } catch (IOException e) {
26             JOptionPane.showMessageDialog(v.getContentPane(), e.getMessage());
27         }
28     }
29 }

 

代码目前挂在csdn仓库,地址 https://code.csdn.net/yaoIin/yl-chat

未完,待续。

Socket聊天程序——初始设计

标签:sockets   记录   mil   action   one   请求   tar   nal   return   

原文地址:http://www.cnblogs.com/niloay/p/socket-chat.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!