サーチ…


前書き

ソケットは、同じマシン上で動作しているかどうかを問わず、主に2つのプログラム間の接続を作成するのに役立つ低レベルのネットワークインタフェースです。

ソケットプログラミングは、最も広く使用されているネットワーキングのコンセプトの1つです。

備考

インターネットプロトコルトラフィックには2種類あります。
1. TCP - 伝送制御プロトコル2. UDP - ユーザデータグラムプロトコル

TCPは接続指向のプロトコルです。
UDPはコネクションレスプロトコルです。

TCPは高い信頼性が要求されるアプリケーションに適しており、伝送時間は比較的重要ではありません。

UDPは、ゲームなどの高速で効率的な送信を必要とするアプリケーションに適しています。 UDPのステートレスな性質は、膨大な数のクライアントからの小さなクエリに答えるサーバーにも役立ちます。

簡単な言葉で -
データを失うことができない場合や、データの送受信に時間がかからない場合は、TCPを使用してください。時間を浪費したり、データの消失が問題にならない場合は、UDPを使用してください。

転送されたデータはそのままで、TCPの場合に送信されたのと同じ順序で到着するという絶対的な保証があります。
UDPで送信されるメッセージやパケットがまったく届かないという保証はありません。

シンプルなTCPエコーバックサーバ

私たちのTCPエコーバックサーバーは別のスレッドになります。それは始まりとして簡単です。あなたが送ったものを大文字で返します。

public class CAPECHOServer extends Thread{

    // This class implements server sockets. A server socket waits for requests to come 
    // in over the network only when it is allowed through the local firewall
    ServerSocket serverSocket;
    
    public CAPECHOServer(int port, int timeout){
        try {
            // Create a new Server on specified port.
            serverSocket = new ServerSocket(port);
            // SoTimeout is basiacally the socket timeout.
            // timeout is the time until socket timeout in milliseconds
            serverSocket.setSoTimeout(timeout);
        } catch (IOException ex) {
            Logger.getLogger(CAPECHOServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    @Override
    public void run(){ 
        try {
            // We want the server to continuously accept connections
            while(!Thread.interrupted()){
                
            }
            // Close the server once done.
            serverSocket.close();
        } catch (IOException ex) {
            Logger.getLogger(CAPECHOServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
}

今すぐ接続を受け入れる。 runメソッドを更新しましょう。

@Override
public void run(){ 
    while(!Thread.interrupted()){
        try {
            // Log with the port number and machine ip
            Logger.getLogger((this.getClass().getName())).log(Level.INFO, "Listening for Clients at {0} on {1}", new Object[]{serverSocket.getLocalPort(), InetAddress.getLocalHost().getHostAddress()});
            Socket client = serverSocket.accept();  // Accept client conncetion
            // Now get DataInputStream and DataOutputStreams
            DataInputStream istream = new DataInputStream(client.getInputStream()); // From client's input stream
            DataOutputStream ostream = new DataOutputStream(client.getOutputStream());
            // Important Note
            /*
                The server's input is the client's output
                The client's input is the server's output
            */
            // Send a welcome message
            ostream.writeUTF("Welcome!");
            
            // Close the connection
            istream.close();
            ostream.close();
            client.close();
        } catch (IOException ex) {
            Logger.getLogger(CAPECHOServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    // Close the server once done
    
    try {
        serverSocket.close();
    } catch (IOException ex) {
        Logger.getLogger(CAPECHOServer.class.getName()).log(Level.SEVERE, null, ex);
    }
}

今すぐあなたがtelnetを開いて接続を試みることができるなら、あなたはWelcomeメッセージを見るでしょう。

指定したポートとIPアドレスに接続する必要があります。

次のような結果が表示されます。

Welcome!

Connection to host lost.

さて、私たちが終了したため、接続が失われました。場合によっては、独自のTCPクライアントをプログラムする必要があります。この場合、ユーザーからの入力を要求してネットワークを介して送信し、大文字の入力を受け取るクライアントが必要です。

サーバーが最初にデータを送信する場合、クライアントは最初にデータを読み取る必要があります。

public class CAPECHOClient extends Thread{

Socket server;
Scanner key; // Scanner for input

    public CAPECHOClient(String ip, int port){
        try {
            server = new Socket(ip, port);
            key = new Scanner(System.in);
        } catch (IOException ex) {
            Logger.getLogger(CAPECHOClient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    @Override
    public void run(){
        DataInputStream istream = null;
        DataOutputStream ostream = null;
        try {
            istream = new DataInputStream(server.getInputStream()); // Familiar lines
            ostream = new DataOutputStream(server.getOutputStream());
            System.out.println(istream.readUTF());  // Print what the server sends
            System.out.print(">");
            String tosend = key.nextLine();
            ostream.writeUTF(tosend);   // Send whatever the user typed to the server
            System.out.println(istream.readUTF());  // Finally read what the server sends before exiting.
        } catch (IOException ex) {
            Logger.getLogger(CAPECHOClient.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                istream.close();
                ostream.close();
                server.close();
            } catch (IOException ex) {
                Logger.getLogger(CAPECHOClient.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

今すぐサーバーを更新する

ostream.writeUTF("Welcome!");
            
String inString = istream.readUTF();    // Read what the user sent
String outString = inString.toUpperCase();  // Change it to caps
ostream.writeUTF(outString);
            
// Close the connection
istream.close();

そして今、サーバーとクライアントを実行します。これに類似した出力が必要です

Welcome!
>


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow