以下applet代码,是我用socket连接mail server,利用stmp协议发mail的一个小练习。奇怪的是:我用Eclipse打开,然后Run的时候就没问题,可以连接到server,且可以正常发送邮件。
但是当我编译成.class文件,然后嵌套到网页里就不行了,连server都连不上。(如果连上的话,server会回Version: 5.0.2195.6713 ready at  Thu, 16 Mar 2006 17:09:26 +0800 的字样)请高手帮忙诊断一下,我的环境是jdk1.4+tomcat4.1.31。(tomcat我安装后没有改过设置,且测试网页也可以正常访问)
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.util.*;
import java.net.*;
import java.io.*;public class MyMailClient extends Applet {

 private String tmp;
 BufferedReader reader;
 PrintWriter writer;
 Socket socket;
 
 private Button bSend=new Button("Send");
 private TextField  tFrom=new TextField("");
 private Label lFrom=new Label("From:");
 private TextField  tTo=new TextField("");
 private Label lTo=new Label("To:");
 private TextField  tCC=new TextField("");
 private Label lCC=new Label("CC:");
 private TextField  tBCC=new TextField("");
 private Label lBCC=new Label("BCC:");
 private TextField  tSubject=new TextField("");
 private Label lSubject=new Label("Subject:");
 private TextArea tContent=new TextArea("");
 private TextArea  tInfo=new TextArea("",10,10,TextArea.SCROLLBARS_BOTH);
 private Vector  vRcpt=new Vector();
 
 public void init(){
lFrom.setBounds(20,10,50,20);
lTo.setBounds(20,40,50,20);
lCC.setBounds(20,70,50,20);
lBCC.setBounds(20,100,50,20);
lSubject.setBounds(20, 130, 50, 20);

tFrom.setBounds(80,10,300,20);
tTo.setBounds(80,40,300,20);
tCC.setBounds(80,70,300,20);
tBCC.setBounds(80,100,300,20);
tSubject.setBounds(80, 130, 230, 20);
bSend.setBounds(320, 130, 60, 20);

tContent.setBounds(20,160,360,200);
tInfo.setBounds(20, 370, 360, 80);
tInfo.setEditable(false);

this.setLayout(null);
this.add(lFrom);
this.add(lTo);
this.add(lCC);
this.add(lBCC);
this.add(lSubject);
this.add(tFrom);
this.add(tTo);
this.add(tCC);
this.add(tBCC);
this.add(tSubject);
this.add(bSend);
this.add(tContent);
this.add(tInfo);

this.setSize(400,460);

bSend.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent me){
try{
socket=new Socket("bjex102",25);
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer=new PrintWriter(socket.getOutputStream(), true);
while(true){
tmp = reader.readLine();
tInfo.append("Server:" + tmp +"\n");
if (tmp.startsWith("220 bjex102")){
SendOut("HELO");
}else if(tmp.startsWith("250 bjex102")){
SendOut("MAIL FROM:" + tFrom.getText());
}else if(tmp.endsWith("Sender OK")){
AddToVector(tTo.getText() + "," + tCC.getText() + "," + tBCC.getText());
for(int i = 0; i< vRcpt.size(); i++){
SendOut("RCPT TO:" + vRcpt.elementAt(i));
}
}else if(tmp.startsWith("250 2.1.5") && (tmp.endsWith(vRcpt.elementAt(vRcpt.size()-1)+" ") || tmp.endsWith(vRcpt.elementAt(vRcpt.size()-1) + "@XXXX.com "))){
SendOut("DATA");
}else if(tmp.endsWith("end with <CRLF>.<CRLF>")){
SendOut("From:" + tFrom.getText());
SendOut("To:" + tTo.getText());
SendOut("Subject:" + tSubject.getText());
SendOut("Send:2006-3-16 17:09:26");
SendOut("CC:" + tCC.getText());
SendOut("BCC:" + tBCC.getText());
SendOut("MIME-Version: 1.0");
SendOut("Content-Type: text/plain;charset=" + String.valueOf(34) + "gb2312" + String.valueOf(34));
SendOut("Content-Transfer-Encoding: 8bit");
SendOut(tContent.getText());
SendOut(".");
}else if(tmp.startsWith("250 2.6.0")){
SendOut("QUIT");
}else if(tmp.startsWith("221 2.0.0")){
socket.close();
reader.close();
writer.close();
}else if(tmp.startsWith("501 5.5.4") || tmp.startsWith("550")){
socket.close();
reader.close();
writer.close();
}
}
}catch(Exception e){
tInfo.append("Connection's closed!\n");
}
}
});
 }
 private void SendOut(String msg){
 writer.println(msg);
 tInfo.append("Client:" + msg + "\n");
 }
 private void AddToVector(String Rcpt){
 String KK = Rcpt.replaceAll(",",";");
 String Ele = "";
 vRcpt.clear();
 StringTokenizer ST = new StringTokenizer(KK,";");
 while(ST.hasMoreElements()){
 Ele = ST.nextToken().trim();
 if (!Ele.equals("")){
 vRcpt.add(Ele);
 }
 }
 }
}

解决方案 »

  1.   

    我想应该是
    applet的安全性导致的
      

  2.   

    我也这样考虑过,但是我没用applet访问本地的什么东西啊~~~
    而且用socket进行通信,很正常啊,所有书上都有例子的
      

  3.   

    安全性,好像可以让applet在沙箱外运行。
      

  4.   

    我看你还是在
    catch(Exception e){
         tInfo.append("Connection's closed!\n");
    }
    里面把异常信息打印出来
    这样可以知道究竟出了什么问题
      

  5.   

    catch(Exception e){
         tInfo.append("Connection's closed!\n");
         tInfo.append(e.toString());
    }
    bjex102是不是你的机器名
      

  6.   

    bjex102不是我的机器名,是mail server的名字
      

  7.   

    错误信息是:java.security.AccessControlException: access denied (java.net.SocketPermission bjex102 resolve)
      

  8.   

    修改你的 安全策略文件给applet授权
      

  9.   

    interpb(曾曾胡) ,你可以告诉我具体怎么改么?
    (Server端是公司的,我没法改。我只有权限改本机的Client权限)
      

  10.   

    创建这样一个策略文件:
    grant {
      permission java.net.SocketPermission "servername", "connect,resolve";
    }; 名为mymail.policy然后${JRE_HOME}/lib/security/java.security 中加上这样一句
    policy.url.1=file:${java.home}/lib/security/java.policy
    policy.url.2=file:${user.home}/.java.policy后面加上 policy.url.2=file:${mymail.policy所在路径}
      

  11.   

    sorry :应该这样:
     policy.url.3=file:${mymail.policy所在路径}
      

  12.   

    非常感谢 曾曾胡。但是“然后${JRE_HOME}”和你说的创建一个叫mymail.policy的策略文件有什么关系?${JRE_HOME}又是什么东西?环境变量?也写在mymail.policy里么?
      

  13.   

    但是“然后${JRE_HOME}”和你说的创建一个叫mymail.policy的策略文件有什么关系?${JRE_HOME}又是什么东西?环境变量?也写在mymail.policy里么?/////////////////////////JRE_HOME就是你机器上java 运行环境所在文加夹JRE本来就有一个java.security  这样的策略文件
    现在就是要把我们自定义的mymail.policy加入JRE安全策略里去
      

  14.   

    明白了!我已经在是在C:\Program Files\Java\jre1.5.0_04\lib\security\java.security里加入了“policy.url.3=file:${C:\Program Files\Java\jdk1.5.0_04\jre\lib\security\mymail.policy}”其中我的mymail.policy文件是这样写的(evilcomputer是我的电脑名):
    grant {
    permission java.net.SocketPermission "evilcomputer", "connect,resolve";
    };但是还是有那个问题啊~~~
    我上面写的哪不对么?
      

  15.   

    evilcomputer--->  serverip
      

  16.   

    我写evilcomputer没有错,因为我没有连bjex102,而是连的本地的一个供测试用的ServerSocket,但是还是不行啊我实在是没招了,哎,郁闷 :(
      

  17.   

    把server 和client程序一起给我吧我帮你试试别灰心这问题很常见
      

  18.   

    已发至你的hotmail邮箱,谢谢!
      

  19.   

    帮你顶吧 
    不过我觉得Applet 10年前就已经夭折了
    所以对这个我没有太深的研究
      

  20.   

    bgceft() 小孩子不懂不要瞎说,一般做WebGIS时都使用Applet