注目記事

【Javaコード入門】ソケット通信_①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
  1. package com.example.mynavi.socket;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.InetSocketAddress;
  7. import java.net.ServerSocket;
  8. import java.net.Socket;
  9.  
  10. public class SocketServer {
  11.   public static void main(String[] args) {
  12.     // サーバーソケットを生成&待機
  13.     try (var server = new ServerSocket()) {
  14.       server.bind(new InetSocketAddress("localhost", 8080));
  15.       try (var socket = server.accept();
  16.           var reader = new BufferedReader(
  17.             new InputStreamReader(socket.getInputStream()));
  18.           var writer = new PrintWriter(
  19.             socket.getOutputStream(), true)) {
  20.         // 入力を受け取ったら、大文字に変換の上で応答
  21.         while (true) {
  22.           var line = reader.readLine();
  23.           if (line.equals("\q")) {
  24.             break;
  25.           }
  26.           writer.println(line.toUpperCase());
  27.           System.out.println(line);
  28.         }
  29.       }
  30.     } catch (Exception e) {
  31.       e.printStackTrace();
  32.     }
  33.   }
  34. }

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

※クライアント側の結果は「Socketクラス」を参照

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

関連ページ

ソケット通信_目次
ServerSocketクラス
Socketクラス

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。