以前に書かれた:
たぶんそれは期間の終わりであり、さまざまなコースのデザインが次々と来ています。最近、CSSDNに関する2つの質問と回答を見ました。これは、ソケットベースのチャットプログラムを作成することです。私はたまたまソケットで何かをしました。興味深いことに、私は数晩の自由な時間をかけて1つをノックしました。現在、シングルチャット、グループチャット、ファイル転送機能のみをサポートしています。最初に、私はugいプログラムの画像を投稿しました(UIはJava Swingで書かれています、私はこれを長い間忘れていたので、JDK APIを読んで1つ書くのを手伝うことができませんでした)。
サーバー設計:
サーバーには2つの主要な操作があります。1つは受信クライアントのソケットをブロックして応答処理を実行することです。もう1つはクライアントのハートビートを検出することです。クライアントが一定期間ハートビートを送信しない場合は、クライアントを削除し、Serversocketを作成し、2つのスレッドプールを起動してこれら2つのことを処理します(NewFixedThreadPool、NewScheduledThreadPool)。対応する処理クラスは、SocketDispatcherとSocketscheduleです。 SocketDispatcherは、さまざまなソケットリクエストに従って、さまざまなSockethandlersに配布されます。 SocketWrapperはシェルラッパーをソケットに追加し、ソケットの最新のインタラクション時間をSocketholderが現在サーバーと対話しているソケットコレクションを保存します。デザインは次のとおりです。
クライアントデザイン:
クライアントの設計は、主にソケット通信モジュールの設計とUI関連の設計、つまり2つの部分に分かれています
クライアントソケット通信の設計は、実際にはサーバーの設計と似ています。違いは、サーバーがハートビートパケットを受信し、クライアントがハートビートパケットを送信することです。クライアントは1つのサーバーとのみ通信するため(クライアント間の通信もサーバーによって配信されます)、サイズ2のスレッドプールのみがこれらの2つのことを処理するために使用されます(NewFixedThreadPool(2))。対応する処理クラスは、ReceIveListenerとKeepalivedogです。 ReceiveListenerが初期化されると、クライアントへのコールバックがサーバーメッセージを受信するとコールバックが送信されます。コールバックのデフォルトの実装はdefaultCallBackです。 DefaultCallbackは、異なるイベントに従って、HFを介して異なるハンドラーに配布されます。クライアントホルダーは、現在のクライアント情報を保存します。デザインは次のとおりです。
UI関連のデザイン、私は自分でUIを書くつもりはありません。結局のところ、私が書いたのはあまりにも醜いので、クラスメートや友人に後でノックするのを手伝ってくれるように頼むかもしれません。すべてのUISはJFrameを継承し、ビューインターフェイスを実装します。上記のハンドラー実装クラスはルーターを介して取得されます(存在する場合は直接返され、存在しない場合は作成および保存されます)。このビューは、UI Creation()、Container()を取得し、UI getComponent()、Display Display()、およびRecycle Trash()のコンポーネントを取得します。 ResultWrapperとResultholderは、チャットタブを作成および保存するためだけです。
一般的なモジュール設計:
共通モジュールは主にデータ相互作用であり、JSONデータがインタラクションに使用されます。共通モジュールは、さまざまなタイプの相互作用情報、SendHelperによって実装されたソケット情報の送信、I18Nが言語であり、定数値はシステム内の構成と定数です(定数はすべてインターフェイスであり、あまり良くない場合があります)。 ReturnMessageの場合、コンテンツ属性としての一連のDTOがあります。
プログラムエントリ:
最後に、サーバーとクライアント用のエントランスプログラムが与えられます(完全なコードはCSDNに掛けられ、時間があれば継続的に更新され、記事には最後にアドレスがあります)
サーバーポータル:
パッケージyaolin.chat.server; import java.io.ioexception; import java.net.serversocket; import java.util.date; Import java.util.concurrent.executorservice; Import java.util.util.concurrent.executors; Import java.util.util.concurrelent.schedureRervice java.util.concurrent.timeunit; Import yaolin.chat.common.constantValue; import yaolin.chat.util.loggerutil;/*** server* @author yaolin*/public class server {private final serversocket server;プライベート最終executorserviceプール。 public server()throws ioexception {server = new Serversocket(construmentValue.server_port); pool = executors.newfixedthreadpool(custrantValue.max_pool_size); } public void start(){try {scheduledexecutorservice schedule = executors.newscheduledthreadpool(1); //犬を見る。例外?? schedule.scheduleatfixedrate(new socketschedule()、10、custrantValue.time_out、timeunit.seconds); while(true){pool.execute(new SocketDispatcher(server.accept())); loggerutil.info( "" + new date()でクライアントを受け入れる); }} catch(ioexception e){pool.shutdown(); }} public static void main(string [] args){try {new Server()。start(); } catch(ioexception e){loggerutil.error( "サーバーの起動障害! - >" + e.getmessage()、e); }}}クライアントポータル:
パッケージ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.impl.impl.egisterandloginview; yaolin * */public class niloaychat {public static void main(string [] args){registerandloginview v =(Registerandloginview)router.getView(Registerandloginview.class).create(); try {v.display();クライアントクライアント= new Client(new DefaultCallback()); client.start(); clientHolder.setClient(クライアント); } catch(ioexception e){joptionpane.showmessageialog(v.getContentPane()、e.getMessage()); }}}ソースコードのダウンロード:デモ
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。