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編
関連記事
コメントを残す