📄 jicq.java
字号:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.lang.String;
import java.awt.image.*;
import java.applet.*;
import sun.audio.*;
public class jICQ extends Applet
{
static String icqNo="";
static String ver="ver(c):1.4.0329";
static boolean logonOK=false,exitSystem=false;
static String URLstring="jicq.vicp.net";
static String[] host={"jicq.vicq.net","javaicq.vicp.net","jicq.ip88.net"};
static int CONTMAX=300;
static boolean isApplet=false,isRunning=false;
static String codeBase=null;
static Image[][] head,alphaHead;
static Image upImage=null,downImage=null,addImage=null,modifyImage=null;
static Image m0Image=null,m1Image=null,m2Image=null,m3Image=null,smsgImage=null,dialogImage=null;
static Image mailImage=null,icqImage=null,logImage=null,seekImage=null,jicqImage=null;
static LogonFrame lf=null;
Thread mainFrame=null;
String state="";
static AudioClip msgAC=null,sMsgAC=null;
static String msgAudioPath="image/msg.au",sMsgAudioPath="image/smsg.au";
public jICQ(){
}
public static void main(String args[]){
/* Socket socket=null;
for(int i=0;i<host.length;i++){
//System.out.println(" host[i]:"+host[i]);
try{socket=new Socket(host[i],7802);}catch(Exception e){}
if(socket!=null){URLstring=host[i];i=host.length+1;}
}
*/
if(args.length>0)if(args[0]!=null&&!args[0].equals(""))URLstring=args[0];
System.out.println("Starting jICQ...\nThe server is:"+URLstring);
jICQ j=new jICQ();
j.getDiskFile();
j.logon();
}
private void logon(){
lf=new LogonFrame();
while(!logonOK){try{Thread.sleep(100);}catch(Exception e){}}
mainFrame=new Thread(new MainFrame(icqNo));
mainFrame.start();
logonOK=false; //if applet in brower refushed,then must relogon
}
public static void setID(String s){icqNo=s;logonOK=true;}
public static String getver(){return ver;}
public void init(){
isApplet=true;
exitSystem=true;state="正在初始化...";repaint();
codeBase=getDocumentBase().toString();
head=new Image[31][2];
alphaHead=new Image[31][2];
for(int i=0;i<=30;i++)
try{
head[i][0]=getImage(getDocumentBase(),"image/"+i+"-0.gif");
alphaHead[i][0]=alpha(head[i][0]);
head[i][1]=getImage(getDocumentBase(),"image/"+i+"-1.gif");
alphaHead[i][1]=alpha(head[i][1]);
}catch(Exception e){System.out.println(" jICQ.init() read picture error:"+e);}
upImage=getImage(getDocumentBase(),"image/up.gif");
downImage=getImage(getDocumentBase(),"image/down.gif");
mailImage=getImage(getDocumentBase(),"image/mail.gif");
icqImage=getImage(getDocumentBase(),"image/icq.gif");
logImage=getImage(getDocumentBase(),"image/log.gif");
seekImage=getImage(getDocumentBase(),"image/seek.jpg");
jicqImage=getImage(getDocumentBase(),"image/jicq.jpg");
addImage=getImage(getDocumentBase(),"image/add.gif");
modifyImage=getImage(getDocumentBase(),"image/modify.gif");
m0Image=getImage(getDocumentBase(),"image/m0.gif");
m1Image=getImage(getDocumentBase(),"image/m1.gif");
m2Image=getImage(getDocumentBase(),"image/m2.gif");
m3Image=getImage(getDocumentBase(),"image/m3.gif");
smsgImage=getImage(getDocumentBase(),"image/smsg.gif");
dialogImage=getImage(getDocumentBase(),"image/dialog.gif");
msgAC=getAudioClip(getDocumentBase(), msgAudioPath);
sMsgAC=getAudioClip(getDocumentBase(), sMsgAudioPath);
audioPlay(1);
}
public void start(){state="运行中...";repaint();if(isRunning==false){isRunning=true;logon();}}
public void stop(){exitSystem=true; state="已退出。";repaint();}
public void destory(){stop();}
private void getDiskFile(){
head=new Image[31][2];
alphaHead=new Image[31][2];
Frame f=new Frame();
for(int i=0;i<=30;i++)
try{
head[i][0]=f.getToolkit().getImage("image/"+i+"-0.gif");
alphaHead[i][0]=alpha(head[i][0]);
head[i][1]=f.getToolkit().getImage("image/"+i+"-1.gif");
alphaHead[i][1]=alpha(head[i][1]);
}catch(Exception e){System.out.println(" jICQ.jICQ() read picture error:"+e);}
try{
upImage=f.getToolkit().getImage("image/up.gif");
downImage=f.getToolkit().getImage("image/down.gif");
mailImage=getToolkit().getImage("image/mail.gif");
icqImage=getToolkit().getImage("image/icq.gif");
logImage=getToolkit().getImage("image/log.gif");
seekImage=getToolkit().getImage("image/seek.jpg");
jicqImage=getToolkit().getImage("image/jicq.jpg");
addImage=getToolkit().getImage("image/add.gif");
modifyImage=getToolkit().getImage("image/modify.gif");
m0Image=getToolkit().getImage("image/m0.gif");
m1Image=getToolkit().getImage("image/m1.gif");
m2Image=getToolkit().getImage("image/m2.gif");
m3Image=getToolkit().getImage("image/m3.gif");
smsgImage=getToolkit().getImage("image/smsg.gif");
dialogImage=getToolkit().getImage("image/dialog.gif");
}catch(Exception e){System.out.println(" MainFrame.MainFrame() read picture error:"+e);}
}
public void paint(Graphics g){
getGraphics().drawImage(icqImage,0,0,this);
getGraphics().drawString(state,50,30);
}
private Image alpha(Image inImg)
{
Image outImg=null;
try{
MediaTracker mt;
mt=new MediaTracker(this);
mt.addImage(inImg,1);
mt.waitForID(1); // 等待所有图片的数据都被正确载入
if (inImg==null)return null;
int imgw=inImg.getWidth(this);
int imgh=inImg.getHeight(this);
//System.out.println(" w,h="+imgw+","+imgh);
int deepHead[]=new int[imgw*imgh];
PixelGrabber pg=new PixelGrabber(inImg,0,0,imgw,imgh,deepHead,0,imgw);
pg.grabPixels();
int r,g,b,light=80;
for(int i=0;i<imgw * imgh;i++){
r=deepHead[i]>>16&0xff;r+=light;if(r>0xff)r=0xff;
g=deepHead[i]>>8&0xff;g+=light;if(g>0xff)g=0xff;
b=deepHead[i]&0xff;b+=light;if(b>0xff)b=0xff;
deepHead[i]=deepHead[i]&0xff000000|(r<<16)|(g<<8)|b;
}//把所有的象素的Alpha值
outImg=createImage(new MemoryImageSource(imgw,imgh,deepHead,0,imgw));//生成前景图象
mt.addImage(outImg,2);
mt.waitForID(2);
}catch(Exception e){outImg=null;}
return outImg;
}
public static void audioPlay(int mode){
String path=null;
try{
//System.out.println(" is Applet:"+isApplet);
if(isApplet){
if(mode==1)msgAC.play();
if(mode==2)sMsgAC.play();
}
else{
if(mode==1)path=msgAudioPath;
if(mode==2)path=sMsgAudioPath;
InputStream in = new FileInputStream(path);
AudioStream as = new AudioStream(in);
AudioPlayer.player.start(as);
}
}catch(Exception e){e.printStackTrace();}
}
}
class MainFrame extends Frame implements Runnable
{
static Hashtable friend;
static boolean friendBusy=false;
static String friends="",onlineFriends="";
static boolean repaintEvt=false,duplogon=false,NEWMSG=false,icqShowing=false;
static Vector message;
static IcqID myIcqID=null;
static int UDPrPort=7900;
static long lastShowTime=0;
static int[][] area;
static int currentarea=0,pastarea=0;
static String mis[]={"收/发信息 R/S (F4)","删除此人 Delete","详细资料 Info","刷新 Refrush","-","大图标 Big icon","小图标 small icon","添加好友 Append"};
static String modifymis[]={"修改个人资料 pID","修改系统信息 sInfo"};
static boolean LOGED=false,canSend=false;
static HttpImage httpimage=null;
static SysInfo sysinfo=null;
static int menuItemIndex=0;
DatagramSocket udpRSocket=null;
PopupMenu pm,modifyPM;
IcqID currenticqid=null;
String joinedIcqNo=null;
Result result=null;
Seek seek=null;
Sender sender=null;
Dialog dialog=null;
SubmitID submitid=null;
Dialog diaFrame=null;
Sender onlineMon=null;
MyDialog mydialog=null;
RMsg rmsg=null;
MainFrame(String icqNo)
{
try{
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
enableEvents(AWTEvent.KEY_EVENT_MASK);
enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK );
repaintEvt=false;duplogon=false;NEWMSG=false;icqShowing=false;
LOGED=false;jICQ.exitSystem=false;canSend=false;
myIcqID=new IcqID();
myIcqID.icqNo=icqNo;
message=new Vector();
friend=new Hashtable();
result=new Result();
sysinfo=new SysInfo();
setTitle(icqNo);
setIconImage(jICQ.icqImage);
buildPopupMenu();
setBounds(sysinfo.xposition,sysinfo.yposition,100,500);
httpimage=new HttpImage();
httpimage.start();
setVisible(true);
}catch(Exception e){System.out.println(" MainFrame.MainFrame() error:"+e);close();}
}
public void run()
{
System.out.println(" begin connect... ");
if (!jICQ.isApplet){
for(;(UDPrPort<65535)&&(udpRSocket==null);UDPrPort++)
try{udpRSocket=new DatagramSocket(UDPrPort);}
catch(Exception e){}
UDPrPort--;
if(udpRSocket==null){jICQ.exitSystem=true;exitMsg("不能建立UDP接收端口。");return;}
rmsg=new RMsg(udpRSocket,myIcqID);
rmsg.start();
}
String onlineCmd=null,onlineCmd2=null;
try
{
String randomId=new Integer(new Random().nextInt()).toString();
onlineCmd="ONLINEMON icqNo:"+myIcqID.icqNo+" id:"+randomId;
onlineMon=new Sender(onlineCmd);
onlineMon.start();
String cmd=null;
if(jICQ.isApplet)cmd="GETME icqNo:"+myIcqID.icqNo+" port:"+UDPrPort;
else {
//int i=0;boolean ew=false;
//while(i<40&&ew==false){Thread.sleep(100);if (rmsg.udpback)ew=true;}
//cmd="GETME icqNo:"+myIcqID.icqNo+" port:"+rmsg.backport;
cmd="GETME icqNo:"+myIcqID.icqNo+" port:"+UDPrPort;
}
sender=new Sender(cmd);
sender.start();
result=sender.getReturn();
if(result.getCode()==200){}
else {jICQ.exitSystem=true;exitMsg(result.getMsg());return;}
toHash(friends);
toID(onlineFriends);
reSort();
//begin to monitor message
}catch(Exception e){System.out.println(" MainFrame run()-log error.\n");e.printStackTrace();}
LOGED=true;
repaint();
try
{
//Result result=null;
try{myIcqID=getID(myIcqID);myIcqID.isOnline=true;}catch(Exception e){}
seek=new Seek(myIcqID);
Dimension currentsize,pastsize;
currentsize=pastsize=getSize();
while(jICQ.exitSystem==false)
try{
currentsize=getSize();
if(currentsize.height!=pastsize.height){repaintEvt=true;pastsize=getSize();}
if(repaintEvt){reSort();repaint();repaintEvt=false;}
if(!onlineMon.isAlive()){onlineMon=new Sender(onlineCmd);onlineMon.start();}
if(duplogon){setVisible(false);exitMsg("别人正在用这个号码登录,请保护好你的密码。");}
checkID();
Thread.sleep(100);
}catch(Exception e){System.out.println(" MainFrame.run() error:"+e);} //end while
}catch(Exception e){System.out.println(" MainFrame run() error:"+e);e.printStackTrace();}
}
public void paint(Graphics g)
{
if(!LOGED)return;
try
{
setBackground(new Color(sysinfo.backgroundcolor));
setForeground(new Color(sysinfo.textcolor));
sysinfo.xposition=this.getLocationOnScreen().x;sysinfo.yposition=this.getLocationOnScreen().y;
Dimension dm=getSize();
if(dm.width>250)setSize(250,dm.height);
if(dm.height<175)setSize(dm.width,175);
dm=getSize();
int iconSize=34;
if(sysinfo.bigIcon)iconSize=40;else iconSize=28;
area=new int[20][4];
for(int i=0;i<20;i++){area[i][0]=-1;area[i][1]=-1;area[i][2]=-1;area[i][3]=-1;}
int left=5,right=5;
int realwidth=dm.width-left-right;
area[0][0]=left;area[0][1]=23;area[0][2]=area[0][0]+realwidth/4;area[0][3]=40; //
area[1][0]=area[0][2]+1;area[1][1]=area[0][1];area[1][2]=area[1][0]+realwidth/4;area[1][3]=area[0][3]; //
area[2][0]=area[1][2]+1;area[2][1]=area[0][1];area[2][2]=area[2][0]+realwidth/4;area[2][3]=area[0][3]; //
area[3][0]=area[2][2]+1;area[3][1]=area[0][1];area[3][2]=area[3][0]+realwidth/4;area[3][3]=area[0][3]; //
area[4][0]=left;area[4][1]=area[3][3]+1;area[4][2]=area[4][0]+realwidth;area[4][3]=dm.height-70-20; //head img
area[5][0]=left+realwidth/2+1;area[5][1]=area[4][3]+1;area[5][2]=area[5][0]+realwidth/4;area[5][3]=dm.height-70; //up
area[6][0]=area[5][2]+1;area[6][1]=area[4][3]+1;area[6][2]=area[6][0]+realwidth/4;area[6][3]=dm.height-70; //down
area[7][0]=left;area[7][1]=area[6][3]+4;area[7][2]=area[7][0]+realwidth;area[7][3]=area[7][1]+20; //add friend
area[8][0]=left;area[8][1]=area[7][3]+1;area[8][2]=area[8][0]+realwidth/2;area[8][3]=area[8][1]+20; //message
area[9][0]=area[8][2]+1;area[9][1]=area[7][3]+1;area[9][2]=area[9][0]+realwidth/2;area[9][3]=area[9][1]+20; //modify
area[10][0]=left;area[10][1]=area[9][3]+1;area[10][2]=area[10][0]+realwidth;area[10][3]=dm.height-5; //ver
//begin to draw image and text
if(!jICQ.isApplet){Image backImg=sysinfo.getBackImage(getToolkit());if(backImg!=null)g.drawImage(backImg,0,0,dm.width,dm.height,this);}
g.drawImage(jICQ.m0Image,area[0][0]+(area[0][2]-area[0][0])/2-8,area[0][3]-16,16,16,this);
g.drawImage(jICQ.m1Image,area[1][0]+(area[1][2]-area[1][0])/2-8,area[1][3]-16,16,16,this);
g.drawImage(jICQ.m2Image,area[2][0]+(area[2][2]-area[2][0])/2-8,area[2][3]-16,16,16,this);
g.drawImage(jICQ.m3Image,area[3][0]+(area[3][2]-area[3][0])/2-8,area[3][3]-16,16,16,this);
//g.drawImage(jICQ.head[Integer.parseInt(myIcqID.picNo)][1],left+2,area[4][3]+2,18,18,this);
g.drawImage(jICQ.upImage,area[5][0]+(area[5][2]-area[5][0])/2-8,area[5][3]-17,16,16,this);
g.drawImage(jICQ.downImage,area[6][0]+(area[6][2]-area[6][0])/2-8,area[6][3]-17,16,16,this);
g.drawImage(jICQ.addImage,area[7][0]+(area[7][2]-area[7][0])/2+28,area[7][1]+2,16,16,this);
g.drawString("添加好友",area[7][0]+(area[7][2]-area[7][0])/2-24,area[7][3]-5);
int msgAll=message.size();
Color c=null;
String msgcount=new Integer(msgAll).toString()+" 消息";
if(msgAll>0){
c=g.getColor();
g.setColor(Color.gray);
g.drawString(msgcount,area[8][0]+(area[8][2]-area[8][0])/2-15+2,area[8][3]-5+2);
g.setColor(Color.red);
}
g.drawString(msgcount,area[8][0]+(area[8][2]-area[8][0])/2-15,area[8][3]-5);
if(msgAll>0)g.setColor(c);
g.drawString("修改",area[9][0]+(area[9][2]-area[9][0])/2-18,area[9][3]-5);
g.drawImage(jICQ.modifyImage,area[9][0]+(area[9][2]-area[9][0])/2+5,area[9][1]+1,16,16,this);
g.drawString("jICQ "+jICQ.ver,area[10][0]+(area[10][2]-area[10][0])/2-48,area[10][3]-5);
g.drawImage(jICQ.logImage,area[10][0],area[10][1],area[10][2]-area[10][0],area[10][3]-area[10][1],this);
int cell=(area[4][3]-area[4][1])/iconSize;
Enumeration e=friend.keys();
IcqID icqid=null;
int offset=3;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -