Java ソケット: クライアント/サーバー・チャット・アプリケーションの作成

このチュートリアルでは、ソケットを使用して 2 台のマシン間で Java チャット アプリケーションを作成する方法を学習します。プログラミングの部分を開始する前に、たとえば、これら2台のマシンが自宅のローカルネットワーク上で対話するようにネットワークを構成する必要があります。理論的には、よく知られたクライアント/サーバーモデルを実装します。

このチュートリアルを終了する頃には、ソケットがメッセージを交換する方法がわかるでしょう。

Server

javaserver> は、接続を初期化し、ポートを listen し、着信接続が受け入れられるのを待ちます。たとえば、ポート番号が 5000 の場合、クライアントはこのポート番号 5000 でサーバーに要求を送信します。サーバーは要求を受け入れ、その情報(IPアドレス)をクライアントに送信します。これで接続が確立され、メッセージ交換を行うことができます。

Javaは、すべてのネットワークを処理するパッケージjava.net< / i>を提供します。必要なのは2つのクラスだけです:

    <>java.net.ServerSocket: このクラスは、clients.
  • java.net.Socket: このクラスはリモートマシンに接続します.
ストリームを入力、送信、受信するためのツールも必要です:
  • Scan: キーボード入力の読み取り.
  • BufferedReader: 送信者から受信したテキストを読み取る.
  • PrintWriter: 入力したテキストを送信します.
ServerSocket socketserver;
サーバーのソケットソケット。
final BufferedReader in;
final PrintWriter out;
final スキャナ sc=new Scanner(System.in);
try {
socketserver = new ServerSocket(5000);
serversocket = socketserver.accept();
out = new PrintWriter(serversocket.getOutputStream());
in = new BufferedReader(new InputStreamReader(serversocket.getInputStream()));
文字列 s;
s = sc.next();
out.println(s);
out.flush();
文字列message_client;
message_client = in.readLine();
System.out.println("クライアント: "+message_client);
}
catch (IOException e) {
e.printStackTrace();
}
ポート番号 5000 のサーバーソケットが作成されると、サーバーは着信接続を待機し、接続が検出されるとすぐにそれを受け入れます。読み取りと書き込みのフローを処理する 2 つの変数 in および out は、送受信ストリームに直接リンクされるように初期化されます.
変数 s next() で送信され、println(s).
flush() は、書き込みバッファを<出力にフラッシュするため重要です。宅配便 新品", "宅配便"、ミニバン;">null は他のマシンから受信されます.
変数 message_client メッセージを格納します  println().

このコードの制限は、メッセージを一度しか送受信できないことです。ループ while(true)です。これは事実ですが、たとえば、サーバーがクライアントにメッセージを送信した場合、クライアントも送信するまでメッセージを取得できません。最適な解決策は、送信用と受信用のスレッドの 2 つのスレッドを作成することです。どちらのプロセスでも、送信と受信を同時に行うことができます

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/*
* www.codeurjava.com
*/
public class Server {

public static void main(String[] test) {

final ServerSocket serverSocket;
final Socket clientSocket;
final BufferedReader in;
final PrintWriter out;
スキャナ sc=new Scanner(System.in);

{
serverSocket = new ServerSocket(5000);
clientSocket = serverSocket.accept();
out = new PrintWriter(clientSocket.getOutputStream());
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
スレッド send= new Thread(new Runnable() {
String msg;
@Override
public void run() {
while(true){
msg = sc.nextLine();
out.println(msg);
out.flush();
}
}
});
send.start();

スレッド receive= new Thread(new Runnable() {
String msg;
@Override
public void run() {
try {
msg = in.readLine();
//クライアントが接続されている限り
while(msg!=null){
System.out.println("Client: "+msg);
msg = in.readLine();
}
//クライアントが接続解除した場合はループを終了します
System.out.println("Client deconected");
//ストリームとセッションを閉じる socket
out.close();
clientSocket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
receive.start();
}catch (IOException e) {
e.printStackTrace();
}
}
}

2つのプロセスの分離は明確で、サーバーとクライアントはいつでも無限にデータを交換できます。再生のwhileループは、接続がまだ確立されているかどうかをテストします。ループを終了した後は、読み取りストリームと書き込みストリーム、および接続を close()です。

Client

Client に必要なのは Socket を使用して server 接続を確立しコンストラクタは、サーバーのIPアドレスとポート番号を入力として受け取ります。残りのコードはserver.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
/*
* www.codeurjava.com
*/
public class Client {

public static void main(String[] args) {

final Socket clientSocket;
final BufferedReader in;
final PrintWriter out;
final Scanner sc = new Scanner(System.in);//キーボードから読み込むには

try {
/*
* サーバー情報 ( ポートとIPアドレスまたはホスト名
* 127.0.0.1 はマシンのローカルアドレスです
*/
clientSocket = new Socket("127.0.0.1",5000);

//送信するストリーム
out = new PrintWriter(clientSocket.getOutputStream());
//受信するストリーム
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

スレッド送信 = new Thread(new Runnable() {
文字列 msg;
@Override
public void run() {
while(true){
msg = sc.nextLine();
out.println(msg);
out.flush();
}
}
});
send.start();

受信スレッド = new Thread(new Runnable() {
String msg;
@Override
public void run() {
try {
msg = in.readLine();
while(msg!=null){
System.out.println("サーバー: "+msg);
msg = in.readLine();
}
System.out.println("接続解除されたサーバー");
out.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
receive.start();

} catch (IOException e) {
e.printStackTrace();
}
}
}
Execution:

Java TCPソケットサーバー
サーバーウィンドウ
クライアントソケットtcp java
Client window
注: 同じマシンで作業している場合は、Eclipse を 2 回実行する必要があります (1 つはサーバー用、もう 1 つはクライアント用)。次のYouTubeビデオをご覧ください:
https://www.youtube.com/watch?v=d-eD6EDa3io


参照:
Java のネットワーク - IP アドレスの操作
サーバー/クライアントの名前とローカルIPアドレスを取得する方法
Openclassrooms: ソケット入門
Java doc: Socket