• 締切済み

JavaAppletでのデータのやりとり

サーバにおいたHTMLをブラウザで呼び出し、HTML内でJavaAppletを起動する手順で開発しています。 自分のPC上ではうまく接続して動くのですが、 実際のサーバにプログラムを置いて動かすとうまく接続しません。<BR> (1)でためしにホスト名とIPアドレスを表示してますがうまく動作しています。 (2)のところまでは正常です。 (3)のところでうまくいかないのでtryのエラー処理 になってしまいます。 なにが考えられる原因があれば教えてください。 try { URL homeURL = getCodeBase( );// 基本URL取得 String host = homeURL.getHost( );// ホスト名 int port = 6000;// 送受信のポート番号 String ip = ""; try { InetAddress shuwaaddress = ddress.getByName(host); ip = shuwaaddress.getHostAddress(); (1)field1.setText("URL=" + host +" /IP=" + ip); } catch (UnknownHostException e) { System.out.println("IPアドレスを取得できませんでした"); } (2) try { socket = new Socket(host, port);// ストリームソケット生成 } catch (Exception e) { (3)DisplayArea.append("Not able to connect, sorry \n"); }

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

みんなの回答

  • tekebon
  • ベストアンサー率62% (36/58)
回答No.1

アプレットはユーザからみて第三者の信用できない プログラマの作成したものです(おおげさですが)。 そのアプレットをユーザが実行するとソケットを使って データを通信するということはハッキングにつながります。 ですからブラウザのセキュリティ例外が発生しているのです。 (3)のメッセージにe.getMessage()を追加してみてください。 どんな例外が発生しているかが確認できます。 セキュリティプロパティを変更することも可能ですが お勧めできません。

yakimochi
質問者

お礼

かいとうありがとうございました。 プログラムはいじらなくてもうごきました。 ご指摘の点は理解しています。

関連するQ&A

  • Javaのネットワークに関して

    一つのサーバから複数のクライアントにメッセージを送るようにしなさい。いくつのクライアントと接続するか は入力により動的に決めるようにすること。複数のクライアントとの通信にはそのソケットを配列やコンテナを使って実装すればよい。サ ーバを「No23ex04Server」としクライアントを「No23ex04Client」とすること。 とあります。 以下のコードでクライアント側のプログラムは一切変えなくてよいそうなので、サーバー側のプログラムを以下のようにしたのですが、acceptが呼ばれている時点で、ループが止まってしまうので、入力待機状態になりません。スレッドを使わなくてもできるそうなのですが、私にはさっぱりです。 public class No23ex04Client { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String cIpAddress = null; String hostName = null; String sIpAddress = null; int portNo = 65535; try { cIpAddress = InetAddress.getLocalHost().getHostAddress(); hostName = InetAddress.getLocalHost().getHostName(); } catch (UnknownHostException e) { } System.out.println("Client IP Address : " + cIpAddress); System.out.println("Host Name : " + hostName); Scanner scn = new Scanner(System.in); System.out.print("Server IP Address? : "); sIpAddress = scn.next(); System.out.print("Server Port Number? : "); portNo = scn.nextInt(); System.out.println("■Start■"); try { Socket sc = new Socket(sIpAddress, portNo); BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream())); while (true) { System.out.print("From Server Message : "); String fromServerMessage = br.readLine(); System.out.println(fromServerMessage); if (fromServerMessage.contains("さようなら")) break; } sc.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("■Shutdown■"); } } public class No23ex04Server { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String ipAddress = null; String hostName = null; int portNo = 65535; try { ipAddress = InetAddress.getLocalHost().getHostAddress(); hostName = InetAddress.getLocalHost().getHostName(); } catch (UnknownHostException e){ } System.out.println("IP Address : " + ipAddress); System.out.println("Host Name : " + hostName); Scanner scn = new Scanner(System.in); System.out.print("Port Number? : "); portNo = scn.nextInt(); System.out.print("Socket Number? : "); int num = scn.nextInt(); System.out.println("■Start■"); try { ServerSocket ssc = new ServerSocket(portNo); System.out.println("Serverが起動(Port Number : " + ssc.getLocalPort() + ")"); Socket[] sc = new Socket[num]; BufferedWriter[] bw = new BufferedWriter[num]; for (int i = 0; i < num; i++) { sc[i] = ssc.accept(); System.out.println("接続" + i + " : " + sc[i].getRemoteSocketAddress()); bw[i] = new BufferedWriter(new OutputStreamWriter(sc[i].getOutputStream())); } while (true) { System.out.print("To Client Message : "); String toClientMessage = scn.next(); for (BufferedWriter b : bw) { b.write(toClientMessage); b.newLine(); b.flush(); } if (toClientMessage.contains("さようなら")) break; } for (Socket s : sc) s.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("■Shutdown■"); } }

    • ベストアンサー
    • Java
  • SOCKETで入手したデータを抜き出したい

    他サーバのHTMLから部分的に抜き出したいと思っています。 他サーバのHTMLを表示する所までは出来たのですが、抜き出す所が出来ずに困っています。 私が抜き出そうと、表示のwhile文内を下記に変えた所、何も表示されなくなりました。  if( $_ =~ m/抜き出したい頭のキーワード/ ){ $flag = 1;}  if( $_ =~ m/表示したい尾のキーワード/ ){ $flag = 0;}  if( $flag eq 1){ print $_;} このwhile文内には変数に代入するとどうもNGのようです。 教えてGooの過去ログにも同様の質問があったのですが、 解決に至っていませんでした。ご教示願います。 ↓現在のソースコード ---------------------------- #!/usr/local/bin/perl -w use strict; use Socket; # Socket モジュールを使う # 接続先ホスト名 my $host = 'www.xxxx.co.jp'; # HTTP プロトコルを使う my $port = getservbyname('http', 'tcp'); # ホスト名を、IP アドレスの構造体に変換 my $iaddr = inet_aton($host) or die "$host は存在しないホストです。\n"; # ポート番号と IP アドレスを構造体に変換 my $sock_addr = pack_sockaddr_in($port, $iaddr); # ソケット生成 socket(SOCKET, PF_INET, SOCK_STREAM, 0) or die "ソケットを生成できません。\n"; # 指定のホストの指定のポートに接続 connect(SOCKET, $sock_addr) or die "$host のポート $portに接続できません。\n"; # ファイルハンドル SOCKET をバッファリングしない select(SOCKET); $|=1; select(STDOUT); # WWW サーバに HTTP リクエストを送る print SOCKET "GET /index.html HTTP/1.0\r\n"; print SOCKET "\r\n"; # ヘッダ部分を受け取る while (<SOCKET>){ # 改行のみの行ならループを抜ける m/^\r\n$/ and last; } # ボディ部分を受け取り、表示 while (<SOCKET>){ print $_; }

    • ベストアンサー
    • Perl
  • Androidのソケット通信(初歩)

    Androidでソケット通信を行いたいなのですが エミュレータ環境でも実機環境でもうまく動作しません。 何かを送信するまでもなくソケット作成の時点で落ちてしまいます。 通常のJavaプログラム間でなら通信できるのですが、何かやり方が間違っているのでしょうか? (1)PC側でJavaのサーバプログラムを起動しておく。 (2)Androidのエミュレータあるいは実機で起動 (3)Androidのボタンを押してソケット作成(下記プログラムが実行される) (4)Android側が強制終了する 以下の単純なプログラムを使用しています。 また、IP、Portは正しくファイアウォールも無効にしています。 Socket socket = null; try { socket = new Socket("***.***.***.***", ****); } catch (UnknownHostException e) { System.err.println("Don't know about host"); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to host"); }

    • ベストアンサー
    • Java
  • 複数ホストからのデータの受け取り方

    お世話になっております。 複数のホストで計測したあるdouble型の配列データをひとつのホストに送信してそこで送られたホストによってまとめ、 結果的にはdouble型の二次配列がほしいのですが送信される側のホストに以下のサーバ機能付きのプログラムをいれたところ (見づらくてすみません、添付にもおいておきます) プログラム: import java.io.*; import java.net.*; public class RouteFind { public static int port; public static Socket socket; public static ServerSocket sSocket; public static double Data[][]; public static double RouteNode[][]; public static void main(String args[]) { Data = getData(); for (int i = 0; i < Data.length; i++) { System.out.println(RTTMeasure.AddressData[i]); System.out.println(Data[i]); System.out.println(); } } public static double[][] getData() { port = 8080; Data = null; try { sSocket = new ServerSocket(port); //sSocket is the socket while (true) { socket = sSocket.accept(); Thread t = new SessionProc(socket, Data); t.start(); } } catch (IOException e) { e.printStackTrace(); } return Data; } } class SessionProc extends Thread { double[][] data = null; Socket socket = null; public SessionProc(Socket s, double[][] data) { this.socket = s; } @Override public synchronized void run() { try { ObjectInputStream in = new ObjectInputStream( new BufferedInputStream(socket.getInputStream())); InetAddress cAddr = socket.getInetAddress(); //client address for (int i = 0; i < RTTMeasure.AddressData.length; i++) { if (cAddr.getHostName().equals(RTTMeasure.AddressData[i])) { data[i] = (double[]) in.readObject(); } } in.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } エラー: java.net.BindException: Address already in use at java.net.PlainSocketImpl.socketBind(Native Method) at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:365) at java.net.ServerSocket.bind(ServerSocket.java:319) at java.net.ServerSocket.<init>(ServerSocket.java:185) at java.net.ServerSocket.<init>(ServerSocket.java:97) at RouteFind.getData(RouteFind.java:35) at RouteFind.main(RouteFind.java:23) Exception in thread "main" java.lang.NullPointerException at RouteFind.main(RouteFind.java:24) というエラーが出てしまいました。クライアント側はなにも問題がないようです。 各ホストからの通信を別々のスレッドで処理しているつもりなのですがなにがおかしいのでしょうか? お願いします

  • TCP関係のjavaプログラム

    TCPでオウム返しをするサーバとクライアントソフトでクライアント側でピリオドだけを入力すると接続を切るプログラムを作っているのですがなかなか思い通りにいきません。 正しいソースコードを教えてください。 クライアント側のソースコード import java.io.*; import java.net.*;   public class echoClient { public static void main(String[] args) { Socket echoSocket = null; DataOutputStream os = null; BufferedReader is = null;   try { echoSocket = new Socket("localhost", 9999); os = new DataOutputStream(echoSocket.getOutputStream()); is = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); } catch (UnknownHostException e) { System.err.println("Don't know about host: localhost"); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to: localhost"); }   if (echoSocket != null && os != null && is != null) { try { os.writeBytes("HELLO\n");   String responseLine; if ((responseLine = is.readLine()) != null) { System.out.println("Server: " + responseLine); }   os.close(); is.close(); echoSocket.close(); } catch (UnknownHostException e) { System.err.println("Trying to connect to unknown host: " + e); } catch (IOException e) { System.err.println("IOException: " + e); } } } } サーバー側のプログラム import java.io.*; import java.net.*; public class echoServer { public static void main(String args[]) { ServerSocket echoServer = null; String line; BufferedReader is; PrintStream os; Socket clientSocket = null; try { echoServer = new ServerSocket(9999); } catch (IOException e) { System.out.println(e); } try { clientSocket = echoServer.accept(); is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); os = new PrintStream(clientSocket.getOutputStream()); while (true) { line = is.readLine(); os.println(line); } } catch (IOException e) { System.out.println(e); } }

  • Javaの問題について...

    import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.UnknownHostException; import javax.swing.JTextArea; public class html_getter { public static void main(String[] args){ Object o1 = null; try { o1 = new Getter5(new URL("http://www.google.com/")); } catch (MalformedURLException e) { e.printStackTrace(); } ((Getter5)o1).Show(); } } class Getter5{ private String charset = "Shift_JIS"; private JTextArea htmlArea; public Getter5(URL url){ htmlArea = new JTextArea(); try { URLConnection uc = url.openConnection(); BufferedInputStream bis = new BufferedInputStream(uc.getInputStream()); BufferedReader br = new BufferedReader(new InputStreamReader(bis, charset)); htmlArea.setText("");//初期化 String line; while ((line = br.readLine()) != null) { htmlArea.append(line + "\n"); } } catch (MalformedURLException ex) { htmlArea.setText("URLが不正です。"); ex.printStackTrace(); } catch (UnknownHostException ex) { htmlArea.setText("サイトが見つかりません。"); } catch (IOException ex) { ex.printStackTrace(); } } public void Show(){ System.out.println(htmlArea.getText()); } } このプログラムはURLの指定先からHTMLを取ってきて表示するプログラムなのですが、 これに「indexOfとString s1を使ってURLの指定先のHTMLから自分の入力した文字列があるかどうかを判断するプログラム」を作りたいのですがどうすれば作れるでしょうか?

  • JavaAppletのボタンを押すことで、Fortranプログラムが実

    JavaAppletのボタンを押すことで、Fortranプログラムが実行できるようにプログラムを作っています。ですが、今エラーが出て困っています。誰か教えて頂けないでしょうか? 必ず、エラーでディレクトリが見つかりません。とでます。 cdのコマンドでプログラムがある所まで移動したいのですが,どう打てばいいのか分かりません。現在のプログラムは以下のとおりになっています。 OSはLinuxのFedora10です。開発環境としてEclipse使ってます。 try { String command = "./main < input.txt"; //外部プロセス ProcessBuilder pb = new ProcessBuilder(command); //ProcessBuilder構築 Process process = pb.start(); //プロセス実行 process.waitFor(); } catch (Exception e1) { e1.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(); } } }

  • ソケットにおけるメッセージの送受信について

    いつもお世話になっています。 ソケットに関して質問します。 下記の手順でソケットを使用したいと考えています。 クラス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 宜しくお願いします。

  • ITです。早速ですがwinsockでURLを指定した接続確認をしたいの

    ITです。早速ですがwinsockでURLを指定した接続確認をしたいのですが、うまくいきません。 下記のソースで、URLを指定してinet_addr関数呼び出すと-1、 gethostbynameを呼び出すと0が却ってきてしまい、うまく接続出来ません。 IPアドレス(127.0.0.1)を指定すれば、上記の関数は成功するのですが。 URLからIPアドレスの変換方法が解りません。 どうか助けて下さい。 int main(int argc, char* argv[]) { WSADATA wsaData; sockaddr_in server; SOCKET sock; long err; hostent *host; char *url = "http://www.yahoo.co.jp"; // winsock2の初期化 err = WSAStartup(MAKEWORD(2,0), &wsaData); if (err != 0) { printf("WSAStartup error = %d\n", err); return(-1); } // ソケットの取得 sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { printf("socket error = %d\n", WSAGetLastError()); return(-1); } // IPアドレスの取得 memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(80); server.sin_addr.S_un.S_addr = inet_addr(url); if (server.sin_addr.S_un.S_addr == -1) { host = gethostbyname(url); if (host == NULL) { printf("host not found host = %d\n", WSAGetLastError()); return(-1); } }

専門家に質問してみよう