JavaでのネットワークプログラミングにおけるArrayListの変換方法について

このQ&Aのポイント
  • 現在、javaでソケットを使ったネットワークプログラミングを行っています。クライアントからサーバーに数値を送ってサーバーのArrayListに格納し、そのリストをクライアント側のArrayListに格納し、数字を出力したいですが、型の変換がうまくいきません。
  • サーバー側で受け取った数値をクライアント側のArrayListに格納するためには、型の変換が必要です。送られてきた数値をString型から適切な型に変換し、クライアントのArrayListに格納してください。
  • また、サーバーからクライアントへArrayListを送信するためには、ArrayListをString型に変換する必要があります。送信時に適切な変換方法を使ってArrayListを送信し、クライアントで受信する方法を検討してください。
回答を見る
  • ベストアンサー

streamで送信されたArrayListを変換したい

以前ネットワークプログラミングについて質問したものです。 現在もjavaでソケットを使ったネットワークプログラミングを行っています。 現在、クライアントからサーバーに数値を送ってサーバーのArrayListのPOINTに格納しています。 そして、そのPOINTをstreamをつかってクライアントに送ってそのリストをクライアント側のArrayListに格納し、数字を出力しようと思っています。 しかし受け取ったPOINTをクライアント側のArrayListに格納しようとしても型が違う(stringだから)ので、うまく変換したいのですがうまくいきません。 送られてきたものをうまく型変換しクライアントのArrayListに格納する、また送信時にうまくArrayListを送信しクライアントで受信する方法はないでしょうか? サーバー PrintWriter out = new PrintWriter(((Socket) e.nextElement()).getOutputStream()); out.println(POINT); クライアント BufferedReader in; buff = in.readLine(); StringTokenizer st = new StringTokenizer(line); String cmd = st.nextToken(); CLPOINT = cmd; このような形で送信しています。 よい方法があればよろしくお願いします。

  • eve21
  • お礼率100% (3/3)
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

サーバー側でPrintWriterに書いてますからストリームには文字列が流れてますね。 実のところ > out.println(POINT); は < out.println(POINT.toString()); と同じわけですが、POINTがArrayList型だとArrayListには文字列からオブジェクトを復元するメソッドはないので何らかの手段で文字列を解析して復元してやらなければいけませんね。 代替策としては出力にObjectOutputStreamを使ってObjectInputStreamで受けることでしょう。ArrayListならjava.io.Serializableインタフェースを実装しているので上手くいくんじゃないかと思います。 ストリームにはバイナリデータが流れることになりますけどね。

eve21
質問者

お礼

rinkunさん回答ありがとうございます。 前回もお世話になりました。 出力ストリームにObjectOutputStreamというものがあったのはしりませんでした。早速試してみようと思います。 ありがとうございます。

関連するQ&A

  • StringTokenizerについて(エラー)

     java初心者です。この度、突貫工事でjavaのネットワークプログラムを作らねばならず、本などを参考にしながら独学でサーバーとクライアントを作成しています。 クライアントは正常に稼働するようなのですが、サーバーにはStringTokenizerの使い方に問題があるらしく、NullPointerExceptionというエラーが出て受信がうまくできません。(以下、エラーが検出される個所を抜粋) …………… ////runメソッド //クライアント処理スレッドの本体です public void run(){ try{ //logout受信まで繰り返します while(true){ //クライアントからのコマンドを読み取ります String line = in.readLine(); //nameが空の場合にはログインコマンドのみを受け付けます。 if(name == null){ StringTokenizer st= new StringTokenizer(line);////エラー箇所 String cmd = st.nextToken(); if("login".equalsIgnoreCase(cmd)){ name = st.nextToken(); server.loginUser(name);//loginメソッドへ } }else{ //nameが空でない場合はログイン済みなのでコマンドを受け付けます。 StringTokenizer st = new StringTokenizer(line); String cmd=st.nextToken();//コマンドの取り出し if("logout".equalsIgnoreCase(cmd)){ server.logoutUser(name);//logoutメソッドへ break;//logoutの場合にはループを終了します。 } } } ……………… 提出期限が迫っており、また、周囲にjavaの心得がある人がいないので困っています。不勉強で申し訳ありませんが、どなたか回答宜しくお願いします。 追伸:プログラムに関する知識が乏しいので用語の使い方が間違っているかもしれませんがご容赦ください。。。

  • 文字化けします。

    お世話になります。 ソケットでサーバとクライアントを接続しています。 コーディングの概略は次の通りです。 【クライアント】 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"EUC_JP")); out.println("かきくけこ"); System.out.println(in.readLine()); 【サーバ】 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"Shift_JIS")); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); out.println(inputLine); //←これはクライアントでも文字化けしない。 String s1 = "あいうえお"; String u1 = new String(s1.getBytes("xxxxx"), "yyyyy"); out.println(u1); //←文字化けする。 } お伺いしたいのは文字コード変換についてです。 サーバ:RedhatLinux クライアント:Windowsでして、 サーバ側コーディングの String s1 = "あいうえお"; としている文字列を クライアント側の // 読み込んだデータを表示 System.out.println(in.readLine()); で表示したいのですが、文字が化けて(????←このようになります)困っています。 文字コード変換しなければいけないと思うのですが、 getBytesを使うのでしょうか? もしgetBytesを使うならどのように書けばいいのかがわかりません。 分かりにくい説明で申し訳ありませんが、 ご教授ください。宜しくお願いします。

    • ベストアンサー
    • Java
  • ArrayListを利用する問題

    問題 1.ArrayListのオブジェクトを生成する。 2.「何回入力しますか?」と出力し、標準入力をおこなう。 3.2で入力した回数分、以下の処理を繰り返す。 「n個目の値を入力してください」と出力し、標準入力を行う。(n=ループ回数) 入力された値をArrayListへ格納する。 4.ArrayListのサイズ分、以下の処理を繰り返す。 ArrayListより値を取得する。 取得した値を出力する。 結果 何回入力しますか? 3 1個目の値を入力してください。 hoge 2個目の値を入力してください。 poyo 3個目の値を入力してください。 hoo hoge poyo hoo 自分で書いたプログラム 1 import java.util.ArrayList; 2 import java.io.*; 3 4 class ArrayList2{ 5 public static void main(String[] args) throws IOException{ 6 7 ArrayList list = new ArrayList(); 8 list.add(n); 9 10 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 11 12 System.out.println("何回入力しますか?"); 13 14 String str = br.readLine(); 15 16 int num = Integer.parseInt(str); 17 18 for(int i = n ; i < num; i++){ 19 System.out.println("n個目の値を入力してください。"); 20 21 String str1 = br.readLine(); 22 23 } 24 } 25 } どうもうまくいきませんので教えて下さい。

  • javaプログラミングの質問です。

    http://questionbox.jp.msn.com/qa1030602.html?StatusCheck=ON に載っている、プログラムを以下のようにQuestionというクラスで実行してみたところ、 import java.io.*; class Question{ public static void main(String Args[]){ BufferedReader reader = null; String strArray[][] = new String[4][4]; String fileName = "foo.txt"; int i = 0; int j = 0; try{ reader = new BufferedReader ( new FileReader(fileName) ); String line; while ( (line = reader.readLine() ) != null ){ StringTokenizer st = new StringTokenizer ( line ); while ( st.hasMoreTokens() ){ strArray[i][j] = st.nextToken(); System.out.print ( strArray[i][j] + " " ); j ++; } j = 0; i ++; System.out.println (""); } } catch ( Exception e ){ System.out.println ( e.toString() ); } } } Exception in thread "main" java.lang.Error: コンパイル問題が未解決です。 StringTokenizer を型に解決できません。 StringTokenizer を型に解決できません。 というエラーが出ます。 このサイトの質問者はうまくいっているようなのですが、私のコンパイラがうまく動いていないのでしょうか? java version "1.6.0_07" を使っていて、Eclipseを用いてコンパイルをしたりしています。 どなたかご指摘をどうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 「型 ArrayList は総称ではありません・・・。」エラーについての問題です。

    コンニチハ、javaの初心者s-unです。 Eclipse(Ver:3.1.1)でJavaのプログラムを書いています。 *********************************** import java.util.ArrayList; class collectionTest1{ public static void main(String args[]){ ArrayList<String> array = new ArrayList<String>(); } } *********************************** エラーメッセージは 「型 ArrayList は総称ではありません。引数 <String> でパラメーター化できません。」 JDK準拠>>コンパイラー準拠レベル5.0になっています。 原因をお教え頂けますと幸いです。 よろしくお願い申し上げます。

    • ベストアンサー
    • Java
  • ArrayListについて教えてください

    ArrayListについて教えてください Java初心者です。 現在あるJavaの問題を解いていて、つまづいてしまいました。 わかる方、ご教示お願いします。 以下問題 ****************************************************************** 以下2メソッドを持つShikenKekkaクラスを作成せよ ・学籍No,科目,点数を登録する void Toroku(String 学籍No , Kamoku 科目 , int 点数); ・引数で指定した学籍No,科目の点数を返す int getTensu(String 学籍No,Kamoku 科目); 科目は以下の定義 enum Kamoku{KOKUGO,SANSU,RIKA} 使用例として、 ShikenKekka sk = new ShikenKekka(); sk.Toroku("0A01",Kamoku.KOKUGO,70); sk.Toroku("0A01",Kamoku.SANSU ,60); sk.Toroku("0A01",Kamoku.RIKA ,50); sk.Toroku("0B02",Kamoku.KOKUGO,75); sk.Toroku("0B02",Kamoku.SANSU ,65); sk.Toroku("0B02",Kamoku.RIKA ,55); int point = sk.getTensu("0B02",Kamoku.RIKA); ****************************************************************** ArrayListを使って値を格納しようとしているのですが、 ArrayListの使い方がうまくできません。 学籍No,科目,点数の3つの値をどうすれば格納して保持できるのか、 教えていただけると助かります わかりずらい説明で申し訳ありません。

  • ArrayListによる計算表作成

    for文を使用し九九の計算結果を配列に格納し、その配列内の情報を表形式で表示してみる。※配列はArrayListを使用すること 上記の問題を解いています。 -------------------------------------------------------------- import java.util.ArrayList; public class m4_2 { public static void main(String args[]) { ArrayList list = new ArrayList(); String[]s = new String[9]; for(int i = 1; i<=s.length; i++){ for(int j =1; j<=s.length; j++){ list.add((i * j));     //ここがどのように記述するか?? } System.out.print(list.get(0)); System.out.print(list.get(1)); System.out.print(list.get(2)); System.out.print(list.get(3)); System.out.print(list.get(4)); System.out.print(list.get(5)); System.out.print(list.get(6)); System.out.print(list.get(7)); System.out.print(list.get(8)); System.out.print("\n"); } } } ---------------------------------------------------------- 実行結果イメージ 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 (以下省略) 私の書いたソースでは1の位しか計算してくれません。 今月から本格的にJavaを勉強し始めた初心者なので どうかよろしくお願いいたします。

    • ベストアンサー
    • Java
  • VC#2010 ArrayListに入れた要素の型

    こんにちは。ArrayListに異なる型のクラスを入れて、後からそれがどの型か判断してから処理しようとしているのですが、エラーになってしまいます。 //ベースオブジェクトクラス class BaseObj { string path; BaseObj(string p){path = p:} } //製品Aクラス BaseObjを継承 class ProductA : BaseObj { ProductA(string p) : base(p) {} } //製品Bクラス BaseObjを継承 class ProductB : BaseObj { ProductB(string p) : base(p) {} } ------------------------------------------- ArrayList ObjList;//オブジェクトを格納する ProductA A = new ProductA(@"C:\"); ProductB B = new ProductB(@"D:\"); ObjList.Add(A); ObjList.Add(B); ------------------------------------------- //ここでは、0番目にAが入ってると分かっているのでAかBか調べる処理は省いてます。 MessageBox.Show'((ProductA)ObjList[0]).path); 上記メッセージボックスのところで、 型 'System.Collections.Generic.List`1[Application.ProductA]' のオブジェクトを型 'Application.ProductA' にキャストできません。 というエラーになってしまいます。これはどうしてなのでしょうか?

  • サーブレットで文字化け

    サーバ Fedora Core 6 / tomcat5.5 クライアントもFedoraなら文字化けしません。 ウィンドウズxpから接続すると文字化けします。 アプレットのプログラムで送信する関数のみ抜粋した。引数sが送信する文字列でこれが文字化けします。送信した変数sをJLabelで表示するとウィンドウズでも文字化けしてなかった。そしてサーバー側のログは文字化けしていたのですが原因がわかりません。どうしたらいいですか? //■アプレット側 文字列送信用関数 public void send(String s) { try { sock = new Socket(サーバのIPアドレス,9999); //■サーバーに接続 fin = sock.getInputStream(); fout = sock.getOutputStream(); ffin = new InputStreamReader(fin); in = new BufferedReader(ffin); out = new PrintWriter(fout,true); out.println("POST / HTTP/1.1"); out.println("Accept: */* "); out.println("Accept-Language: ja"); out.println("Accept-Encoding: gzip,deflate"); out.println("User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); out.println("Host: "+getParameter("ipAddress")); out.println("Content-Type: application/x-www-form-urlencoded; charset=UTF-8"); out.println("Content-Length: "+(s.getBytes("UTF-8").length)); out.println("Connection: Keep-Alive"); out.println(""); out.println(s); } catch(IOException e) { } } サーバー側 変数sの表示 public void service(HttpServletRequest req, HttpServletResponse res)throws ServletException,IOException { //■通信関係 PrintWriter out; BufferedReader in; //■入力した文字列 String st,str; try { //■通信開始 in = new BufferedReader(new InputStreamReader(req.getInputStream())); out = new PrintWriter(res.getOutputStream(),true); //■文字列読み込み st = in.readLine(); str = new String(st.getBytes("UTF-8")); System.out.println("受信した文字列"+str);

  • ArrayListに多次元配列

    ArrayListに多次元配列の変数を格納したのですが、取り出し方がわからず困っています。 ----------------------------------------------- String[][] str = {{"aaa","bbb","ccc","ddd","eee","fff"}, {"aaa","bbb","ccc","ddd","eee","fff"}, }}; ArrayList array = new ArrayList(); array.add(str[0]); array.add(str[1]); ----------------------------------------------- 上記の場合で、str[0][2];を取得する方法がわかりません。 java初心者なのでおかしな質問かもしれませんが、宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう