guccii_txpのプロフィール

@guccii_txp guccii_txp
ありがとう数5
質問数0
回答数11
ベストアンサー数
3
ベストアンサー率
60%
お礼率
0%

  • 登録日2009/07/01
  • メッセージを受信したら受信終了したい

    TCPでスループットを測定するプログラムを作っています。 データの受信を終了するには、送信側がソケットをクローズして、 受信側のread()メソッドが-1を返すのが主流だと考えていますが、 私のプログラムでは、受信した後に受信側から送信側へデータを返信したいため、 ソケットをクローズすることで受信終了というようにしたくないです。 また、受信したバイト数をread(buf,int,int)の戻り値で取得したいです。 私が考えている方法としては、送信側で「finish」というメッセージを送信したら、 受信側で受信を終了させようと考えました。 read(buf,int,int)はbufに受信したバイトを格納すると思います。格納されたバイトの最後から6個を確認させ、 finishならば受信終了にすればよいと考えました。 送信側のコードは下のようにしました。 String signal = "finish"; byte[] signal_buf = signal.getBytes(); send_start = System.nanoTime(); for (int i = 0; i < Data-6; i++) {   try {     out.write(i);     out.flush();   } catch (IOException e) {     System.err.println(e);   } } out.write(signal_buf); out.flush(); send_stop = System.nanoTime(); System.out.println("送信完了"); 受信側は、finishを読み込んだらループを抜けるようにしたいです。 recv_start = System.nanoTime(); for(;;){   part = in.read(buf);   if(part > 0)     total += part;   if(finishを読み込んだら){     break;   } } recv_stop = System.nanoTime(); どのようにしてfinishを読み込んだことを認識させれば良いでしょうか? ・合図となるメッセージにより受信を終了すること、 ・read(buf,int,int)の戻り値で読み込んだバイト数を取得すること、 この2点を絶対に削りたくないのです。 どうすればよいか、アドバイスをいただけないでしょうか?

    • ベストアンサー
    • debukawa
    • Java
    • 回答数2
  • メッセージを受信したら受信終了したい

    TCPでスループットを測定するプログラムを作っています。 データの受信を終了するには、送信側がソケットをクローズして、 受信側のread()メソッドが-1を返すのが主流だと考えていますが、 私のプログラムでは、受信した後に受信側から送信側へデータを返信したいため、 ソケットをクローズすることで受信終了というようにしたくないです。 また、受信したバイト数をread(buf,int,int)の戻り値で取得したいです。 私が考えている方法としては、送信側で「finish」というメッセージを送信したら、 受信側で受信を終了させようと考えました。 read(buf,int,int)はbufに受信したバイトを格納すると思います。格納されたバイトの最後から6個を確認させ、 finishならば受信終了にすればよいと考えました。 送信側のコードは下のようにしました。 String signal = "finish"; byte[] signal_buf = signal.getBytes(); send_start = System.nanoTime(); for (int i = 0; i < Data-6; i++) {   try {     out.write(i);     out.flush();   } catch (IOException e) {     System.err.println(e);   } } out.write(signal_buf); out.flush(); send_stop = System.nanoTime(); System.out.println("送信完了"); 受信側は、finishを読み込んだらループを抜けるようにしたいです。 recv_start = System.nanoTime(); for(;;){   part = in.read(buf);   if(part > 0)     total += part;   if(finishを読み込んだら){     break;   } } recv_stop = System.nanoTime(); どのようにしてfinishを読み込んだことを認識させれば良いでしょうか? ・合図となるメッセージにより受信を終了すること、 ・read(buf,int,int)の戻り値で読み込んだバイト数を取得すること、 この2点を絶対に削りたくないのです。 どうすればよいか、アドバイスをいただけないでしょうか?

    • ベストアンサー
    • debukawa
    • Java
    • 回答数2
  • 同期化時のことで

    いつもお世話になっています。 同期化を使用した場合のことで質問します。 private static final List<String> list = Collections.synchronizedList(new ArrayList<String>() ); を使いサーブレットでの同期化を実行しているのですが、 この場合に、値をソート化して処理を実行することは可能なのでしょうか? Collectionsを調べると、可能性としてsynchronizedSetだとできそうな気はするのですが、 その際の直列化の実装がよくわかりません。 考えているソースは以下です。 ** ラップオブジェクト同期化 **/ SortedSet sort = Collections.synchronizedSortedSet(new TreeSet<String>() ); /** サーブレットクラスでの処理 **/ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //リクエストデータ String key = request.getParameter("key"); //リクエストデータをSortedSetに格納する sort.add(key); //←この時点で、直列化のための何らかの処理がいる try{ //実行時、時間をずらすために宣言 Thread.sleep(1000); }catch(Exception e){ } //何の処理もしなかったら、実行された画面の順で処理が開始される synchronized(sort){ for(int a=0;a<10;a++){ System.out.println("a="+a); } } //SortedSetに格納された値の順 List sortList = new ArrayList(sort); for(int s=0;s<sortList.size();s++ ){ //↓すべての処理が終わってみたら、確かにソート化されているs System.out.println("sortList["+s+"]="+sortList.get(s)); } } jsp側のリクエストデータ 1回目 C 2回目 B 3回目 A 実行させたい順 C→A→B このとき、B,Aが渡されるタイミングは、Cの処理が実行中時 また、どのキーに対しての実行中なのかを見ることはできるのでしょうか? Collectionsクラスを見たところなさそうだったのですが。。。 宜しくお願いします。

    • ベストアンサー
    • kannitiha
    • Java
    • 回答数4
  • Javaでファイル転送プログラム

    Javaを用いてファイル転送プログラムを作成しています。 http://d.hatena.ne.jp/rintaromasuda/20060327/1143412352 を参考に作成したのですが、うまく転送できません。 プログラムは以下の通り。 ◎サーバ側 import java.net.*; import java.io.*; public class UMLFileServer { public static void main(String[] args) throws IOException{ if (args.length != 2) throw new IllegalArgumentException("An argument should be port and filename"); int servPort = Integer.parseInt(args[0]); String filename = args[1]; System.out.println("Output file name : " + args[1]); //Create FileOutputStream FileOutputStream fout = new FileOutputStream(filename); //Create ServerSocket ServerSocket servSock = new ServerSocket(servPort); int recvMsgSize; //int bufSize = servSock.getReceiveBufferSize(); int bufSize = 32; System.out.println("Size of ReceiveBuffer : " + bufSize); //Socket accepting loop while(true){ System.out.println("Wait for accepting... "); Socket clntSock = servSock.accept(); byte[] byteBuffer = new byte[bufSize]; System.out.println("Accepted client at " + clntSock.getInetAddress().getHostAddress() + " on port " + clntSock.getPort()); //Create InputStream InputStream in = clntSock.getInputStream(); //Read message and print it out int totalByte = 0; while((recvMsgSize = in.read(byteBuffer)) != -1){ System.out.println("Message : " + new String(byteBuffer,0,recvMsgSize)); System.out.println("Size : " + recvMsgSize); //Write to file totalByte = totalByte + recvMsgSize; fout.write(byteBuffer,0,recvMsgSize); } System.out.println("Recieved file size : " + totalByte); clntSock.close(); fout.close(); fout = null; } } } ◎クライアント側 import java.net.*; import java.io.*; public class UMLFileClient { public static void main(String[] args) throws IOException{ if (args.length != 3) throw new IllegalArgumentException("Arguments should be host,port and filepath"); String server = args[0]; int serverPort = Integer.parseInt(args[1]); String filename = args[2]; byte[] data = new byte[32]; //ソケットの作成 Socket socket = new Socket(server,serverPort); System.out.println("Connected to server"); //ストリームの作成 FileInputStream fin = new FileInputStream(filename); OutputStream out = socket.getOutputStream(); //ファイルの内容を読み出し、送信する System.out.println("Sending file : " + filename); int totalSize = 0; int len = 0; while ((len = fin.read(data)) != -1) { totalSize = totalSize + len; System.out.println(new String(data,0,len)); out.write(data, 0, len); } fin.close(); fin = null; System.out.println("size of file : " + totalSize); socket.close(); } } ◎実行結果 Output file name : hiroyasu.txt Size of ReceiveBuffer : 32 Wait for accepting... Accepted client at 192.168.71.104 on port 36608 Recieved file size : 0 Wait for accepting... 以上です。どなたか解決方法をご教授ください。

    • ベストアンサー
    • santa1359
    • Java
    • 回答数2
  • Javaでファイル転送プログラム

    Javaを用いてファイル転送プログラムを作成しています。 http://d.hatena.ne.jp/rintaromasuda/20060327/1143412352 を参考に作成したのですが、うまく転送できません。 プログラムは以下の通り。 ◎サーバ側 import java.net.*; import java.io.*; public class UMLFileServer { public static void main(String[] args) throws IOException{ if (args.length != 2) throw new IllegalArgumentException("An argument should be port and filename"); int servPort = Integer.parseInt(args[0]); String filename = args[1]; System.out.println("Output file name : " + args[1]); //Create FileOutputStream FileOutputStream fout = new FileOutputStream(filename); //Create ServerSocket ServerSocket servSock = new ServerSocket(servPort); int recvMsgSize; //int bufSize = servSock.getReceiveBufferSize(); int bufSize = 32; System.out.println("Size of ReceiveBuffer : " + bufSize); //Socket accepting loop while(true){ System.out.println("Wait for accepting... "); Socket clntSock = servSock.accept(); byte[] byteBuffer = new byte[bufSize]; System.out.println("Accepted client at " + clntSock.getInetAddress().getHostAddress() + " on port " + clntSock.getPort()); //Create InputStream InputStream in = clntSock.getInputStream(); //Read message and print it out int totalByte = 0; while((recvMsgSize = in.read(byteBuffer)) != -1){ System.out.println("Message : " + new String(byteBuffer,0,recvMsgSize)); System.out.println("Size : " + recvMsgSize); //Write to file totalByte = totalByte + recvMsgSize; fout.write(byteBuffer,0,recvMsgSize); } System.out.println("Recieved file size : " + totalByte); clntSock.close(); fout.close(); fout = null; } } } ◎クライアント側 import java.net.*; import java.io.*; public class UMLFileClient { public static void main(String[] args) throws IOException{ if (args.length != 3) throw new IllegalArgumentException("Arguments should be host,port and filepath"); String server = args[0]; int serverPort = Integer.parseInt(args[1]); String filename = args[2]; byte[] data = new byte[32]; //ソケットの作成 Socket socket = new Socket(server,serverPort); System.out.println("Connected to server"); //ストリームの作成 FileInputStream fin = new FileInputStream(filename); OutputStream out = socket.getOutputStream(); //ファイルの内容を読み出し、送信する System.out.println("Sending file : " + filename); int totalSize = 0; int len = 0; while ((len = fin.read(data)) != -1) { totalSize = totalSize + len; System.out.println(new String(data,0,len)); out.write(data, 0, len); } fin.close(); fin = null; System.out.println("size of file : " + totalSize); socket.close(); } } ◎実行結果 Output file name : hiroyasu.txt Size of ReceiveBuffer : 32 Wait for accepting... Accepted client at 192.168.71.104 on port 36608 Recieved file size : 0 Wait for accepting... 以上です。どなたか解決方法をご教授ください。

    • ベストアンサー
    • santa1359
    • Java
    • 回答数2