以下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);
}
}
}
}
但是当我编译成.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);
}
}
}
}
解决方案 »
- 问一个jdb调试的问题
- please help
- 调查:您的项目的运行环境参数存放在哪里?
- Jbutton上单击鼠标右键,怎样使其发生对应的变化..
- 请教一个Java程序中的方法问题
- 急,急,急,200分相求,用JAVA模拟交通灯的显示。
- REST接口并发稍微高点就报java.net.SocketException: Unexpected end of file from server
- 上传一个指定的文件, 请大家近来看看。 问题能解决, 由发表的都给分!!
- 请教如何用java虚拟机运行hello.class文件,谢谢。
- 什么是JBCL,我怎么看不见Frame UI中有这个选项卡
- 非静态内部类为什么不能有静态成员
- 急死了!
applet的安全性导致的
而且用socket进行通信,很正常啊,所有书上都有例子的
catch(Exception e){
tInfo.append("Connection's closed!\n");
}
里面把异常信息打印出来
这样可以知道究竟出了什么问题
tInfo.append("Connection's closed!\n");
tInfo.append(e.toString());
}
bjex102是不是你的机器名
(Server端是公司的,我没法改。我只有权限改本机的Client权限)
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所在路径}
policy.url.3=file:${mymail.policy所在路径}
现在就是要把我们自定义的mymail.policy加入JRE安全策略里去
grant {
permission java.net.SocketPermission "evilcomputer", "connect,resolve";
};但是还是有那个问题啊~~~
我上面写的哪不对么?
不过我觉得Applet 10年前就已经夭折了
所以对这个我没有太深的研究