最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年12月12日 09:20:12   作者:jAVA-yaolin  
本篇文章主要介紹了Socket聊天程序——初始設計(附demo),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

寫在前面:

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

 服務端設計:

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

客戶端設計:

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

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

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

 Common模塊設計:

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

 程序入口:

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

服務端入口:

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);
    }
  }
}

客戶端入口:

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java使用百度AI接口實現(xiàn)智能機器人對話系統(tǒng)

    Java使用百度AI接口實現(xiàn)智能機器人對話系統(tǒng)

    AI已經(jīng)在各行各業(yè)中廣泛應用,助力于各式各樣的業(yè)務,而在機器人對話中,我們可以通過利用百度AI中的自然語言處理、問答知識圖譜等技術,使機器人可以更加智能化、自然化的為用戶服務,本文介紹Java利用百度AI接口實現(xiàn)智能機器人對話系統(tǒng)
    2024-01-01
  • SpringBoot最新定時任務的7種實現(xiàn)方案

    SpringBoot最新定時任務的7種實現(xiàn)方案

    在現(xiàn)代應用中,定時任務是一個非常常見的需求,本文將通過7種方式講解如何在SpringBoot中實現(xiàn)定時任務,包括使用@Scheduled注解、ScheduledExecutorService、Quartz、SpringTaskScheduler、Redis、XXL-JOB和Elastic-Job等,各有優(yōu)缺點,選擇時應根據(jù)實際需求進行考慮
    2024-12-12
  • IDEA入門級使用教程你居然還在用eclipse?

    IDEA入門級使用教程你居然還在用eclipse?

    上個月,idea的使用量超越eclipse的消息席卷了整個IT界,idea到底好在哪里呢?下面小編通過本文給大家詳細介紹下IDEA入門級使用教程,非常詳細,感興趣的朋友一起看看吧
    2020-10-10
  • 全面詳解java代碼重構(gòu)與設計模式

    全面詳解java代碼重構(gòu)與設計模式

    這篇文章主要為大家介紹了全面詳解java代碼重構(gòu)與設計模式的全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Array?Index?Out?of?Bounds:數(shù)組越界錯誤解決方案及調(diào)試技巧

    Array?Index?Out?of?Bounds:數(shù)組越界錯誤解決方案及調(diào)試技巧

    數(shù)組越界訪問是指訪問數(shù)組中超出其有效索引范圍的元素,這是一種常見的編程錯誤,可能導致程序崩潰或數(shù)據(jù)損壞,下面這篇文章主要給大家介紹了關于Array?Index?Out?of?Bounds:數(shù)組越界錯誤解決方案及調(diào)試技巧的相關資料,需要的朋友可以參考下
    2024-08-08
  • Java實現(xiàn)兩人五子棋游戲(三) 畫出棋子

    Java實現(xiàn)兩人五子棋游戲(三) 畫出棋子

    這篇文章主要為大家詳細介紹了Java實現(xiàn)兩人五子棋游戲,畫出五子棋的棋子,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Mybatis-plus的service通用接口解讀

    Mybatis-plus的service通用接口解讀

    這篇文章主要介紹了Mybatis-plus的service通用接口解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java程序員必須知道的4個書寫代碼技巧

    java程序員必須知道的4個書寫代碼技巧

    本篇文章主要給大家講述了作為JAVA程序員如何能寫出高效的代碼以及運行效率更高的代碼,一起學習分享下吧。
    2017-12-12
  • Java通過導出超大Excel文件解決內(nèi)存溢出問題

    Java通過導出超大Excel文件解決內(nèi)存溢出問題

    導出excel是咱Java開發(fā)的必備技能,下面這篇文章主要給大家介紹了關于Java通過導出超大Excel文件解決內(nèi)存溢出問題的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • java計算自然數(shù)中的水仙花數(shù)的方法分享

    java計算自然數(shù)中的水仙花數(shù)的方法分享

    這篇文章主要介紹了java計算自然數(shù)中的水仙花數(shù)的方法,需要的朋友可以參考下
    2014-03-03

最新評論

海门市| 兴海县| 武夷山市| 大关县| 喀喇| 霍山县| 石渠县| 开阳县| 积石山| 天祝| 芮城县| 石家庄市| 广昌县| 桂林市| 遂平县| 淄博市| 博兴县| 萍乡市| 巴彦淖尔市| 班戈县| 彭水| 崇明县| 新平| 洛浦县| 阿坝县| 胶南市| 嘉义市| 阜新| 夹江县| 东乌珠穆沁旗| 西乌珠穆沁旗| 柳林县| 娱乐| 湘潭县| 兰坪| 正安县| 荣成市| 抚松县| 库尔勒市| 安塞县| 磐石市|