• ベストアンサー

メール送信を行うJavaプログラム

import java.io.*; import java.net.*; public class sendMail { public static void main(String [] args) { try { Socket MailSocket = new Socket((メールサーバのIPアドレス), 25); BufferdReader BufferIn = new BufferedReader(new InputStreamReader(MailSocket.getInputStream())); BufferedWriter BufferOut = new BufferedWriter(new OutputStreamWriter(MailSocket.getOutputStream(), "ISO2022JP")); if(!BufferIn.readLine().startsWith("220")) System.exit(1); BufferOut.write("HELO (SMTPクライアントのFQDN)\r\n"); if(!BufferIn.readLine().startsWith("250")) System.exit(1); BufferOut.write("MAIL FROM: (送信元メールアドレス)\r\n"); if(!BufferIn.readLine().startsWith("250")) System.exit(1); BufferOut.write("RCPT TO: (宛先メールアドレス)\r\n"); if(!BufferIn.readLine().startsWith("250")) System.exit(1); BufferOut.write("DATA\r\n"); if(!BufferIn.readLine().startsWith("354")) System.exit(1); BufferOut.write("Subject:テスト\r\n\r\n"); BufferOut.write("これはテストメールです。\r\n.\r\n"); if(!BufferIn.readLine().startsWith("250")) System.exit(1); BufferOut.write("QUIT\r\n"); if(!BufferIn.readLine().startsWith("221")) System.exit(1); BufferOut.flush(); MailSocket.close(); } catch(Exception e) { System.err.println(e); System.exit(1); } } } 以上のようなプログラムを作ったのですが、「java sendMail」で実行しようとすると、何のエラーも表示されずに止まってしまいます。もちろんメールも送信されていません。(javacは正常にできました。) どこが悪いのかご指摘ください。よろしくお願いいたします。

  • Java
  • 回答数4
  • ありがとう数9

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

  • ベストアンサー
  • ducati
  • ベストアンサー率29% (308/1062)
回答No.3

APIを使わずにってことですよね。 以前に作ったものを載せて起きますので 参考にしてください。 /********************************************* * JavaMail (アプリケーション) * *********************************************/ // ライブラリの利用 import java.net.*; import java.io.*; import java.util.*; /*********************************************************** * Mailクラス * * Mailクラスは,Mailプログラムの本体です。 * ***********************************************************/ public class JavaMail { // SMTP接続用ポート番号(25番) final int intSmtp_Port = 25; // 送信用サーバ String strSmtp_Server = ""; // 自分のメールアドレス String strMy_Email_Addr = "" ; /*********************************************************************** * sendCommandAndResultCheckメソッド * * SMTPコマンドをサーバに送信し,返答コードの確認を行います。 * ***********************************************************************/ //SMTPコマンドをサーバに送信し、resultCheckを用いて返答コードを確認する public void sendCommandAndResultCheck (Socket smtp, BufferedReader smtp_in, PrintWriter smtp_out, String command, int success_code) throws IOException { //コマンドの送信 smtp_out.print(command + "\r\n"); /********************************************** ファイルに対して確実に出力を行うためには, ストリームのフラッシュを行わなければならない **********************************************/ smtp_out.flush(); //送信内容の表示 System.out.println("送信内容表示> " + command); //結果のチェック resultCheck(smtp, smtp_in, smtp_out, success_code); } /*************************************************************** resultCheckメソッド 返答コードをチェックして,エラーならばコネクションを閉じます ***************************************************************/ // resultCheckで返答コードをチェックし、エラーならばコネクションを閉じる public void resultCheck (Socket smtp, BufferedReader smtp_in, PrintWriter smtp_out, int success_code) throws IOException { //返答コードの読み取り String strRes = smtp_in.readLine(); System.out.println("返答コード> " + strRes); // もし返答コードが期待されるコード(success_code)でなければ・・・ if (Integer.parseInt(strRes.substring(0,3)) != success_code) { // コネクションを閉じます smtp.close(); throw new RuntimeException(strRes); } } /***************************** sendメソッド SMTPのセッションを進めます *****************************/ public void send(String subject, String[] to,String[] msgs) throws IOException { /**************************************** CONNECT Socketクラスのオブジェクトsmtpを使って、 ****************************************/ Socket smtp = new Socket(strSmtp_Server, intSmtp_Port); //ネットワーク入出力に必要なストリームを作成する BufferedReader smtp_in = new BufferedReader (new InputStreamReader(smtp.getInputStream())); PrintWriter smtp_out = new PrintWriter(smtp.getOutputStream()); //resultCheckメソッドで返答コード(220)をチェックする resultCheck(smtp, smtp_in, smtp_out, 220); /********************************************************** HELOコマンドの送付 getLocalHost,getHostNameで自分のコンピュータ名を取出す **********************************************************/ String strMyName = InetAddress.getLocalHost().getHostName(); /************************************************ sendCommandAndResultCheckでメールサーバにHELO コマンドを送付、返答コードをチェック ************************************************/ sendCommandAndResultCheck (smtp, smtp_in, smtp_out, "HELO " + strMyName, 250); /******************************************************* MAIL FROMコマンドの送付 sendCommandAndResultCheckでメールサーバにMAIL FROM コマンドを送付、返答コードをチェック *******************************************************/ sendCommandAndResultCheck (smtp, smtp_in, smtp_out, "MAIL FROM:" + strMy_Email_Addr, 250); /*************************** RCPT TOコマンドの送付 送先が複数の場合繰返し ***************************/ for (int i = 0; i < to.length; i++) { // sendCommandAndResultCheckでメールサーバにRCPT TO sendCommandAndResultCheck(smtp, smtp_in, smtp_out, "RCPT TO:" + to[i], 250); } /********************************************************************* DATAコマンドによるメールの送付 sendCommandAndResultCheckでメールサーバにDATA、Subjectヘッダの送付 *********************************************************************/ sendCommandAndResultCheck(smtp, smtp_in, smtp_out, "DATA", 354); /*************************************** コマンドを送付、返答コードをチェック Subjectを送付 ***************************************/ smtp_out.print("Subject:" + subject + "\r\n"); System.out.println("送信> " + "Subject:" + subject) ; //空白を送付 smtp_out.print("\r\n"); /******************************** メッセージ各行の送付 メッセージが複数の場合繰返し ********************************/ for(int i = 0; i<msgs.length - 1; ++i) { //メッセージmsgsを送付 smtp_out.print(msgs[i]+"\r\n"); System.out.println("送信> " + msgs[i]) ; } sendCommandAndResultCheck(smtp, smtp_in, smtp_out, "\r\n.", 250); /************************************************ QUITコマンドの送付 sendCommandAndResultCheckでメールサーバにQUIT ************************************************/ sendCommandAndResultCheck(smtp, smtp_in, smtp_out, "QUIT", 221); /************************************** コネクションのクローズ コマンドを送付、返答コードをチェック **************************************/ smtp.close(); } /******************************************************************* setAddressメソッド 送信に利用するメールサーバや利用者のメールアドレスをセットします *******************************************************************/ public void setAddress(){ String strBuf = "" ; /******************************************************* * InputStreamReader * * バイトストリームから文字ストリームへの橋渡し * *******************************************************/ BufferedReader BufLineread = new BufferedReader(new InputStreamReader(System.in)) ; boolean blnCnt = true ; try{ //アドレス入力のループ while(blnCnt) { System.out.println("メールサーバのアドレスを入力して下さい") ; //メールサーバを取得,smtp_serverに格納 strSmtp_Server = BufLineread.readLine() ; System.out.println("あなたのメールアドレスを入力して下さい") ; //利用者メールを取得,my_email_addressに格納 strMy_Email_Addr = BufLineread.readLine() ; System.out.println(" メールサーバのアドレス:" + strSmtp_Server) ; System.out.println(" あなたのメールアドレス:" + strMy_Email_Addr) ; System.out.println("以上でよろしいですか?(y/n)") ; strBuf = BufLineread.readLine() ; if("y".equals(strBuf)) blnCnt = false ; } } catch(Exception e) { e.printStackTrace(); System.exit(1); } } /******************************** setMsgsメソッド 送信メッセージを取り込みます ********************************/ public String[] setMsgs() { String strBuf = "" ; BufferedReader BufLineread = new BufferedReader(new InputStreamReader(System.in)) ; boolean blnCnt = true ; Vector msgs_Velist = new Vector(); String[] ArrayMsg = null ; try { System.out.println("送信したいメッセージを入力して下さい") ; System.out.println(" (改行してピリオドで終了)") ; // メッセージの入力 while(blnCnt) { //入力したメッセージを一行ことにstrBufに取り込み strBuf = BufLineread.readLine() ; //strBufをmsgs_listに格納する msgs_Velist.addElement(strBuf); //”.”まで繰り返す if(".".equals(strBuf)) blnCnt = false ; } ArrayMsg = new String[msgs_Velist.size()]; //msgs_listの内容をArrayMsgにコピーする msgs_Velist.copyInto(ArrayMsg); } catch(Exception e) { e.printStackTrace(); System.exit(1); } return(ArrayMsg) ; } /*********************************************************************** * mainprocメソッド * * 引数の処理などを行います * ***********************************************************************/ public void mainproc(String[] args){ String strMessage = "JavaMail subject to-address"; String strSubject = ""; Vector Velist = new Vector(); //サブジェクトや宛先の処理 //subject部分をstrSubjectに格納する strSubject=args[0]; //送信先は一つではないので、ループですべての送信先を格納 for (int i=1; i<args.length; i++) { //送り先のアドレスをVelistに格納する Velist.addElement(args[i]); } // 入力された引数の文字列へ変換 if (Velist.size() > 0) { try { String[] strTo = new String[Velist.size()]; /****************************************************** * copyInto() * * Vector の要素を、指定された配列にコピーします。 * ******************************************************/ //Velistの中の値を文字列に変換し、toに格納する Velist.copyInto(strTo); //メールサーバの情報を取得し、setAddressを呼出し setAddress() ; //メッセージを入力させる、msgsに格納する String[] msgs = setMsgs() ; // sendメソッドを呼出し、送信する send(strSubject, strTo, msgs); } catch(IOException e) { e.printStackTrace(); } } else { System.out.println("Message: " + strMessage); } } /*************************************** mainメソッド Mailクラスのオブジェクトを生成します ***************************************/ public static void main(String[] args) { //オブジェクト生成 JavaMail m = new JavaMail() ; //mainprocメソッドを呼出し、引数リストargsを渡す m.mainproc(args) ; } }

sumou111
質問者

お礼

回答ありがとうございます。 さっそく実行してみたところ、スムーズに実行できました!!! これからじっくりと腰を据えて解読していきたいと思っています。 非常に丁寧なプログラムを載せていただき、ありがとうございました。

その他の回答 (3)

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.4

#02のものです。 flushは最後だけしているようですが、 最後だけでなくコマンド(?)ごとに送らなければ inputStreamからreadすることができないようです。 とまっているところもたぶんinputstreamのreadだと思いますよ。 sysoutを一行一行いれてみるとわかると思います。

sumou111
質問者

お礼

回答ありがとうございます。 おぉぉぉ!!! コマンドごとにflush()を実行してみたところ、見事メールを送信することができました。 なるほどー!!! そういうことだったのですね。 ありがとうございました!!!!

  • chi-kon
  • ベストアンサー率43% (58/132)
回答No.2

writeしたらflushしないとだめじゃないですか?

sumou111
質問者

お礼

回答ありがとうございます。 >writeしたらflushしないとだめじゃないですか? プログラム内で「BufferOut.flush()」としているのですが、それではだめなのでしょうか。もう少し詳しく説明してくださるとありがたいです。 よろしくお願いいたします。

回答No.1

私はjava.netパッケージを使った事がないので、分かりませんが、Javaでメールプログラムを作るときはJavaMailを使用するんじゃないでしょうか?そっちの方が簡単で確かだと思いますが。。 JavaMailについては、以下のURLか書籍などに載っています。

参考URL:
http://www.javadrive.jp/javamail/index.html
sumou111
質問者

お礼

回答ありがとうございます。 >Javaでメールプログラムを作るときは >JavaMailを使用するんじゃないでしょうか? おっしゃるとおりなのですが、今回は事情がありまして、JavaMailを使用しないでメール送信のプログラムを作らなければならないのです。 ですので、申し訳ありませんが「JavaMail抜き」ということでよろしくお願いいたします。 (参考文献拝見しました。今後の参考にさせていただきます。)

関連するQ&A

  • javaのメールクライアント

    メールの閲覧ができるプログラムを作成していますが閲覧ができずエラーが出てしまいます。 正しいソースコードを教えてください。 import java.io.*; import java.net.*; public class mail2 { public static void main(String args[]) throws IOException { String server,user,pass,str,num; int port = 110; StringBuffer sb = new StringBuffer(""); Socket sock; BufferedReader sockin; BufferedWriter sockout; System.out.println("サーバーを入力"); BufferedReader serverin = new BufferedReader(new InputStreamReader(System.in)); server = serverin.readLine(); System.out.println("ユーザーを入力"); BufferedReader userin = new BufferedReader(new InputStreamReader(System.in)); user = userin.readLine(); System.out.println("パスワードを入力"); BufferedReader passin = new BufferedReader(new InputStreamReader(System.in)); pass = passin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.flush(); sockout.write("PASS " + pass + "\r\n"); sockout.flush(); sockout.write("LIST\r\n"); sockout.flush(); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.flush(); sockout.write("PASS " + pass + "\r\n"); sockout.flush(); sockout.write("LIST\r\n"); sockout.flush(); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket (server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.flush(); sockout.write("PASS " + pass + "\r\n"); sockout.flush(); sockout.write("RETR " +num+"\r\n"); sockout.flush(); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sock.close(); } catch (Exception ex) { ex.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • Javaの簡易クライアント

    メールの閲覧ができるプログラムを作成してコンパイルして実行はできるのですが閲覧ができずエラーが出てしまいます。 正しいソースコードを教えてください。プログラムに詳しい方宜しくお願いします。 画像は実行結果です。 import java.io.*; import java.net.*; public class mail2 { public static void main(String args[]) throws IOException { String server,user,pass,str,num; int port = 110; StringBuffer sb = new StringBuffer(""); Socket sock; BufferedReader sockin; BufferedWriter sockout; System.out.println("サーバーを入力"); BufferedReader serverin = new BufferedReader(new InputStreamReader(System.in)); server = serverin.readLine(); System.out.println("ユーザーを入力"); BufferedReader userin = new BufferedReader(new InputStreamReader(System.in)); user = userin.readLine(); System.out.println("パスワードを入力"); BufferedReader passin = new BufferedReader(new InputStreamReader(System.in)); pass = passin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.write("PASS " + pass + "\r\n"); sockout.write("LIST\r\n"); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sockout.close(); sockin.close(); sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket (server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.write("PASS " + pass + "\r\n"); sockout.write("RETR " +num+"\r\n"); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sockout.close(); sockin.close(); sock.close(); } catch (Exception ex) { ex.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • javaプログラムの質問です。お願いします

    1このプログラムの全てのインスタンス変数について、変数名を書いてください。 2全てのメソッド名を書いてください。 よろしくお願いします。 1: import java.awt.event.*; 2: import java.awt.*; 3: import java.io.*; 4: import java.net.*; 5: 6: public class Test71 { 7: private MyCanvas c; 8: public static void main( String[] args ) { 9: Test71 t71 = new Test71(); 10: t71.doEvent(); 11: } 12: 13: Test71() { 14: Frame f = new Frame( "Test71" ); 15: f.setSize( 640, 480 ); 16: f.addWindowListener( new WindowAdapter() { 17: @Override public void windowClosing( WindowEvent e ) { 18: System.exit( 0 ); 19: } 20: }); 21: c = new MyCanvas(); 22: f.add( c ); 23: f.setVisible( true ); 24: } 25: 26: public void doEvent(){ 27: try{ 28: ServerSocket ss = new ServerSocket( 8000 ); 29: while( true ) { 30: Socket socket = ss.accept(); 31: BufferedReader br = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); 32: BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream() ) ); 33: while( true ) { 34: String command = br.readLine(); 35: String[] words = command.split( " " ); 36: System.out.println( command ); 37: if( words[0].equalsIgnoreCase( "setOval" ) ) { 38: try { 39: c.setPoint( Integer.parseInt( words[1] ), Integer.parseInt( words[2] ) ); 40: } catch( Exception e ) {} 41: } else if( words[0].equalsIgnoreCase( "changeMode" ) ) { 42: //描画方式を変更する処理 43: } 44: else if( words[0].equalsIgnoreCase( "quit" ) ) { 45: break; 46: } 47: } 48: bw.close(); 43 49: br.close(); 50: socket.close(); 51: } 52: } catch( Exception e ) { 53: e.printStackTrace(); 54: } 55: } 56: }

    • ベストアンサー
    • Java
  • javaプログラムの問題です

    1このプログラムの全てのインスタンス変数について、変数名と大まかな役割を書いてください。 c MyCanvasを呼び出す t71 Test71を呼び出す f フレームを呼び出す br 文字列を読み込み bw 文字列を書き込む これであっているかをお願いします。 2全てのメソッド名と大まかな役割を書いてください。 メソッド名 main javaの基本(どのプログラムでも使う) windowClosing ウィンドウを閉じる doEvent 送られてきた処理により何かをする こちらもあっているかをお願いします。 間違っているなら何が違うかを教えてください。 プログラム始めたばかりの初心者ですみません。 よろしくお願いします。 1: import java.awt.event.*; 2: import java.awt.*; 3: import java.io.*; 4: import java.net.*; 5: 6: public class Test71 { 7: private MyCanvas c; 8: public static void main( String[] args ) { 9: Test71 t71 = new Test71(); 10: t71.doEvent(); 11: } 12: 13: Test71() { 14: Frame f = new Frame( "Test71" ); 15: f.setSize( 640, 480 ); 16: f.addWindowListener( new WindowAdapter() { 17: @Override public void windowClosing( WindowEvent e ) { 18: System.exit( 0 ); 19: } 20: }); 21: c = new MyCanvas(); 22: f.add( c ); 23: f.setVisible( true ); 24: } 25: 26: public void doEvent(){ 27: try{ 28: ServerSocket ss = new ServerSocket( 8000 ); 29: while( true ) { 30: Socket socket = ss.accept(); 31: BufferedReader br = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); 32: BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream() ) ); 33: while( true ) { 34: String command = br.readLine(); 35: String[] words = command.split( " " ); 36: System.out.println( command ); 37: if( words[0].equalsIgnoreCase( "setOval" ) ) { 38: try { 39: c.setPoint( Integer.parseInt( words[1] ), Integer.parseInt( words[2] ) ); 40: } catch( Exception e ) {} 41: } else if( words[0].equalsIgnoreCase( "changeMode" ) ) { 42: //描画方式を変更する処理 43: } 44: else if( words[0].equalsIgnoreCase( "quit" ) ) { 45: break; 46: } 47: } 48: bw.close(); 43 49: br.close(); 50: socket.close(); 51: } 52: } catch( Exception e ) { 53: e.printStackTrace(); 54: } 55: } 56: }

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

  • 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){ } } }

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

    1 ネットワークを通じて送信する可能性のあるコマンド文字列とその働きを書いてください。 2 26,73行目のcatchで補足される可能性のある例外と、その発生箇所と原因を書いてください。 2番は大変なので1番だけの解答でも大丈夫です。 よろしくお願いします。 1: import java.awt.event.*; 2: import java.awt.*; 3: import java.io.*; 4: import java.net.*; 5: 6: public class Test72 { 7: private MyCanvas c; 8: private BufferedWriter bw; 9: private BufferedReader br; 10: 11: public static void main( String[] args ) { 12: Test72 t72 = new Test72(); 13: t72.doEvent(); 14: } 15: 16: Test72(){ 17: Frame f = new Frame( "Test72" ); 18: f.setSize(640,480); 19: f.addWindowListener( new WindowAdapter() { 20: @Override public void windowClosing( WindowEvent e ) { 21: try { 22: bw.write( "quit" ); 44 23: bw.flush(); 24: bw.close(); 25: br.close(); 26: } catch( Exception e2 ) {} 27: System.exit( 0 ); 28: } 29: }); 30: c = new MyCanvas(); 31: c.addMouseListener( new MouseListener() { 32: @Override public void mouseClicked( MouseEvent e ) { 33: try { 34: bw.write( "setOval " + e.getX() + " " + e.getY() + "¥n" ); 35: bw.flush(); 36: c.setPoint( e.getX(), e.getY() ); 37: } catch( Exception e2 ) {} 38: } 39: @Override public void mouseEntered( MouseEvent e ) {} 40: @Override public void mouseExited( MouseEvent e ) {} 41: @Override public void mousePressed( MouseEvent e ) {} 42: @Override public void mouseReleased( MouseEvent e ) {} 43: }); 44: c.addMouseMotionListener( new MouseMotionListener() { 45: @Override public void mouseDragged( MouseEvent e ) { 46: try { 47: bw.write( "setOval " + e.getX() + " " + e.getY() + "¥n" ); 48: bw.flush(); 49: c.setPoint( e.getX(), e.getY() ); 50: } catch( Exception e2 ) {} 51: } 52: @Override public void mouseMoved( MouseEvent e ) {} 53: }); 54: f.add( c ); 55: f.setVisible( true ); 56: } 57: 58: public void doEvent() { 59: try { 60: InetSocketAddress socketAddress = 61: new InetSocketAddress( "localhost", 8000 ); 62: Socket socket = new Socket(); 63: socket.connect( socketAddress, 10000 ); 64: InetAddress inadr; 65: if( ( inadr = socket.getInetAddress() ) != null ){ 66: System.out.println( "Connect to " + inadr ); 67: } else { 68: System.out.println( "Connection failed" ); 69: System.exit( 0 ); 70: } 71: bw = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream() ) ); 72: br = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); 73: } catch( Exception e ) {} 74: } 75: }

    • ベストアンサー
    • Java
  • javaについて>IEのクッキーを使いたい

    IEでログインした状態であれば、ヤフーメールなどクッキーを使うHPにアクセスできるかと思ったのですがアクセスできません。どうすればよいでしょうか? 多分、javaはIEのクッキーを利用していないのですよね・・・ 何とか、IEのクッキーを利用できれば良いのですが。何か、良いお知恵はありませんでしょうか? 宜しくお願い致します。 以下、コードです。 ーーーーーーーーーーーーーーーーーーーーーーー import java.io.*; import java.net.*; class Test { static String input() throws IOException { InputStream is = new FileInputStream("url.txt");//urlを入力 BufferedReader br = new BufferedReader(new InputStreamReader(is)); String str = br.readLine(); return(str); } static void read(String str) throws IOException { OutputStream os = new FileOutputStream("log.txt",true); BufferedWriter fr = new BufferedWriter(new OutputStreamWriter(os)); URL url = new URL(str); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect")); for (;;) { String i = in.readLine(); if(i == null) { break; } System.out.println(i + "\n"); fr.write(i + "\n"); } in.close(); fr.close(); } public static void main(String[] args) throws IOException { Test brow = new Test(); brow.read(brow.input()); } }

    • ベストアンサー
    • Java
  • javaの課題プログラムでどうしてもわかりません。

    以下(senderTest)のプログラムを適切に繰り返すように書き換えたいのですが、どうしてもうまくいきません。while文で自分なりに繰り返した結果は同じ文字を送り続けるというものになってしまいました。 本来は送信して、待機状態になりまた新たに文字を入力したら送信、また待機というようにしたいのですがどうしたらよいでしょうか? どうかよろしくおねがいします。 ******************************** senderTest import java.io.*; import java.net.*; public class senderTest { private InetAddress address; private int port = 13400; private DatagramSocket socket; public senderTest() throws Exception { this.address = InetAddress.getByName("192.168.0.16"); this.socket = new DatagramSocket(); } public void send(String s) throws Exception { byte buffer[]; buffer = s.getBytes("Shift_JIS"); DatagramPacket packet = new DatagramPacket(buffer, buffer.length, this.address, this.port); this.socket.send(packet); } public static void main(String[] args)throws IOException { senderTest sender1; System.out.println("↓送信する文字を入力してください↓"); String name = ("健児>"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String msg = name +br.readLine(); try { sender1 = new senderTest(); sender1.send(msg); System.out.println("『" + msg + "』を送信しました。"); } catch (Exception ex) { System.err.println("Error: " + ex.getMessage()); } } } ********************************

    • ベストアンサー
    • Java
  • javaで絵チャットを作っています。

    初めての投稿です。よろしくお願いします。 javaで絵チャットを作っているのですが、うまく片方で書いた絵をもう片方に送って描画することがうまくいっていません。 一応、チャットはうまくいって入るのですが。。。。。座標を一度文字列に直してチャットの文字列と区別するのに座標は文字列の頭に%%%をつけて送信しています。 教えてください。よろしくお願いします。 /ChatServer/ /* 引数の文字列を全てのチャネルに出力する */ synchronized void broadcast(String s) { int i, n; MyChannel mchannel; // 全チャネルに対して文字列を送信 for (i = 0, n = channelSet.size(); i < n; i++) { mchannel = (MyChannel) channelSet.get(i); // チャネルが有効なら送信、無効ならチャネルを除去 if (mchannel.alive) { if(s.startsWith("%%%")) mchannel.sendObj(s); else mchannel.sendStr(s); } else { channelSet.remove(i); i--; n--; }} /ChatClient/ getContentPane().add(input = new JTextField(), BorderLayout.SOUTH); // 送信処理 input.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { String s = input.getText(); input.setText(""); try { // 改行文字を\r\nに統一する if (s.endsWith("\r\n")) { wt.write(s, 0, s.length()); } else { if (s.endsWith("\n")) { wt.write(s, 0, s.length() - 1); } else { wt.write(s, 0, s.length()); } wt.write('\r'); wt.write('\n'); } // バッファをフラッシュする wt.flush(); } catch (IOException e) { new RuntimeException(); }}}); // 受信処理 public void run() { String str; try { while (true) { str = rd.readLine(); System.out.println(str);// 確認用 /* 座標の要素かテキストの要素かを判定する */ /* 座標を操作 */ if (str.startsWith("%%%")) { String[] strAry = str.split(","); // 分割された文字列の表示 for (int i = 0; i < strAry.length; i++) { System.out.println(strAry[i]); } /* Stringをint型に変換 */ mc.mode = Integer.parseInt(strAry[1]); mc.PX = Integer.parseInt(strAry[2]); mc.PY = Integer.parseInt(strAry[3]); mc.x = Integer.parseInt(strAry[4]); mc.y = Integer.parseInt(strAry[5]); mc.RX = Integer.parseInt(strAry[6]); mc.RY = Integer.parseInt(strAry[7]); repaint(); } else { log.append(str + '\n'); log.setCaretPosition(log.getText().length());// スクロールバーを手動で下げる } } } catch (IOException e) { new RuntimeException(); } /MyCanvas/ public void sender() { // サーバとチャンネルに送信する try { /* intをStringに変換 */ String strmode = String.valueOf(mode); String strPX = String.valueOf(PX); String strPY = String.valueOf(PY); String strX = String.valueOf(x); String strY = String.valueOf(y); String strRX = String.valueOf(RX); String strRY = String.valueOf(RY); String Zahyou = new String("%%%" + "," + strmode + "," + strPX+ "," + strPY + "," + strX + "," + strY + "," + strRX + ","+ strRY); System.out.println(Zahyou); mchnl.sendObj(Zahyou); } catch (Exception e) { new RuntimeException(); }} /MyChannel/ /* クライアントへ文字列を出力する */ synchronized void sendStr(String str) { //System.out.println("sending String info from server to client"); try { // 改行文字を\r\nに統一する if (str.endsWith("\r\n")) { wt.write(str, 0, str.length()); } else { if (str.endsWith("\n")) { wt.write(str, 0, str.length() - 1); } else { wt.write(str, 0, str.length()); } wt.write('\r'); wt.write('\n'); } wt.flush(); } catch (IOException e) { disconnect(); } } /* クライアントへ座標を出力する */ synchronized void sendObj(String Zahyou) { try { if(Zahyou.endsWith("\r\n")){ wt.write(Zahyou, 0, Zahyou.length()); }else{ if (Zahyou.endsWith("\n")) { wt.write(Zahyou, 0, Zahyou.length() - 1); } else { wt.write(Zahyou, 0, Zahyou.length()); } wt.write('\r'); wt.write('\n'); } wt.flush(); } catch (IOException e) { disconnect(); } } /* クライアントからの入力を受け付ける */ public void run() { String str; InputStreamReader in; try { // ソケットから入出力ストリームを得る rd = new BufferedReader(new InputStreamReader(socket.getInputStream())); wt = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // ユーザー名を入力してもらう sendStr(" 名前を入力してください "); handle = rd.readLine(); // 入力待ちのループ while (true) { // 文字列入力を待つ str = rd.readLine(); /*座標の要素かテキストの要素かを判別*/ if (str.startsWith("%%%")) {chatsv.broadcast(str); } else chatsv.broadcast("[" + handle + "] " + str); }