この出版物の目的は、初心者向けのJavaプログラマーに、マルチスレッドサーバーを作成するすべての段階を示すことです。 このトピックを完全に理解するために、主な情報はコードのコメントとコンソールに表示されるメッセージに含まれており、何がどのような順序で起こっているのかを正確に理解できます。
最初に、マルチスレッドアーキテクチャの構築に基づいて基本的な知識を習得するための基本的なクライアントサーバーの作成を検討します。
コンセプト。
-スレッド:スレッドの意味を正確に混同しないように、専門文献に存在する同義語-スレッド、ストリームとスレッドを混同しないように、さらに専門的に自分を表現する-スレッドについて話すスレッドを使用します。
-ソケット(ソケット):ある時点でサーバーが実行するので、この概念もあいまいです-クライアントアクション、およびクライアント-サーバー。 そのため、サーバーソケットの概念-(ServerSocket)と実際に通信が行われるソケット(Socket)を分けました。これを通信ソケットと呼び、何を話しているのかを明確にします。
さらに、通信ソケットはデータを交換する各アプリケーションごとに1つずつ作成されるため、オブジェクトを含むアプリケーションソケットはServerSocketであり、接続を待機している間に最初にポートを開きます。サーバー側の通信ソケットと、既知のアドレスのポートに接続する2番目のソケットを作成するソケットアプリケーションはクライアント側の通信ソケットと呼ばれます。
Thread.sleep()に関する助けてくれてありがとう! もちろん、実際のコードではThread.sleep(); インストールする必要はありません-これは悪いマナーです! この出版物では、プログラムの実行がより見えるようにするためだけに使用し、何が起こっているのかを理解できるようにします。 したがって、コードでThread.sleep();!をテスト、研究、使用しないでください。
目次:
1)シングルスレッドの基本サーバー。
2)顧客。
3)マルチスレッドサーバー-このサーバー自体は直接通信に参加しませんが、クライアントとの通信の終了後に閉じられる、新しく接続されたクライアントと通信するための(サーバークライアントとの対話のために委任された)一本鎖の委任者の工場です。
4)サーバーにアクセスする複数のクライアントのシミュレーション。
多数のコメントによると
、GitHubの
ソースへのリンクを投稿
しています 。
それでは、対話用に1つのクライアントのみを受け入れることができるシングルスレッドサーバーの構造を調べることから始めましょう。 以下のコードは、この記事全体の考え方でIDEで実行する必要があります。 以下の詳細なドキュメントコードからすべての詳細を明確にすることをお勧めします。
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class TestAsServer { public static void main(String[] args) throws InterruptedException {
サーバーは実行中で、server.accept()のブロッキング待機中です。 接続要求で彼に連絡します。 これで、クライアントに接続し、クライアントコードを記述して実行できます。 クライアントは、ユーザーがコンソールに何かを入力すると動作します(この場合、サーバーとクライアントはローカルアドレス-localhostを使用して同じコンピューターで起動されるため、クライアントが送信する行を入力するときは、必ずクライアントの動作コンソールに切り替えてください!)。
クライアントのコンソールに行を入力してEnterキーを押すと、クライアントが会話を終了するためのコードワードを入力したかどうかを確認するために行がチェックされ、サーバーに送信されます。 コードワードを受け取ったクライアントとサーバーの両方が、予備的な準備の後にリソースを閉じて、作業を完了します。
コードでどのように見えるか見てみましょう:
import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import java.net.UnknownHostException; public class TestASClient { public static void main(String[] args) throws InterruptedException {
しかし、別のクライアントがサーバーに接続したい場合はどうでしょう!? 結局のところ、上記のサーバーは、1つのクライアントが接続するのを待っているか、接続が完了するまで通信するかのどちらかです。 この場合、新しいクライアントがソケットに接続されたときに上記のサーバーを作成するファクトリーを作成する必要があります。委任されたサーバーがクライアントとの対話を完了するのを待たずに、次のクライアントを見越してaccept()を開きます。 ただし、サーバーマシンが多くのクライアントと通信するのに十分なリソースを持つためには、可能な接続の数を制限する必要があります。 ファクトリは、以前のサーバーをわずかに変更したバージョンを生成します(変更は、ファクトリのサーバークラスがRunnableインターフェイスを実装して、スレッドプール-ExecuteServicesで使用できるようにすることに関係します)。 このようなサーバーファクトリを作成して、コードでその操作の詳細な説明を理解しましょう。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MultiThreadServer { static ExecutorService executeIt = Executors.newFixedThreadPool(2); public static void main(String[] args) {
- 前のコードから実行するようにRunnableサーバーを変更:
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; public class MonoThreadClientHandler implements Runnable { private static Socket clientDialog; public MonoThreadClientHandler(Socket client) { MonoThreadClientHandler.clientDialog = client; } @Override public void run() { try {
サーバーへの複数のクライアントアクセスをシミュレートするには、サーバーに接続してループでメッセージを書き込むクライアントのRunnableファクトリーを作成して実行します(サーバー側を起動した後)。
- 4)サーバーにアクセスする複数のクライアントのシミュレーション。
import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main {
前のコードからわかるように、ファクトリーはTestRunnableClientTester()クライアントを起動し、それらのコードを記述してから、ファクトリーを起動して、プールで実行する誰かを確保します。
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; public class TestRunnableClientTester implements Runnable { static Socket socket; public TestRunnableClientTester() { try {
実行し、コードを変更します。これは、この構造の動作を実際に理解する唯一の方法です。
ご清聴ありがとうございました。