Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職

ServerSocketクラス

サーバー側のソケットを操作する – ServerSocketクラス
public ServerSocket(int port) throws IOException
port:ポート番号

ソケット通信では、通信を試みるコンピューター(クライアント)と待ち受けるコンピューター(サーバー)とが存在します。
サーバーソケットを表すのは、ServerSocketクラス(java.netパッケージ)の役割です。ServerSocketクラスの主なメソッドは、以下の通りです。

ServerSocketクラスの主なメソッド
メソッド 概要
Socket accept() 接続要求を待機
void bind(SocketAddress end) ソケットをバインド(endはバインド先のアドレス)
void close() ソケットを閉じる

たとえば、以下にサーバーソケットの最小限のコードを示します。クライアントからなんらかの入力を受け取ると、その値を大文字に変換したものをクライアントに返します。サーバー側には、入力された値をそのまま表示します。

SocketServer.java

package com.example.mynavi.socket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
  public static void main(String[] args) {
    // サーバーソケットを生成&待機
    try (ServerSocket server = new ServerSocket()) {
      server.bind(new InetSocketAddress("localhost", 8080));
      try (Socket socket = server.accept();
          BufferedReader reader = new BufferedReader(
            new InputStreamReader(socket.getInputStream()));
          PrintWriter writer = new PrintWriter(
            socket.getOutputStream(), true)) {
        // 入力を受け取ったら、大文字に変換の上で応答
        while (true) {
          String line = reader.readLine();
          if (line.equals("\q")) {
            break;
          }
          writer.println(line.toUpperCase());
          System.out.println(line);
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

↓

alpha
project	… クライアントから受け取った値を表示

※クライアント側の結果は以下を参照

ソケット固有の操作は太字の部分だけです。bindメソッドは、ソケットを指定のIPアドレス/ポート番号にバインドします。acceptメソッドは、クライアントからの要求を待機します。要求を受け付けたタイミングで、ソケット(Socketオブジェクト※)を取得します。
ソケットを取得できてしまえば、あとはこれをもとに、入力/出力のためのReader/Writerを生成し、読み込みや書き込みを行います。読み書きの方法については、「ストリーム」節で触れています。

関連ページ
Socket

ソケット通信
ServerSocketクラス
Socketクラス
URLConnectionクラス

Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職