Help us understand the problem. What is going on with this article?

Java通信APIのまとめ(三)SocketChannelの使い方

1.はじめに

今回はSocketChannelの使い方を簡単にまとめてみます。
流れは以下のようにご参照ください。

  • クライアント

1.SocketChannelを経由でサーバーを接続

2.データバッファを用意してサーバーへ書き出す/読み込

3.SocketChannelをクローズ

  • サーバー

1.iPアドレスとポートをバインドする

2.ServerSocketChannelImpl.accept()メソッドでSocketChannelのインスタンスをもらう

3.データバッファを用意してクライアントへ書き出す/読み込

4.SocketChannelとServerSocketChannelをクローズ

じゃあ、こらから、クライアントとサーバーの通信デモを作ろう

2.クライアント

ソースコードは以下の通りです。

package socketchannel;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class WebClient {
  public static void main(String[] args) throws IOException {

        //1.SocketChannelのopen()メソッドでSocketChannelインスタンスを作ろう
        SocketChannel socketChannel = SocketChannel.open();

        //2.サーバーへ接続
        socketChannel.connect(new InetSocketAddress("127.0.0.1", 3333));

        //3.サーバーへ送信のデータを準備する
        ByteBuffer writeBuffer = ByteBuffer.allocate(128);
        writeBuffer.put("hello WebServer this is from WebClient".getBytes());
        writeBuffer.flip();
        socketChannel.write(writeBuffer);
        ByteBuffer readBuffer = ByteBuffer.allocate(128);
        socketChannel.read(readBuffer);
        StringBuilder stringBuffer=new StringBuilder();

        //4.サーバーからのデータを受け取り
        readBuffer.flip();
        while (readBuffer.hasRemaining()) {
            stringBuffer.append((char) readBuffer.get());
        }
        System.out.println("サーバーからのメッセージ:"+stringBuffer);
        socketChannel.close();
     }
}

3.サーバー

サーバー側のソースコードは以下の通りです。

package socketchannel;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

public class WebServer {
public static void main(String args[]) throws IOException {
    try {

        //1.ServerSocketChannelのopen()メソッドでServerSocketChannelのインスタンスを作ろう
        ServerSocketChannel ssc = ServerSocketChannel.open();

        //2.ipとportをバインド
        ssc.socket().bind(new InetSocketAddress("127.0.0.1", 3333));

        //ServerSocketChannelImplのaccept()メソッドでSocketChannelインスタンスをもらってクライアントへの書き読み
        SocketChannel socketChannel = ssc.accept();

        //3.書き出すデータを準備する
        ByteBuffer writeBuffer = ByteBuffer.allocate(128);
        writeBuffer.put("hello WebClient this is from WebServer".getBytes());
        writeBuffer.flip();
        socketChannel.write(writeBuffer);
        ByteBuffer readBuffer = ByteBuffer.allocate(128);

        ////4.読み込むデータを準備する
        socketChannel.read(readBuffer);
        StringBuilder stringBuffer=new StringBuilder();

        readBuffer.flip();
        while (readBuffer.hasRemaining()) {
            stringBuffer.append((char) readBuffer.get());
        }
        System.out.println("クライアントからのデータを受け取り:"+stringBuffer);
        socketChannel.close();
        ssc.close();
    } catch (IOException e) {
        e.printStackTrace();
      }
  }
}

まあ、上記のデモを実行したら、うまくいれば、結果は以下のように出ていく。
サーバー

4.最後に

最後まで読んでいただき、ありがとうございます。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away