• 締切済み

ソケット通信について

自分はJAVAで、クライアント・サーバ形式の ネットワークゲームを作ろうとしているのですが、 チャットシステムで BufferedReader NetInput; // ネットワーク経由入力ストリーム PrintStream NetOutput; // ネットワーク経由出力ストリーム Socket socket; // ソケット ChatServer chatserver; // ChatServerオブジェクト int clientnumber; // クライアント番号 ChatClient(Socket socket, ChatServer chatserver, int clientnumber) { this.socket = socket; this.chatserver = chatserver; this.clientnumber = clientnumber; try { InputStream inputstream = socket.getInputStream( ); NetInput = new BufferedReader(new InputStreamReader(inputstream)); OutputStream outputstream = socket.getOutputStream( ); NetOutput = new PrintStream(outputstream); } catch(Exception e) { System.out.println("->" + e); } } // メッセージ送信 ------------------------ synchronized void sendMessage(String message) { NetOutput.println(message); // サーバからクライアントに送信 NetOutput.flush( ); } とString型の文字列messageを送受信し合う様に、 int型の配列や、boolean型の配列を送受信する方法があったら 教えていただきたいです。

  • Java
  • 回答数2
  • ありがとう数3

みんなの回答

noname#49428
noname#49428
回答No.2

javaのストリームについて勉強してください。

参考URL:
http://www.stackasterisk.jp/tech/java/IOapi01_01.jsp
nitouhei_2
質問者

お礼

わかりました! もっと自分で頑張らないとダメですよね。。。 どうもありがとうございました!!

noname#49428
noname#49428
回答No.1

java.io.DataInputStream java.io.DataOutputStream を使えばいいと思います。

nitouhei_2
質問者

お礼

お早い回答有難うございます! こんなに早く回答してくれると思ってなかったので とても嬉しいです!! 大変お手数なのですが、 出来ればコレの使用方法(宣言の仕方等)を 簡単に教えていただきたいのです。。。 InputStream inputstream = socket.getInputStream( ); を DataInputStream inputstream = socket.getDataInputStream( ); と変えただけでは、"getDataInputStream()は型Socketで未定義です" ってエラーが出てしまいました。。。

関連するQ&A

  • 初歩的なソケット通信(java)

    初歩的なソケット通信(java) javaのソケット通信プログラムについて質問させて頂きます。まだまだ基礎の段階なのですが、詰まってしまたので、良かったら教えてください。 以下プログラムコード ------------------------------------- //サーバー側 import java.net.*; import java.io.*; public class Server { static int port = 12345; public static void main(String[] args) { try{ //サーバソケットの作成 ServerSocket ssoc = new ServerSocket(port); //メインループ while(true){ try{ System.out.println("クライアントからの接続を"+ port +"で待ちます"); Socket soc = ssoc.accept(); System.out.println(soc.getInetAddress().getHostName()+"から接続を受けました"); //処理をスレッドに任せます new Connect(soc); }catch(IOException e1){ e1.printStackTrace(); } } }catch(IOException e2){ e2.printStackTrace(); } } } class Connect extends Thread{ private Socket socket = null; public Connect(Socket socket){ this.socket = socket; //スレッド開始 this.start(); } public void run(){ try{ //出力ストリームを取得 OutputStream os = socket.getOutputStream(); PrintWriter out = new PrintWriter(os,true); //入力ストリームを取得 InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader in = new BufferedReader(isr); String inputLine; while((inputLine = in.readLine()) != null){ //System.out.println(inputLine); out.println(inputLine); } System.out.println("処理が終わったので接続を切ります"); in.close(); out.close(); socket.close(); }catch(Exception e1){ try{ socket.close(); }catch(Exception e2){ e2.printStackTrace(); } } } }

  • JavaのTCPソケット通信プログラムについて

    初めてJavaでTCPソケット通信を書いてみたのですが、質問です。ソケット通信をサーバーとクライアント側で確立した後、メッセージの送受信をやるとても簡素なプログラムを作成しました。一回目の送受信をするだけだと上手くいくのですが、同じコネクション内で二回目の送受信をするよう追記したところ動作がおかしくなりました。(一つ目のメッセージも受信しないまま画面が停止した状態になる)何が問題なのでしょうか。 (Receiver.java) public class Receiver { public static final int PORT = 30000; public static void main(String[] args) { try { ServerSocket serverSoc = new ServerSocket(PORT); Socket socket = null; System.out.println("Waiting for Connection.."); socket = serverSoc.accept(); System.out.println("Connection from "+socket.getInetAddress()); // receive message BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from sender ="+new String(br.readLine())); //send message←ここを追記するとおかしくなりました。 String message = "Hey This is receiver"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } (Sender.java) public class Sender { public static final int PORT = 30000; public static void main(String[] args) { try { InetAddress LocalHost = InetAddress.getLocalHost(); InetSocketAddress socketAddress = new InetSocketAddress(LocalHost, PORT); Socket socket = new Socket(); socket.connect(socketAddress, 10000); //send message String message = "Hey This is sender"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); // receive message←同じくここを追記するとおかしくなりました。 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from receiver ="+new String(br.readLine())); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }

  • Socket通信でのデータの受け渡し

    サーバーが受けたデータを、クライアントに返す プログラムですが、 サーバーは、クライアントからのデータを、 while(true){ BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); str=br.readLine(); if(str!=null){ PrintWriter pr=new PrintWriter(s.getOutputStream()); pr.println(str); pr.flush(); }}で、返すようにしています。 クライアントも大体同じです(PrintWriterは、 Buttonを押した時に、取得しています)。 考え方としては、inputstreamは、無限ループで、 取得し、outputstreamは、必要におうじて、取得し データを送っています。 しかし、これだと、一度データを送ると、次から データの受け渡しが出来なくなります。 socketか、inputstreamかoutputstreamのどれかが、 閉じるか、使えなくなるのだと思いますが、 いつもここで、悩んでいます。 (また、無限ループで、BufferedReaderオブジェクト をつくり続けるというのも、ちょっと不安)。 どこに問題があるのか、分かる人教えてください。 お願いします。

    • ベストアンサー
    • Java
  • ソケットにおけるメッセージの送受信について

    いつもお世話になっています。 ソケットに関して質問します。 下記の手順でソケットを使用したいと考えています。 クラスAとクラスBが存在する。 1)クラスA:ソケット通信でメッセージ送信 2)クラスB:ソケット通信によるメッセージを取得 3)クラスB:ソケット通信で返信する 4)クラスA:ソケットによるメッセージを再取得する このとき、クラスAがクラスBによるメッセージ再信が、30秒以内にこなければ、ソケットを閉じる それにあたってソースを1クラスで実行できるよう書き変えたいのですが、どうも上手くいきません。 実行したいメソッド手順が ソケットを開く openSocket ソケットにメッセージ送信 sendMsg ・・・1と3はこのメソッドを使用 メッセージ取得 getMsg ・・・2と4はこのメソッドを使用 ソケットを閉じる closeSocket の順です。 自分で一度考えてみたソースは以下です。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; public class Messaneger{ private Socket socket; private BufferedReader in; // ソケットを開く public void openSocket() { ServerSocket serverSocket; try { serverSocket = new ServerSocket(5555); System.out.println("クライアントからの接続をポート5555で待ちます"); // クライアントからの接続を待ちます Socket socket = serverSocket.accept(); System.out.println(socket.getInetAddress() + "から接続を受付ました"); // 出力ストリームを取得 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 入力ストリームを取得 in = new BufferedReader( new InputStreamReader( socket.getInputStream())); } catch (IOException e) {} } //ソケットを閉じる public void closeSocket() { try { socket.close(); } catch (IOException e) {} } /** * ソケット通信でメッセージを送信 * @param 送信するメッセージ */ public void setMsg(String sendMsg) { try { socket = new Socket("localhost", 5555); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 入力ストリームを取得 in = new BufferedReader( new InputStreamReader( socket.getInputStream())); //サーバーにメッセージ送信 out.println( sendMsg ); //送信メッセージdata System.out.println(sendMsg); } catch (IOException e) {} } /** * ソケット通信でメッセージを取得 * @return msg サーバーに渡されたメッセージ */ public String getMsg() { String getMsg = ""; BufferedReader in; try { in = new BufferedReader( new InputStreamReader( socket.getInputStream())); System.out.println(in.readLine()); } catch (IOException e) {} return getMsg; } } 参考URL:http://www.hellohiro.com/socket.htm 宜しくお願いします。

  • ソケットを使ったサーバとクライアントのプログラムについて

    はじめまして。 プログラミング初心者です。。 ソケットを使用した 簡単なチャットシステムを作ろうとしたのですが どうしてもエラーが出てしまいます。。。 サーバ側のプログラムを実行して その後、 public class ChatClient { public static void main(String args[]){ BufferedReader br; BufferedWriter inw; String logFileName = "chat.log"; Socket s = null ; InputStream sin; DataInputStream dis; OutputStream sout; DataOutputStream dos; String str ; String str1= ("append,"); String str2; try{ s = new Socket("localhost",5432); }catch(IOException e){ } try{ sin = s.getInputStream(); dis = new DataInputStream(sin); sout = s.getOutputStream(); dos = new DataOutputStream(sout); br = new BufferedReader(new FileReader(logFileName)); String line; while((line = br.readLine()) != null){ System.out.println(line ); } BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); while((str=in.readLine())!= null){ if (str.equals("")){ br = new BufferedReader(new FileReader(logFileName)); String line1; while((line1 = br.readLine()) != null){ System.out.println(line1); } }else{ dos.writeUTF(str1+str); dos.flush(); str2 = dis.readUTF(); System.out.println(str2); } } }catch (IOException e){ System.out.println("Error: reading file:"); System.out.println(e); e.printStackTrace(); System.exit(1); } } } としてクライアント側のプログラムを実行します。 ・標準入力から入力を読み込み"ハンドルネーム「,」メッセージ"の形式で「,」で区切って入力する。 そして何も入力せずに"Enter"だけを入力された場合には、チャットログの更新要求と判断して、別途作成してあるチャットログファイルをサーバ側で読み込みクライアント側に渡す。 という感じで作っているのですが 一回目は上手くいくんです。 二回目、同じようにハンドルネーム「,」メッセージを「,」で 区切って入力してエンターを押すと java,io,EOFExceptionのエラーが出てしまいます。。。 どうやったら解決できるのでしょうか。。。

  • ソケット:書き出しをソケット経由で読み込みできない

    お世話になります。 今、Javaでのソケットプログラミングについて学習をはじめて、はじめてのサンプルプログラムが失敗しました。 そこでもうちょっと簡単にしてみたのですが(一部の抜粋が以下のソースです)、またまたうまくいきません。 エコーサーバのテストなのですが、client : after send messageと表示されたところで処理が止まってしまいます。 結果は最下位に貼り付けてあります。 どうかよろしくお願いします。 // reader/writerの取得 BufferedWriter clientWriter = new BufferedWriter( new OutputStreamWriter(sockClient.getOutputStream()), BUFFERSIZE); BufferedReader clientReader = new BufferedReader( new InputStreamReader(sockClient.getInputStream()), BUFFERSIZE); BufferedWriter serverWriter = new BufferedWriter( new OutputStreamWriter(sockServer.getOutputStream()), BUFFERSIZE); BufferedReader serverReader = new BufferedReader( new InputStreamReader(sockServer.getInputStream()), BUFFERSIZE); // サーバのローカルとクライアントの接続先が同じことの確認 System.out.println("client port : " + sockClient.getPort()); System.out.println("client addr : " + sockClient.getInetAddress().getHostAddress()); System.out.println("server port : " + sockServer.getLocalPort()); System.out.println("server addr : " + sockServer.getLocalAddress().getHostAddress()); // クライアント→サーバー→クライアントの順にmaaaaaいうえおを送信 String strMessage = "maaaaaいうえお"; System.out.println("client : send message : " + strMessage); clientWriter.write(strMessage); System.out.println("client : after send message"); String msgGet = serverReader.readLine(); System.out.println("server : got : " + msgGet); serverWriter.write(msgGet); System.out.println("client : got : " + clientReader.readLine()); ------------以下が結果------------- client port : 4544 client addr : 127.0.0.1 server port : 4544 server addr : 127.0.0.1 client : send message : maaaaaいうえお client : after send message

    • ベストアンサー
    • 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
  • javaプログラム初心者です。

    入力ファイルの内容をWebサーバプログラムへ送信し、サーバからの応答を別ファイルに出力するクライアントプログラムを作っているのですが、出力ファイルにはなにも書き込みがされていません。(サーバからの応答は事前に不明でその長さが可変長である) 以下が作ったプログラムです。間違っているところを詳しくご指摘いただけるとありがたいです。お願いします。 import java.net.*; import java.io.*; public class client{ static final int BUFSIZE = 1792; public static void main(String[] args){ try{ String server = args[0]; //接続先のIPアドレス File file1 = new File(args[1]); //入力ファイル(HTTPリクエスト) FileReader filereader = new FileReader(file1); BufferedReader br = new BufferedReader(filereader); int serverport = Integer.parseInt(args[2]); //ポート番号 File file2 = new File(args[3]); //サーバからの応答をファイルに書き込む用 FileWriter filewriter = new FileWriter(file2); BufferedWriter bw = new BufferedWriter(filewriter); byte[] bytebuffer = new byte[BUFSIZE]; String str; while((str = br.readLine()) != null){ //入力ファイルの内容を1行ずつ読み込む bytebuffer = str.getBytes(); //入力ファイルの文字列をバイトに変換 } Socket socket = new Socket(server,serverport); //ソケットの生成 System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); //入出力ストリームの取得 OutputStream out = socket.getOutputStream(); out.write(bytebuffer); //文字列を送信 int receive; while((receive = in.read(bytebuffer))!=-1){ bw.write(new String(bytebuffer)); //サーバからの応答をファイルに出力 } bw.close(); socket.close(); }catch(IOException e){ } } }

  • サーバ/クライアントプログラム

    クライアント側で dos.writeInt( 20 );で 20を書き込み  サーバ側は期待どうり表示されますが クライアント側で さっき書いた20を 読み込んでるはずなんですが int recv = dis.readInt(); System.out.println( "書き込みデータ " + recv ); の部分が無視されるんですが なぜさっき書いた20が 読み込めないんでしょうか? 解説をお願いします //サーバプログラム import java.net.*; import java.io.*; class a{ public static void main( String args[] ) { System.out.println( "Ready!" ); try { ServerSocket ss = new ServerSocket( 5000 ); while( true ) { Socket so = ss.accept(); InputStream i = so.getInputStream(); OutputStream os = so.getOutputStream(); DataInputStream dis = new DataInputStream( i ); DataOutputStream dos = new DataOutputStream( os); int recv = dis.readInt(); System.out.println( "受信データ " + recv ); dis.close(); dos.close(); i.close(); os.close(); } }catch ( Exception e ) { } } } //クライアントプログラム import java.net.*; import java.io.*; class b{ public static void main( String args[] ) { try { Socket so = new Socket( "localhost", 5000 ); InputStream i = so.getInputStream(); OutputStream os = so.getOutputStream(); DataInputStream dis = new DataInputStream( i ); DataOutputStream dos = new DataOutputStream( os ); dos.writeInt( 20 ); int recv = dis.readInt(); System.out.println( "書き込みデータ " + recv ); dis.close(); dos.close(); i.close(); os.close(); }catch( Exception e ) { } } }

  • JavaでSSL通信について(JDK131)

    Javaを用いてSSL通信を行いたいと思っています。 しかし、SSL通信を行うには「HTTPSURLConnection」が 必要で、JDK14以上となっています。 JDK131で利用するにはどうすれば可能でしょうか?? よろしくお願いします。 ちなみに、HTTPはこんな感じですよね?? ======================== import java.io.BufferedReader; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.security.*; public class test { public static void main(String[] args) { String urlString = "https://XXX.cgi"; try { URL url = new URL(urlString); URLConnection uc = url.openConnection(); // POST可能にする uc.setDoOutput(true); // POST用のOutputStreamを取得 OutputStream os = uc.getOutputStream(); // POSTするデータ String postStr = "foo1=bar1&foo2=bar2"; // データをPOSTする PrintStream ps = new PrintStream(os); ps.print(postStr); ps.close(); } catch (MalformedURLException e) { System.err.println("Invalid URL format: "                    + urlString); System.exit(-1); } catch (IOException e) { System.err.println("Can't connect to "                    + urlString); System.exit(-1); } } }

専門家に質問してみよう