每个人,
我正在尝试用Java编写一个applet来访问一个视频游戏的应用程序编程接口(API),虽然我可以通过Eclipse IDE成功运行applet,但是当它从浏览器运行时它会一直挂起。 / p>
我通过散布调试信息来缩小bug的位置,直到找到最后一行。
我试图解析参数填充的URL的输出。确定浏览器必须以不同于IDE的方式传递此信息,我尝试了许多不同的方法,包括通过http套接字发布参数(虽然我不熟悉这种方法,很容易错误地实现它)。下面是我当前的版本,省略了无关的部分(如果你应该推断出这个漏洞可能在一个省略的区域,这些很容易被揭示):
...
URL apiCharList = null;
...
try {
...
apiCharList = new URL("https:// ... ");
URLConnection connection = apiCharList.openConnection();
connection.connect();
DataInputStream in = new DataInputStream( new BufferedInputStream( connection.getInputStream() ) );
BufferedReader br = new BufferedReader( new InputStreamReader( in ) );
String line = br.readLine();
while( line != null ) {
...
line = br.readLine();
}
...
} catch (MalformedURLException e) {
current.setText( "Malformed URL" );
} catch (IOException e) {
current.setText( "InputStream fail." );
}
我的调试让我失望:
connection.connect();
没有那条线,在:
DataInputStream in = new DataInputStream( new BufferedInputStream( connection.getInputStream() ) );
非常感谢对这个问题的任何见解。再次,只需告诉我是否需要删除哪些区域。
尊敬, 询问
更新
谢谢大家的回复。我的BufferedReader现在初始化为:
= new BufferedReader( new InputStreamReader( connection.getInputStream() ), 1 );
作为我尝试过的各种方法的组合,这部分已经被提升了;谢谢你为我熨烫。从我所看到的,似乎问题是我的applet需要进行数字签名,以便在通过浏览器运行时建立所需的连接。我一直在研究这个,并在下载最新的JDK后遇到了keytool和jarsigner的问题。我只是待了一会儿,之前从未有过经过数字签名的applet,但至少我有一条新的途径可以追求。如果有人可以提供关于如何对applet进行数字签名的良好(最新)演练,那将是非常感激的。我读过的各种各样的东西说它可以花费我40美元到20美元到任何地方吗?
无论如何,感谢这个障碍的提升。 Respectully, 询问
答案 0 :(得分:2)
默认情况下,浏览器不允许applet在任何地方建立网络连接,而是自己的原始服务器。您需要对applet进行数字签名,然后询问用户是否允许进行连接。另一种方法是在您的Web服务器上运行一个简单的代理servlet,applet可以用它来与第三方服务器通信。
顺便说一下,为什么你在彼此周围包裹了这么多的流 - 其中两个是缓冲的,这是一个巨大的禁忌 - 只是从网络中读取?这两行可以用
代替BufferedReader br = new BufferedReader( new InputStreamReader( connection.getInputStream() ), 1 );
请注意“,1”我最后卡住了,这会关闭BufferedReader的缓冲。您不希望在网络连接上提前读取,或者您正在邀请代码挂起。