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

Javaを用いたソケット通信 前編

More than 1 year has passed since last update.

Introduction

現在,Javaを用いた通信プログラムを作成しています.
しかし,OSIモデルや計算機の知識も乏しい僕にとっては,様々なドキュメントを読んでも理解しきれない部分が多いです.そこで今回は,ソケットプログラミングの仕組みをソースコード通して考えていこうと思います.間違っている部分もあると思うので,そこはご了承ください...

What is Socket?

そもそもソケット(socket)とは

ソケットとは,受け口、軸受け、接合部、穴、へこみなどの意味
e-words

です.要するにネットワーク通信におけるソケットとはサーバー/クライアントが用意するデータの窓口のようなものなのです.

アプリケーションが通信するためには,IPアドレス(住所)とTCPポート(番地)が基本的に必要となります.ソケット通信では,ある特定の住所+番地へ向かう道を作ってくれるのです.

How can we implment in server?

では実際のソースコードを見ていきましょう.
サーバー側でソケット通信を開始するためには,以下のコードで手っ取り早く試験できます.

  • ポートを設定
  • ServerSocket インスタンスを作成
  • Threadの継承クラスを作成しメソッドrun()を実行
server.java
import java.io.*;
import java.net.*; //ServerSocket Class are defined
import java.util.*;

public class sample_server2
{
    //PORT Number
    public static final int PORT = 10000; //待ち受けポート番号

    public static void main(String[] args)
    {
        sample_server2 sm = new sample_server2();

        try{
            ServerSocket ss = new ServerSocket(PORT);

            System.out.println("Waiting now ...");
            while(true){
                try{
                    //サーバー側ソケット作成
                    Socket sc = ss.accept();
                    System.out.println("Welcom!");

                    ConnectToClient cc= new ConnectToClient (sc);
                    cc.start();
                }
                catch(Exception ex)
                {
                    ex.printStackTrace();
                    break;
                }
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

//java.lang Package
class ConnectToClient extends Thread
{
    private Socket sc;
    private BufferedReader br;
    private PrintWriter pw;

    //コンストラクタ
    public Client(Socket s)
    {
        sc = s;
    }

    //スレッド実行
    public void run()
    {
        try{
            //クライアントから送られてきたデータを一時保存するバッファ(受信バッファ)
            br = new BufferedReader(new InputStreamReader(sc.getInputStream()));
            //サーバがクライアントへ送るデータを一時保存するバッファ(送信バッファ)
            pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sc.getOutputStream())));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        while(true){
            try{
                //受信バッファからデータを読み込む(今回は文字列)
                String str = br.readLine();
                System.out.println(str);
                Random rnd = new Random();
                RamdomStrings rs = new RamdomStrings();
                //クライアントからのメッセージの語尾+ランダムな文字配列を送信バッファへ渡す
                pw.println("Server : [" + str.charAt(str.length()-1) + rs.GetRandomString(rnd.nextInt(10)) + "] (^_^)!");
                //ここが重要!flushメソッドを呼ぶことでソケットを通じてデータを送信する
                pw.flush();
            }
            catch(Exception e){
                try{
                    br.close();
                    pw.close();
                    sc.close();
                    System.out.println("Good Bye !!");
                    break;
                }
                catch(Exception ex){
                    ex.printStackTrace();
                }

            }
        }
    }
}

class RamdomStrings{
    private final String stringchar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private Random rnd = new Random();
    private StringBuffer sbf = new StringBuffer(15); 

    public String GetRandomString(int cnt){
        for(int i=0; i<cnt; i++){
            int val = rnd.nextInt(stringchar.length());
            sbf.append(stringchar.charAt(val));
        }

        return sbf.toString();
    }
}

次回へ続きます.
Javaを用いたソケット通信 後編

Reference

高橋麻奈:"『やさしいJava』活用編 第5版"

akatsubaki
Software development is my job. I usually use Spring Boot, Bash, JavaScript as programming language. Also some useful tools like GitLab are integrated in development process.
Why not register and get more from Qiita?
  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