アプリ版:「スタンプのみでお礼する」機能のリリースについて

アプレットビューアは 通信成功できますが
HTMLから実行すると失敗します

so = new Socket( "localhost", 80 );

この部分が失敗してるようです
なぜ起こるんでしょうか ?
解決方法を教えてください。



//html
<html><body>
<applet code = "a.class" width = "370" height ="530"></applet>
</body></html>



 



//<applet code = "a.class" width="400" height = "200"></applet>

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class a extends java.applet.Applet
implements ActionListener{

TextField tf;
Button b;
TextArea t;
Panel p, p1;


String str = "http://localhost/cgi-bin/a.cgi";

public void init(){
tf = new TextField( 32 );
b = new Button( "Post" );
t = new TextArea( 20, 48 );
b.addActionListener( this );

p = new Panel();
p.add( new Label( "String" ) );
p.add( tf );
p.add( b );

p1 = new Panel();
p1.add( t );

add( p );
add( p1 );
}

public void actionPerformed( ActionEvent e ){

String str;
if( e.getSource() == b ){
t.setText( sen( tf.getText() ) );
}
}


private String sen( String a ){  

Socket so = null;
InputStreamReader in = null;
OutputStream os = null;
String str1 = new String();

try {
t.setText( "aa" );
so = new Socket( "localhost", 80 );
t.setText( "bb" );
in = new InputStreamReader( so.getInputStream() );
os = so.getOutputStream();

}catch( Exception e ){
return "Error!";
}

String H = "POST " + str + " HTTP/1.0\n";
H += "Content-Length:" + String.valueOf( a.length() ) + "\n\n";
String st = new String( H + a );

try{
os.write( st.getBytes() );
}catch( Exception e ){
return "Error!";
}

str1 = "Send:\n" + st;
boolean bo = true;
StringBuffer sb = new StringBuffer();
int s;

while( bo ){

try{
s = in.read();  
if( s == -1 ) bo = false;
else sb.append( (char)s );

}catch( Exception e ){
bo = false;
}
}
str1 += "\nResv:\n" + sb.toString();
return str1;
}
}

A 回答 (5件)

エラー内容は、やはりポリシーで引っかかっている様子ですね。

回答No2にある方法で、お試しください。通常ブラウザでも実行できるかと思います。ちなみに、アプレットビューワーではポリシーを無視して実行しますので、上手く行っているように見えます。
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2012/02/15 14:31

大変、御申し訳なかったのですが、質問者殿にはお断り無しに、ご質問されたプログラムを、不躾で恐れながら、わたくしめが、試させて頂いたところのご報告をいたしますが、気を悪くされたなら抹殺してくださいます様、お願い申し上げます。



・ポリシーファイルを変更しなかった場合→ConnectionExceptionにて、ご質問者殿が申しされている箇所にて例外が発生いたしております。
結果ログ
-----------------
java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.0.7:8080 connect,resolve)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkConnect(Unknown Source)
at sun.plugin2.applet.Applet2SecurityManager.checkConnect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at a.sen(a.java:53)
at a.actionPerformed(a.java:39)
at java.awt.Button.processActionEvent(Unknown Source)
at java.awt.Button.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
-----------------


・同じプログラムにてポリシーファイルのみ変更した場合→恐らく貴兄殿がお察しする通り実行が上手くいっております。
結果ログ
-----------------
Send:
POST http://localhost/cgi-bin/a.cgi HTTP/1.0
Content-Length:2

aa
Resv:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Length: 0
Date: Thu, 19 Mar 2009 12:38:58 GMT
Connection: close
-----------------

この結果をご考慮いただき、今、一度お試しされ、かつ、例外的なメッセージが表示されていないかご確認いただき、例外があるのであれば、誠に恐縮ですが、ご掲載、お願い申し上げます。
    • good
    • 0
この回答へのお礼

どうも回答ありがとうございます。
セキュリティー関係のエラーなんですね
同パソコンの通信にセキュリティーが
引っかかるとは思いませんでした。
appletに設定が必要なんですね。
いろいろ教えていただきありがとうございます。


エラーは以下でした。

java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:80 connect,resolve)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkConnect(Unknown Source)
at sun.plugin2.applet.Applet2SecurityManager.checkConnect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at a.sen(a.java:54)
at a.actionPerformed(a.java:39)
at java.awt.Button.processActionEvent(Unknown Source)
at java.awt.Button.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

お礼日時:2009/03/20 13:25

補足すると署名付きアプレット

    • good
    • 0
この回答へのお礼

回答ありがとうございます
著名つきアプレットですね
ありがとうございました。

お礼日時:2009/03/20 13:31

著名付きアプレットというのをご存知でしょうか?アプレットは性質上、クライアントの任意ファイルを操作したり、ネット上にアクセスできたりします。

個人情報の漏洩やスパイウェア等の悪質な事もできてしまいます。通常、それを防止する為、勝手にクライアントのリソースを操作できないような仕組みになっています。ただ、これでは善意的なアプレットはダメなの?という話になってきますので、著名付きアプレットというものが存在します。検索サイトで「SIGNED APPLET」等で検索すると幾らでも出てきます。ここで説明は長ーーーくなってしまいますので、関連参考書やインターネットで別途お調べください。

何にしましても、上記問題を解決する方法として、自分のパソコンでは著名つきであろうがなかろうが実行させたいという了見でご説明します。
基本的にアプレットビューアで実行できているので、プログラム上で修正する部分はありません。
方法は幾つかありますが、jre(JDKでなくJREです)がインストールされているディレクトリの中に、lib\security\java.policyというファイルがありますので、実行させたいクライアントPCでエディターとか使って中身を修正します。
grant codeBase "file:${{java.ext.dirs}}/*" {
なっていましたら、
grant {
という形に修正&保存します。
これでOKです。

ちなみに、ローカルで通信を行うなら、各クライアントPCを上記の方法で修正してしまってもOKかと思います。ただ、インターネットに公開したいのであれば、やはり著名付きアプレットにする必要があります。

以上、色々と方法はあるかと思いますが、一例としてご参考まで。
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2012/02/15 14:32

String str = "

http://localhost/cgi-bin/a.cgi";

String str = "/cgi-bin/a.cgi";
にしたらどお?

new Socket( "localhost", 80 );
しているんだから
http://localhost
は不要だと思うけど。

あとプロキシとか設定されていたりしない?
    • good
    • 0
この回答へのお礼

どうも回答ありがとうございます。

試しましたが new Socket( "localhost", 80 );
の前にある t.setText( "aa" );
のaaを表示し 例外のエラー文字表示されます

プロキシは使ってないんです
localhostと入力すと
あなたの予想に反して のページが表示されるんですが。
どうなってるのか。。

ありがとうです!

お礼日時:2009/03/18 22:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!