[Java]ソケットからデータを受信(その2:タイムアウト処理付き)

Javaでソケットからのデータ受信、その2です。

前回とほぼ同じ処理ですが、クライアントからの接続、および接続後のデータ受信でタイムアウト処理を設けて有ります。接続待ちでは3秒、データ受信は2秒以内にクライアントからの操作が行われないと、タイムアウトが発生したとみなしています。
基礎からわかるTCP/IP Javaネットワークプログラミング


package com.nanoappli.test;
 
import java.io.*;
import java.net.*;
import java.util.Arrays;
 
public class HelloWorld2
{
    public static void main( String args[] ) {
        int READ_BUFF_LEN = 2000;
        System.out.println( "start" );
        try {
            byte []readBuff = new byte[ READ_BUFF_LEN ];
            ServerSocket socket = new ServerSocket( 4949, 1, InetAddress.getByName( "192.168.1.1" ) );
 
            /*----------------------------------*/
            /* クライアントからの接続待ちに入る */
            /*----------------------------------*/
            while( true ) {
                Socket clientSocket;
                System.out.println( "接続待ち:" + socket.toString() );
                socket.setSoTimeout( 3000 );
                try {
                    System.out.print( "wait" );
                    clientSocket = socket.accept();
                } catch( SocketTimeoutException ex ) {
                    System.out.println( "-> 接続タイムアウトが発生しました. " );
                    continue;
                }
 
                System.out.println( "接続しました:" );
 
 
                /*----------------------------------*/
                /* データの受信を行う               */
                /*----------------------------------*/
                clientSocket.setSoTimeout( 2000 );
                InputStream inStream = clientSocket.getInputStream();
                int inputLen;
                int readPos = 0;
                while ( readPos < 10 ) {
                    System.out.print( "wait2" );
                    try {
                        inputLen = inStream.read( readBuff, readPos, READ_BUFF_LEN-readPos );
                    } catch( SocketTimeoutException ex ) {
                        System.out.println( "-> 受信タイムアウトが発生しました " );
                        continue;
                    }
                    System.out.println( "read:" + String.valueOf( inputLen ) );
                    readPos += inputLen;
                }
 
 
 
                /*--------------------------*/
                /* 受信したデータを表示する */
                /*--------------------------*/
                byte []readBuff2 = Arrays.copyOfRange( readBuff, 0, readPos );
                System.out.println( "データを受信しました:" + new String( readBuff2, "Windows-31J" ) );
 
 
                /*------------------------*/
                /* ソケットをクローズする */
                /*------------------------*/
                clientSocket.close();
 
            }
 
        } catch( Exception ex ) {
            ex.printStackTrace();
        }
        System.out.println( "end" );
    }
}



TCP/IPソケットプログラミング Java編

関連記事

コメントを残す

メールアドレスが公開されることはありません。