一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - 詳解基于java的Socket聊天程序——初始設計(附demo)

詳解基于java的Socket聊天程序——初始設計(附demo)

2020-07-12 15:25jAVA-yaolin JAVA教程

本篇文章主要介紹了Socket聊天程序——初始設計(附demo),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

寫在前面:

可能是臨近期末了,各種課程設計接踵而來,最近在csdn上看到2個一樣問答,那就是編寫一個基于socket的聊天程序,正好最近剛用socket做了一些事,出于興趣,自己抽了幾個晚上的空閑時間敲了一個,目前僅支持單聊,群聊,文件傳送這些功能。首先,貼出一個丑丑的程序圖(UI是用java swing寫的,這個早就忘光了,無奈看著JDK的API寫了一個),如下圖:  

詳解基于java的Socket聊天程序——初始設計(附demo)

 服務端設計:

服務端主要有兩個操作,一是阻塞接收客戶端的socket并做響應處理,二是檢測客戶端的心跳,如果客戶端一段時間內沒有發送心跳則移除該客戶端,由Server創建ServerSocket,然后啟動兩個線程池去處理這兩件事(newFixedThreadPool,newScheduledThreadPool),對應的處理類分別是SocketDispatcher、SocketSchedule,其中SocketDispatcher根據socket不同的請求分發給不同SocketHandler去處理,而SocketWrapper則是對socket加了一層外殼包裝,用lastAliveTime記錄socket最新的交互時間,SocketHolder存儲當前跟服務端交互的socket集合。設計如下:

詳解基于java的Socket聊天程序——初始設計(附demo)

客戶端設計:

客戶端設計主要分成兩個部分,分別是socket通訊模塊設計和UI相關設計

客戶端socket通訊設計,這里的設計其實跟服務端的設計差不多,不同的是服務端是接收心跳包,而客戶端是發送心跳包,由于客戶端只與一個服務端進行通訊(客戶端之間的通訊也是由服務端進行分發的),所以這里只使用了一個大小為2的線程池去處理這兩件事(newFixedThreadPool(2)),對應的處理類分別是ReceiveListener、KeepAliveDog,其中ReceiveListener在初始化的時候傳入一個Callback作為客戶端收到服務端的消息的回調,Callback的默認實現是DefaultCallback,DefaultCallback根據不同的事件通過HF分發給不同Handler去處理,而ClientHolder則是存儲當前客戶端信息,設計如下:

詳解基于java的Socket聊天程序——初始設計(附demo)

UI相關設計,這里我不打算自己寫UI,畢竟自己寫出來的太丑了,所以后期可能會叫同學或朋友幫忙敲一下,所以我將UI的事件處理都交由Action去處理,將UI設計和事件響應簡單分離,所有UI繼承JFrame并實現View接口,上面的Handler實現類通過Router獲取(存在則直接返回,不存在則創建并存儲)指定的UI,View中提供了UI的創建create()、獲取container()、獲取UI中的組件getComponent(),顯示display(),回收trash();ResultWrapper和ResultHolder只是為了創建和存儲聊天選項卡。

詳解基于java的Socket聊天程序——初始設計(附demo)

 Common模塊設計:

Common模塊主要是數據交互,這里使用JSON數據進行交互,common模塊定義了各類交互信息,SendHelper實現的socket信息的傳送,I18N是語言話,ConstantValue是系統中的配置以及常量(這里常量都是用接口,這個可能不太好),對于ReturnMessage擁有一系列的DTO作為其content屬性。

詳解基于java的Socket聊天程序——初始設計(附demo)

 程序入口:

最后給出服務端和客戶端的入口程序(完整代碼掛在csdn上,有時間會持續更新,文章最后有地址)

服務端入口:

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

客戶端入口:

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

源碼下載:demo

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/niloay/p/socket-chat.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女艹b | 欧美成人免费草草影院视频 | 青草草产国视频 | 久久精品热在线观看85 | 国产精品青青青高清在线 | 情人梁家辉在线 | 亚洲国产一区二区a毛片 | 高清毛片aaaaaaaaa片 | 羞羞污视频 | 国产999在线观看 | 日本大尺度激情做爰叫床 | 黑人草 | 精品一区二区三区自拍图片区 | 国产精品一区二区三区久久 | 久久中文字幕无线观看 | 洗濯屋动漫在线观看 | 99久久国产视频 | 动漫美女3d被爆漫画 | 亚洲精品午夜视频 | 亚洲欧美日韩国产综合专区 | 男人j放进女人的p免费看视频 | 日产精品一卡2卡三卡4乱码久久 | 91综合精品网站久久 | 暖暖高清日本在线 | 韩国丽卡三级作品 | 午夜福利视频极品国产83 | 高h短篇辣肉各种姿势bl | 国产成人综合亚洲一区 | 日韩一区二区在线视频 | 91热国内精品永久免费观看 | 5g影院天天影院天天爽影院网站 | 99久久久久国产精品免费 | 成年男女免费视频观看性 | 99久久伊人精品波多野结衣 | 校花被扒开尿口折磨憋尿 | 白发在线视频播放观看免费 | 女子校生下媚药在线观看 | 欧美日韩国产最新一区二区 | 日韩免费在线视频观看 | 亚洲夜色夜色综合网站 | 国产成人无精品久久久久国语 |