• ベストアンサー

javaの課題プログラムでどうしてもわかりません。

_ranco_の回答

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

whileループの中で、name +br.readLine(); -> socket.send(packet);したら、次にreceive(packet);があれば、いいんじゃないですか?。UDPの場合、クライアントの標準的な実装はそうしますね。

ken0129012
質問者

補足

知識不足で申し訳ありません。その場合どこをどのように変更すればよろしいのでしょうか?

関連するQ&A

  • javaのudp通信について

    javaのudp通信を使用して簡単なチャットプログラムを作っています。サーバーなどは使用しないものです。 送信、受信それぞれのプログラムはできました。送信は送信を繰り返し、受信も受信を繰り返すものです。それをひとつにしたいと考えています。 送信プログラムの詳細はhttp://oshiete1.goo.ne.jp/qa3743572.htmlです。 受信プログラムは下記です。 ご指導お願いします。 ******************************** import java.net.*; public class reciverTest { DatagramPacket packet1; private DatagramSocket socket1; private int port = 19800; public reciverTest() throws Exception { this.socket1 = new DatagramSocket(this.port); } public String receive() throws Exception { byte buffer[] = new byte[256]; int i; packet1 = new DatagramPacket(buffer, buffer.length); this.socket1.receive(packet1); // blocking for (i = 0; i < buffer.length; i++) { if (buffer[i] == '\0') { break; } } String msg = new String(packet1.getData(), 0, i); return msg; } public void close() throws Exception { socket1.close(); } public static void main(String[] args) { reciverTest receiver1; System.out.println("Waiting ..."); try { receiver1 = new reciverTest(); while(true) { String msg = receiver1.receive(); System.out.println("受信したデータ⇒『" + msg +"』を受信しました。"); receiver1.close(); } } catch (Exception ex) { System.err.println("Error: " + ex.getMessage()); } } }

    • ベストアンサー
    • Java
  • 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(); } } }

  • UDPサーバのスレッド化

    JavaでUDPのサーバを作っているのですが、スレッド化ができません。] 以下の二つがキーワードだと思うのですが、どうかいていけばいいのかわかりません。お分かりになる方ご教授お願いいたします。 public class c_udp_server extends public void run() //サーバソース import java.io.*; import java.net.*; public class c_udp_server { public static void main(String args[]){ int port = 8000; BufferedInputStream biStream; InetAddress clientAddress; int clientPort; byte buf[]= new byte[160*120*3]; DatagramPacket sendPacket = new DatagramPacket(buf,buf.length); byte req[] = new byte[32]; DatagramPacket receivePacket = new DatagramPacket(req,req.length); try { DatagramSocket socket = new DatagramSocket(port); System.out.println("Running..."); while(true){ socket.receive(receivePacket); clientAddress = receivePacket.getAddress(); clientPort = receivePacket.getPort(); socket.send(receivePacket); sendPacket.setAddress(clientAddress); sendPacket.setPort(clientPort); sendPacket.setLength(160*120*3); biStream = new BufferedInputStream(new FileInputStream(s.raw)); for(;;){ biStream.read(buf,0,160*120*3); socket.send(sendPacket); if(buf[0] < 0)break; } biStream.close(); } } catch(Exception e){ System.out.println("Exception :" + e); } } } 環境 Windows XP Pro java version "1.5.0_10"

  • UDP通信(SNMP)したいが、うまく動かない。

    下記URLの質問の続きのような質問なのですが…。 SNMPで応答を得ようと、下記のようにコードを書いてみたのですが、うまくいきません。 足りないところ、間違っているところ、こうしたらいいんじゃない?等、簡単なことでも結構です。 ご教授いただけたらと思います。 よろしくお願いします。 http://oshiete1.goo.ne.jp/qa4934857.html //ここからコード public class SNMP_UDPReceive2 { public static void main(String[] arg){ System.out.println("hajimata!"); try{ byte buf[] = "Get".getBytes(); //ソケットを作成 DatagramSocket soc = new DatagramSocket(); //パケットを作成(""の中身は例です。) DatagramPacket packet = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.1"),161); //送信 soc.send(packet); //受信処理 byte buf_re[] = new byte[512]; DatagramPacket packet_re = new DatagramPacket(buf,buf.length); soc.receive(packet_re); //受信したデータを取得 String data = new String(packet_re.getData(),0,packet_re.getLength()); System.out.println("\"" + data + "\"を受信しました"); }catch(Exception e){ e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • javaのUDP受信プログラムについて

    UDPで数値データを受信してある処理をしようと考えております。 そこで↓のページで公開されている受信プログラムを使用してデータを受信しました。 http://news.mynavi.jp/column/java/052/index.html import java.net.*; public class UDPServer { public static void main(String[] argv) throws Exception { // 5100番ポートを監視するUDPソケットを生成 DatagramSocket receiveSocket = new DatagramSocket(5100); // 受け付けるデータバッファとUDPパケットを作成 byte receiveBuffer[] = new byte[1024]; DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length); while (true) { // UDPパケットを受信 receiveSocket.receive(receivePacket); // 受信したデータを標準出力へ出力 System.out.println (new String(receivePacket.getData(), 0, receivePacket.getLength())); } } } 別のプログラムから「50」という数値を送信し、上記のプログラムで受信すると、勝手にASCIIコードに変換されてしまっているようで、ASCIIコードの10進数の50にあたる「2」が出力されてしまいます。 これをASCIIコードに変換せずに、表示させる方法を教えて下さい。 もしくは、受信データをバイナリで表示する方法があれば、そちらも教えていただけるとありがたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaによるファイル送信のプログラム

    ユニキャスト通信のおけるプログラミングで、1のプログラムを2のプログラムを使ってファイル送信ができるようにしたいのですがうまくいきません。私のjavaの知識が授業についていかなくて図書館でいろいろと本を探したのですが見つかりませんでした。誰か教えていただけませんか? /*1*/ import java.net.*; import java.io.*; public class udpechoServer{ static final int echo_PORT = 7; //エコーポート番号 static final int BUFSIZE = 1024; //バッファサイズ public static void main(String[] args) throws IOException{ int port = echo_PORT; //ポート番号 int cliport; //クライアントポート番号 int len; //データ長 int i; //キーインバッファクリアインデックス DatagramSocket sock = null; //データグラムソケット宣言,初期化 byte[] buf = new byte[BUFSIZE]; byte[] wbuf = new byte[BUFSIZE]; String recvdata; //受信データ try{ sock = new DatagramSocket(port); DatagramPacket recvpacket = new DatagramPacket(buf,BUFSIZE); DatagramPacket sendpacket = new DatagramPacket(buf,BUFSIZE); System.out.println("Connected to echo server"); while(true){ sock.receive(recvpacket); //データ受信 recvdata = new String(recvpacket.getData(),0,recvpacket.getLength()); recvdata = recvdata.trim(); //トリミング(CRLF) wbuf = recvdata.getBytes(); //文字列→バイト配列変換 i = 0; len = wbuf.length; buf = new byte[BUFSIZE]; while(wbuf[i] != 0x0d){ //途中のCR検出 buf[i] = wbuf[i]; //データコピー i++; if(i >=len){ break; } } recvdata = new String(buf,0,i); //バイト配列→文字列変換 System.out.println(recvdata); //画面出力 InetAddress ipadr = recvpacket.getAddress(); cliport = recvpacket.getPort(); buf = recvdata.getBytes(); len = buf.length; sendpacket = new DatagramPacket(buf,len,ipadr,cliport); sock.send(sendpacket); //データ送信 recvpacket.setLength(BUFSIZE); //データグラムパケット長リセット } }catch(SocketException e){ e.printStackTrace(); } } } /*2 */ import java.io.*; class FileCopy { public static void main(String argv[]){ try{ InputStream in = new FileInputStream(argv[0]); //入力ファイルを開く //BufferedInputStreamオブジェクトの生成 BufferedInputStream bin = new BufferedInputStream(in); OutputStream out = new FileOutputStream(argv[1]); //出力ファイルを開く //BufferedOutputStreamオブジェクトの生成 BufferedOutputStream bout = new BufferedOutputStream(out); byte buf[] = new byte[1024]; int c; //読み込みデータがなくなるまで読み込み while((c = bin.read(buf, 0, buf.length)) != -1){ bout.write(buf, 0, c); //データの書き込み処理 } System.out.println("\""+argv[0]+"\" was converted into \""+argv[1]+"\""); bin.close(); //入力ファイルを閉じる bout.close(); //出力ファイルを閉じる }catch(Exception e){} } }

    • ベストアンサー
    • Java
  • UDPプログラム、データの送受信

    javaを使って通信の勉強をしています。 UDPを用いた通信のプログラムを作成しています。 送信側では、次のようにして送信したいバイト数を分割して送信しています。 BUF_MAX = 40960; DatagramSocket socket = new DatagramSocket(); // data分のバイトデータを分割して送信する。 int part = 5242880 / BUF_MAX; // 分割して送信する回数 send_start = System.nanoTime(); for(int i = 0;i < part;i++){   byte[] buf = new byte[BUF_MAX];   buf[0] = (byte)i;   DatagramPacket sendPacket = new DatagramPacket(buf,BUF_MAX,serverAddress,servPort);   total += BUF_MAX;   // 指定したバイト数を送信する。   try{     socket.send(sendPacket);   }catch(IOException e){     System.out.println(e);   } } System.out.println(total); このようにしています。 こうする理由は、5242880バイトのデータを128回に分割して送信して、 受信側で受信したパケットの最初の文字を見て、何個目のパケットが届いていないかを確認するためです。 受信側でこれらのデータを受信する方法を考えているのですが、どうすればよいか分かりません。 receive(packet)で受信するのは知っています。 送信された複数のデータを受信するのに、 for(int i = 0;i < 128; i++){  receive(packet); } というようにするのでしょうか?このようにすると、 このループを抜けることができません。それは、パケットが通信途中で紛失するため、128回受信しないからだとおもいます。 受信しなくなったらループを抜けるというようにすればよいとおもいますが、その方法が分かりません。 どなたかアドバイスをいただけないでしょうか?お願いします。

    • ベストアンサー
    • Java
  • ソケットプログラミングについて

    こんにちは。 前回、質問しました「バード」という者です。 ソケットプログラミングについて質問します。 PC1から、jpegやmpegファイルを送信しPC2で受信するというプログラムをC言語で作ってみたいと思っています。 以前、少しだけJAVAプログラミングでPC1(送信側)からPC2(受信側)へデータを送信するプログラムを作ったのですが、作ったプログラムの概要を以下に示します。 [送信側] (ファイルオープン) InputStream in = new FileInputStream(ss); BufferedInputStream bin = new BufferedInputStream(in); ↓ (データを読みsendメソッドにて随時送信) while((c = bin.read(buffer, 0, buffer.length))!=-1){ dPacket = new DatagramPacket(buffer,buffer.length,iAddress,port); dSocket.send(dPacket); } ↓ (ファイルとソケットクローズ) dSocket.close(); [受信側] (ファイルオープン) OutputStream out = new FileOutputStream(args[1]); BufferedOutputStream bout = new BufferedOutputStream(out); ↓ (送信側から来たデータをreceiveメソッドにて受信) while(true){ dPacket = new DatagramPacket(buffer,buffer.length); dSocket.receive(dPacket); } ↓ (ファイルとソケットクローズ) dSocket.close(); 上記に示す様に、ファイルをオープンし、DatagramSocketとDatagramPacketクラスを用いて送受信し最後に、ファイルをクローズするという形式をとっていました。 C言語の場合でも、ファイルオープン→send関数,receive関数等を用いて送信・受信→ファイルクローズという形をとる事ができるのでしょうか?FTPプログラムやエコープログラムを、よく見かけるのですが・・・・

  • JAVAプログラムで質問です

    下のように作動するJAVAプログラムを作成して欲しいと言われたのですが、私には良く分かりませんでした。 プログラムについて分かる方!是非、このプログラムを下のように動くように改良していただけないでしょうか? 宜しくお願い致します。 今の状態は、 --- こんにちは。私はコンピュータです。 あなたの名前を入力してください。 やまもと←入力してエンター やまもとさん。よろしく。 --- となりますが、10秒間、入力しない場合には、 >>の部分が何度も繰り返されるようにしたいのですがどのようなプログラムになりますか? --- こんにちは。私はコンピュータです。 あなたの名前を入力してください。 >>まだ~。早く入力して~。 >>あなたの名前を入力してください。 --- import java.io.*; class Hello2 { public static void main(String[] args) throws Exception { System.out.println("こんにちは。私はコンピュータです。"); System.out.println("あなたの名前を入力してください。"); String name; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); name = br.readLine(); System.out.println(name + "さん。よろしく。"); br.close(); } }

    • ベストアンサー
    • Java
  • 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... 以上です。どなたか解決方法をご教授ください。

    • ベストアンサー
    • Java