この記事では、オンラインWeb通信のニーズを満たすための例を共有しています。 Java Socketによって実装されたオンラインチャット機能のWebバージョンにより、参照のために、特定のコンテンツは次のとおりです。
実装手順:
1. AWTコンポーネントとソケットを使用して、シンプルな単一クライアントを実装して、サーバーに継続的にメッセージを送信します。
2。スレッドと組み合わせて、メッセージを送信するためにサーバーへのマルチクライアント接続を実現します。
3.サーバーをすべてのクライアントに転送するサーバーを実装し、同時にクライアントに表示する。
4. AWTコンポーネントによって生成されたウィンドウインターフェイスをフロントエンドJSPまたはHTMLによって表示されるインターフェイスに変更し、Javaソケットによって実装されたクライアントをフロントエンドテクノロジーの実装に変更します。
ここでは、最初に最初のステップの単純な関数を実装します。難易度は次のとおりです。
1.私はAWTコンポーネントを使用したことがなく、Java関連のリスニングイベントを使用したことがありません。
2.クライアントとサーバーの間で対話するために長時間ソケットを使用していないため、CSS構造を実際に開発していません。
関数を実装するコード:
オンラインチャットクライアント:
1.グラフィカルウィンドウインターフェイスのアウトラインを生成します
2.アウトラインに閉じるイベントを追加します
3.入力領域とコンテンツディスプレイ領域をアウトラインに追加します
4.入力エリアにキャリッジリターンイベントを追加する
5.サーバー接続を確立し、データを送信します
パッケージchat.chat; java.awt.borderlayoutをインポートします。 java.awt.frameをインポートします。 java.awt.textareaをインポートします。 java.awt.textfieldをインポートします。 java.awt.event.actioneventをインポートします。 java.awt.event.actionlistenerをインポートします。 java.awt.event.windowadapterをインポートします。 java.awt.event.windoweventをインポートします。 java.io.dataoutputStreamをインポートします。 java.io.ioexceptionをインポートします。 java.net.socketをインポートします。 java.net.unknownhostexceptionをインポートします。 / ** *オンラインチャットクライアント1。グラフィカルウィンドウインターフェイスアウトライン2を生成します。アウトラインに近いイベントを追加します3。入力領域とコンテンツディスプレイ領域をアウトラインに追加します4。サーバー接続のキャリッジリターンイベントを追加 * 5。 //コンテンツディスプレイエリアPrivate Textarea Taste = new Textarea();プライベートソケットソケット= null; //データ出力ストリームprivate dataoutputStream dataoutputStream = null; public static void main(string [] args){new chatclient()。launcframe(); } / ** *シンプルなグラフィカルウィンドウを作成 * * @author:tuzongxun * @title:launcframe * @param * @return void * @date 2016年5月18日9:57:00 am * @throws * / public void launcframe(){setlocation(300、200); this.setsize(200、400); add(tftxt、borderlayout.south); add(tarea、borderlayout.north);パック(); //グラフィカルインターフェイスウィンドウのクロージングイベントを聞いてくださいthis.addwindowlistener(new WindowAdapter(){@Override public void windowclosing(windowevent e){system.exit(0); disconnect();}}); tftxt.addactionlistener(new Tflister()); setVisible(true);接続する(); } / ** * connect to the server * * @author:tuzongxun * @title:connect * @param * @return void * @date 5月18日9:56:49 AM * @throws * / public void connect(){try {//新しいサーバー接続socket = new socket(new socket( "127.0.0.0.0.1"、8888); //クライアント出力を取得Streeam dataoutputStream = new DataOutputStream(socket.getOutputStream()); system.out.println( "serverに接続"); } catch(unknownhostexception e){e.printstacktrace(); } catch(ioexception e){e.printstacktrace(); }} / ** * close client resources * * @author:tuzongxun * @title:disconnect * @param * @return void * @date 2016年5月18日9:57:46 am * @throws * / public void disconnect(){try {data outputstream.close(); socket.close(); } catch(ioexception e){e.printstacktrace(); }} / ** * serverにメッセージを送信 * * @author:tuzongxun * @title:sendmessage * @param @param Text * @return void * @date 2016年5月18日9:57:56 AM dataoutputStream.flush(); } catch(ioexception e1){e1.printstacktrace(); }} / ** *キャリッジリターンイベントをリッスンするグラフィックスウィンドウ入力領域 * * @author tuzongxun123 * * / private class tflisterはactionlistener {@override public void actionperformed(actionevent e){string text = tftxt.getText()。トリム(); Taxa.settext(テキスト); tftxt.settext( ""); //サーバーSendMessage(テキスト)にデータを送信します。 }}}サーバ:
パッケージchat.chat; java.io.datainputStreamをインポートします。 java.io.eofexceptionをインポートします。 java.io.ioexceptionをインポートします。 java.net.bindexceptionをインポートします。 java.net.serversocketをインポートします。 java.net.socketをインポートします。 /*** JavaはソケットとAWTコンポーネントを使用して、オンラインチャット関数を単純に実装します。サーバーは、1つのクライアント*を接続した後、サーバーに継続的にメッセージを送信するようにサーバーを実現できますが、複数のクライアントをサポートして同時に接続しません。その理由は、コード内のクライアント接続を取得した後、クライアントの入力がループされているのを聞き続けて、サーバーが2回他のクライアントを聞くことができないように、閉塞*を引き起こすためです。実装する場合は、非同期またはマルチスレッドを使用する必要があります * * @author tuzongxun123 * */ public class chatserver {public static void main(string [] args){//サーバーが起動したかどうかはboolean isstart = false; //サーバーソケットサーバーソケットss = null; //クライアントソケットソケットソケット= null; //サーバーの読み取りクライアントデータ入力Stream DatainputStream DatainputStream = null; try {//サーバーss = new Serversocket(8888); } catch(bindexception e){system.out.println( "ポートは既に使用されている"); //プログラムsystem.exit(0)を閉じます。 } catch(Exception e){e.printstacktrace(); } try {isstart = true; while(isstart){boolean isconnect = false; //リスニングソケット= ss.Accept()を起動します。 System.out.println( "1つのクライアントConnect"); isconnect = true; while(isconnect){//クライアント入力ストリームdatainputStreamを取得= new DatainputStream(socket.getInputStream()); //クライアント文字列= datainputStream.readutf()によって渡されたデータを読み取ります。 system.out.println( "クライアントが言う:" + message); }}} catch(eofexception e){system.out.println( "クライアントクローズ!"); } catch(Exception e){e.printstacktrace(); }最後に{//関連するリソースを閉じるtry {datainputStream.close(); socket.close(); } catch(ioexception e){e.printstacktrace(); }}}}単一のクライアント接続に基づいて続行します。ここでの2番目のステップでは、スレッドの使用が必要な複数のクライアント接続の実装が必要です。新しいクライアントが接続するたびに、サーバーは処理のために新しいスレッドを起動する必要があり、それにより、以前のループ測定値でブロックする問題を解決する必要があります。
通常、スレッドを作成するには2つの方法があります。スレッドの統合または実行可能なインターフェイスの実装です。原則として、Runnableを実装できる場合、インターフェイスを実装する方法がより柔軟であるため、継承されません。
クライアントコードは以前と比較して変更されておらず、サーバーになったため、サーバーコードのみがここに投稿されています。
JavaはソケットとAWTコンポーネントとマルチスレッドを使用して、オンラインチャット関数サーバーを単純に実装するだけです。
複数のクライアントが接続された後、メッセージは継続的にサーバーに送信されます。最初のバージョンと比較して、マルチスレッドの使用に焦点が当てられています。サーバーはまだ転送機能を実装していません。クライアントは、グラフィックスウィンドウに入力された情報のみを見ることができ、他のクライアントから送信されたメッセージを表示できません。
パッケージchat.chat; java.io.datainputStreamをインポートします。 java.io.eofexceptionをインポートします。 java.io.ioexceptionをインポートします。 java.net.bindexceptionをインポートします。 java.net.serversocketをインポートします。 java.net.socketをインポートします。 java.net.socketexceptionをインポートします。 / ** * * * @author tuzongxun123 * */ public class chatserver {public static void main(string [] args){new Chatserver()。start(); } //サーバーが正常に開始されたかどうかのプライベートブールhisStart = false; //サーバーソケットプライベートサーバーソケットss = null; //クライアントソケットプライベートソケットソケット= null; public void start(){try {// Server ss = new Serversocket(8888); } catch(bindexception e){system.out.println( "ポートが使用されている"); //プログラムsystem.exit(0)を閉じます。 } catch(Exception e){e.printstacktrace(); } try {isstart = true; while(isstart){// socket = ss.accept(); System.out.println( "1つのクライアントConnect"); //クライアントスレッドを起動するクライアント= new Client(socket);新しいスレッド(クライアント).start(); }} catch(例外e){e.printstacktrace(); }最後に{//サービスを閉じる{ss.close(); } catch(ioexception e){e.printstacktrace(); }}} / ** *クライアントスレッド * * @author tuzongxun123 * * / classクライアントはrunnable {//クライアントソケットプライベートソケットソケット= null; //クライアント入力ストリームプライベートdatainputStream datainputStream = null; private boolean isconnect = false;パブリッククライアント(ソケットソケット){this.socket = socket; try {isconnect = true; //クライアント入力ストリームを取得しますdatainputStream = new DatainputStream(socket.getInputStream()); } catch(ioexception e){e.printstacktrace(); }} @Override public void run(){isconnect = true; try {while(isconnect){//クライアント文字列= datainputStream.readutf();によって渡されたデータを読み取ります; system.out.println( "クライアントが言う:" + message); }} catch(eofexception e){system.out.println( "クライアントクローズ!"); } catch(socketexception e){system.out.println( "クライアントは閉じている!!!"); } catch(Exception e){e.printstacktrace(); }最後に{//関連するリソースを閉じるtry {datainputStream.close(); socket.close(); } catch(ioexception e){e.printstacktrace(); }}}}}上記は、主にスレッドを使用してマルチクライアントリクエストを受信できるようにする機能を導入します。ここでは、クライアントは各接続されたクライアントにメッセージを転送しながらマルチクライアントメッセージを受信する必要があり、クライアントはコンテンツディスプレイ領域にそれらを表示できる必要があります。
クライアントの転送を実装するとき、それは出力ストリームを増やすことにすぎません。以前は、クライアントは送信したが受信していないため、クライアントを変更してサーバーメッセージを循環的に受信する必要があるため、マルチスレッドを実装する必要があります。
この関数を実装するとき、私は誤って検証コードをランダムに生成する機能を誤って覚えていたので、各クライアントの名前をランダムに生成するための突然のインスピレーションがあり、出力するとグループチャットのように見え、メッセージ出力があるだけでなく、それが誰であるかもわかります。
これらの機能を実装した後、基本的に複数の人のために同時にオンラインでグループチャットをすることができます。コードには主な方法があるため、サーバーとクライアントの両方を実行可能なJARパッケージにすることができます。私の別のブログ投稿を参照できます。Eclipseを使用してJavaプログラム実行可能ファイルパッケージを作成します。
次に、デスクトップ上の対応するJARファイルをダブルクリックしてサーバーとクライアントを起動すると、実行するためにEclipseに依存する必要がなくなります。
変更されたクライアントコードは次のとおりです。
パッケージchat.chat; java.awt.borderlayoutをインポートします。 java.awt.frameをインポートします。 java.awt.textareaをインポートします。 java.awt.textfieldをインポートします。 java.awt.event.actioneventをインポートします。 java.awt.event.actionlistenerをインポートします。 java.awt.event.windowadapterをインポートします。 java.awt.event.windoweventをインポートします。 java.io.datainputStreamをインポートします。 java.io.dataoutputStreamをインポートします。 java.io.ioexceptionをインポートします。 java.net.socketをインポートします。 java.net.unknownhostexceptionをインポートします。 java.util.randomをインポートします。 /** *オンラインチャットクライアントの手順: * 1。グラフィカルウィンドウインターフェイスアウトライン*2を生成します。アウトライン*3の閉ざしたイベントを追加します。アウトライン*4に入力領域とコンテンツディスプレイ領域を追加します。入力領域*5にキャリッジリターンイベントを追加します。サーバー接続を確立してデータを送信します * * @author tuzongxun123 * * */ public class chatclient拡張フレーム{/ ** * */ private static final long serialversionuid = 1l; //ユーザー入力領域private textfield tftxt = new Textfield(); //コンテンツディスプレイエリアPrivate Textarea Taste = new Textarea();プライベートソケットソケット= null; //データ出力ストリームprivate dataoutputStream dataoutputStream = null; //データ入力ストリームプライベートdatainputStream datainputStream = null; private boolean isconnect = false;スレッドtreceive = newスレッド(new ReceiveThread());文字列name = ""; public static void main(string [] args){chatclient chatclient = new chatclient(); chatclient.createName(); chatclient.launcframe(); } / ** *シンプルなグラフィカルウィンドウを作成 * * @author:tuzongxun * @title:launcframe * @param * @return void * @date 2016年5月18日9:57:00 am * @throws * / public void launcframe(){setlocation(300、200); this.setsize(200、400); add(tftxt、borderlayout.south); add(tarea、borderlayout.north); //ウィンドウのレイアウトとコンポーネントパックの優先サイズに従ってフレームの最適なサイズを決定します。 //グラフィカルインターフェイスウィンドウのクロージングイベントを聞いてくださいthis.addwindowlistener(new WindowAdapter(){@Override public void windowclosing(windowevent e){system.exit(0); disconnect();}}); tftxt.addactionlistener(new Tflister()); // setVisible(true)を表示するようにウィンドウを設定します。接続する(); //メッセージを受け入れるスレッドを起動しますtreceive.start(); } / ** * connect to the server * * @author:tuzongxun * @title:connect * @param * @return void * @date 5月18日9:56:49 AM * @throws * / public void connect(){try {//新しいサーバー接続socket = new socket(new socket( "127.0.0.0.0.1"、8888); //クライアント出力を取得Streeam dataoutputStream = new DataOutputStream(socket.getOutputStream()); datainputStream = new DatainputStream(socket.getInputStream()); system.out.println( "serverに接続"); isconnect = true; } catch(unknownhostexception e){e.printstacktrace(); } catch(ioexception e){e.printstacktrace(); }} //ランダムクライアント名Public void createName(){string [] str1 = {"a"、 "b"、 "c"、 "d"、 "e"、 "f"、 "" h "、" i "、" j "、" k "" l "、" m "、" n "、o" o " "w"、 "x"、 "y"、 "z"、 "1"、 "2"、 "3"、 "4"、 "5"、 "6"、 "7"、 "8"、 "9"、 "a"、 "b"、 "c"、 "d" d "、" e "、" f "、" g "、" h "、" m、 "" n " "P"、 "q"、 "r"、 "s"、 "t"、 "u"、 "v"、 "w"、 "x"、 "y"、 "z"};ランダムran = new Random(); for(int i = 0; i <6; i ++){// long num = math.round(math.random() *(str1.length -0)+0); // int n =(int)num; int n = ran.nextint(str1.length); if(n <str1.length){string str = str1 [n]; name = name + str; System.out.println(name); } else {i--;続く; }} this.settitle(name); } / ** * closeクライアントリソース * * @author:tuzongxun * @title:disconnect * @param * @return void * @date 2016年5月18日9:57:46 am * @throws * / public void disconnect(){try {isconnect = false; //スレッドtreceive.join()を停止します。 } catch(arturnedexception e){e.printstacktrace(); }最後に{try {if(dataoutputStream!= null){dataOutputStream.close(); } if(socket!= null){socket.close(); Socket = null; }} catch(ioexception e){e.printstacktrace(); }}} / ** *サーバーにメッセージを送信 * * * @author:tuzongxun * @title:sendmessage * @param @param Text * @return void * @date 5月18日9:57:56 am * @throws * / private void sendmessage(string text){try {datouttuttrem.writeutf( + + " dataoutputStream.flush(); } catch(ioexception e1){e1.printstacktrace(); }} / ** *グラフィックウィンドウ入力領域リスニングキャリッジリターンイベント * * @Author Tuzongxun123 * * / private class tflister tflisterはactionlistener {@override public void actionperformed(actionevent e){string text = tftxt.getText()。トリム(); //入力領域情報をクリアするtftxt.settext( ""); //キャリッジをSendMessageに押した後、データをサーバーに送信します(テキスト)。 }} private class recurethread runnable {@override public void run(){try {while(isconnect){string message = datainputStream.readutf(); System.out.println(メッセージ); string txt = taxa.getText(); if(txt!= null &&! ""。equals(txt.trim())){message = taxa.getText() + "/n" + message; } taxa.settext(message); }} catch(ioexception e){e.printstacktrace(); }}}}変更されたサーバーコードは次のとおりです。
パッケージchat.chat; java.io.datainputStreamをインポートします。 java.io.dataoutputStreamをインポートします。 java.io.eofexceptionをインポートします。 java.io.ioexceptionをインポートします。 java.net.bindexceptionをインポートします。 java.net.serversocketをインポートします。 java.net.socketをインポートします。 java.net.socketexceptionをインポートします。 java.util.arraylistをインポートします。 java.util.listをインポートします。 /** * Javaは、ソケットとAWTコンポーネントとマルチスレッドを使用して、オンラインチャット関数サーバーを単純に実装するだけです。 * * @author tuzongxun123 * */ public class chatserver {public static void main(string [] args){new Chatserver()。start(); } //サーバーが正常に開始されたかどうかのプライベートブールンISSTART = false; //サーバーソケットプライベートサーバーソケットss = null; //クライアントソケットプライベートソケットソケット= null; //クライアントコレクションリストを保存<client> clients = new arrayList <client>(); public void start(){try {//サーバーss = new Serversocket(8888); } catch(bindexception e){system.out.println( "ポートが使用されている"); //プログラムsystem.exit(0)を閉じます。 } catch(Exception e){e.printstacktrace(); } try {isstart = true; while(isstart){//リスニングソケット= ss.accept()を起動します。 System.out.println( "1つのクライアントConnect"); //クライアントスレッドを起動するクライアント= new Client(socket);新しいスレッド(クライアント).start(); clients.add(client); }} catch(例外e){e.printstacktrace(); }最後に{//サービスを閉じる{ss.close(); } catch(ioexception e){e.printstacktrace(); }}} / ** *クライアントスレッド * * @author tuzongxun123 * * / privateクラスクライアント実装{//クライアントソケットプライベートソケットソケット= null; //クライアント入力ストリームプライベートdatainputStream datainputStream = null; //クライアント出力ストリームprivate dataoutputStream dataoutputStream = null; private boolean isconnect = false;パブリッククライアント(ソケットソケット){this.socket = socket; try {isconnect = true; //クライアント入力ストリームを取得しますdatainputStream = new DatainputStream(socket.getInputStream()); //クライアント出力を取得Streeam dataoutputStream = new DataOutputStream(socket.getOutputStream()); } catch(ioexception e){e.printstacktrace(); }} / ** * bulk send(worward)data in the client * * * @author:tuzongun * @title:sendmessagetoclients * @param @return void * @return void * @date 2016年5月18日} catch(socketexception e){} catch(ioexception e){e.printstacktrace(); }} @Override public void run(){isconnect = true;クライアントc = null; try {while(isconnect){//クライアント文字列= datainputStream.readutf();によって渡されたデータを読み取ります; system.out.println( "クライアントが言う:" +メッセージ); for(int i = 0; i <clients.size(); i ++){c = clients.get(i); c.sendmessagetoclients(メッセージ); }}} catch(eofexception e){system.out.println( "クライアントクローズ!"); } catch(socketexception e){if(c!= null){clients.remove(c); } system.out.println( "クライアントは閉じている!!!"); } catch(Exception e){e.printstacktrace(); }最後に{//関連するリソースを閉じるtry {if(datainputStream!= null){datainputStream.close(); } if(socket!= null){socket.close(); Socket = null; }} catch(ioexception e){e.printstacktrace(); }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}最初に紹介してから、新しいコンテンツがある場合は更新します。
Webオンラインチャット機能の実現については、学習のための次の記事を参照することもできます。
Javaは、シンプルなtcpsocketチャットルーム機能共有を実装します
上記はこの記事のすべての内容です。皆の学習に役立つことを願っています。Wulin.comのよりエキサイティングなコンテンツに注意を払い続けることができることを願っています。