LAN 接続を実現するには、情報伝送の原理を知る必要があります。
LAN 内で送信される情報はパケットの形式であり、データの送信には TCP パケットを使用しますが、TCP パケットには IP パケットがカプセル化されています。
次の文は、静的 IPV4 プロトコル クラスを通じてサーバーの IP アドレスを取得するものです。
address = InetAddress.getByName("192.168.43.86");
TCPではサーバーのIPアドレスを取得しますが、IPアドレスだけでは特定のアプリケーションをロックできないため、ソケットの概念が導入されています。ポート番号はホストのプロセスをロックするために使用されます。 0 ~ 1023 は既知のポート番号であり、HTTP などの一般的に使用されるポートに使用されるため、ポート番号は通常 1024 ~ 49151 です。49152 ~ 65535 は一時的なポート番号であり、ランダムに占有することはできません。プログラムの実行中に一時的に割り当てられます。
Socket=IP ポート番号
この文は、ポート番号 9998 および IP 192.168.43.86 のソケットを定義します。
int port = 9998; socket = new Socket(address,port);
Java クラスの観点から見ると、サーバーとクライアントはソケット接続を通じて接続を抽象化します。サーバーは独自のソケットポートを確立し、このポートにクライアントが接続するかどうかを監視することで情報読み取り機能を実現します。クライアントは、サーバーによって合意されたポート番号を介してサーバーにデータを送信します。サーバの電源投入後、クライアントを起動し、サーバと3ウェイハンドシェイクを行ってTCP接続を確立し、その接続をもとにクライアントとサーバ間の通信が実現されます。
サーバーは同時に複数のオブジェクトにサービスを提供する可能性があるため、サーバー接続に従来の方法が使用される場合、1 つのクライアントが対話するのを複数のクライアントが待機することになります。サーバーと。この問題を解決するために、マルチスレッドのアプローチが採用されています。
SuperSocket クラスを使用してソケット クラスを継承し、Runnable インターフェイスを実装してマルチスレッド操作を実現します。
class SuperSocket extends Socket implements Runnable
SuperSocket socket_1 = new SuperSocket(9999); SuperSocket socket_2 = new SuperSocket(9998); SuperSocket socket_3 = new SuperSocket(9997); Thread s1 = new Thread(socket_1); Thread s2 = new Thread(socket_2); Thread s3 = new Thread(socket_3);
サーバーのアーキテクチャは 3 番目の部分に示されており、コードは次のように実装されます
package TCP; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class TCPserver2 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //实例化具有多线程功能的服务器专用socket类 //需要传递端口号作为初始化变量 SuperSocket socket_1 = new SuperSocket(9996); SuperSocket socket_2 = new SuperSocket(9998); SuperSocket socket_3 = new SuperSocket(9997); //建立三个子线程 Thread s1 = new Thread(socket_1); Thread s2 = new Thread(socket_2); Thread s3 = new Thread(socket_3); try { while(true) { //开启线程 s1.start(); s2.start(); s3.start(); if(scan.next()=="123"){ //结束线程 break; } } } finally { try { //关闭套接字 socket_1.close(); socket_2.close(); socket_3.close(); } catch (IOException e) { e.printStackTrace(); } } } } class SuperSocket extends Socket implements Runnable{ InputStream is; byte[] buffer; Socket socket=null; ServerSocket serverSocket=null; public SuperSocket(int port){ try { //初始服务器型套接字 serverSocket = new ServerSocket(port); buffer = new byte[1024]; } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { try { //等待端口连接 socket = serverSocket.accept(); //连接完成后创建输入流 is = socket.getInputStream(); //读取客户端传送信息 int len = is.read(buffer); String str = new String(buffer, 0, len); System.out.println(str); } catch (IOException e) { e.printStackTrace(); } } }
クライアント
クライアントのアーキテクチャは 3 番目の部分に示されています。示されているように、コードの実装は次のとおりです。
package TCP; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class TCPclient { public static void main(String[] args) { InetAddress address=null; Socket socket=null; OutputStream os=null; String message=null; Scanner sca=null; try { //得到本机IP地址 address = InetAddress.getByName("192.168.43.86"); //规定端口号,建立套接字 int port = 9998; socket = new Socket(address,port); //绑定套接字的输出流 os = socket.getOutputStream(); sca = new Scanner(System.in); while(true) { message = sca.next(); //写入输出流,在局域网中传输 os.write(message.getBytes()); } } catch (UnknownHostException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); }finally { try { //关闭端口号,关闭io流 os.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
以上がJava を使用してマルチスレッド LAN チャット ルームを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。