工程技术学院毕业设计(论文)专用纸
聊天系统工作原理图
3.3 JAVAqq局域网聊天程序各功能模块
1.LoadingFrame(源代码见附录,下同)
public void init(){//登陆界面的初始化方法 }
setTitle(\登录\
setIconImage((new ImageIcon(\??
setLocation(387, 234); setSize(350,300); setVisible(true);
setDefaultCloseOperation(3);
loadBtn.addActionListener(this);//将“登陆”按钮加入到事件侦听器中 cancelBtn.addActionListener(this);//讲“取消”按钮加入到事件侦听器中 nameText.addActionListener(this);//讲输入用户名的文本框加入到事件侦听器中 this.setResizable(false);
public void actionPerformed(ActionEvent e) {
if(e.getSource()==loadBtn||e.getSource()==nameText){//创建客户端主界面
text=nameText.getText(); new StateFrame(text); dispose();
16 第 页
工程技术学院毕业设计(论文)专用纸
}
}else if(e.getSource()==cancelBtn){//取消登录,推出程序 }
dispose(); System.exit(0);
程序的登录窗口,从此窗口中,输入用户名,点击“登陆”来初始化一个StateFrame
对象,并在显示器上显示出客户端的主界面。在后期的完善中,会完成记住用户名及自动登录功能。主要通过将用户名写入一个记事本保存起来。 2.StateFrame
public final static int DEFAULT_PORT=8322;//默认端口 public final static int CATCH_PORT=7322;
public final static int TCP_PORT=6322;//默认TCP连接端口 public void init(){//初始化应用程序窗口
??
friList.addActionListener(new ActionListener(){
//用ActionListener接口来对图形界面中的各个组件进行监听
public void actionPerformed(ActionEvent e) {
//双击登录到列表框内容时触发的事件为连通列表框中的IP,建立TCP通信 Socket socket;
int s=friList.getSelectedIndex();
String address=userinfo[s].getIP();//获取对方IP try {
socket=new Socket(address,TCP_PORT);//建立连接
MainChatFrame mf=new MainChatFrame(socket,userinfo[s].getName());
//启动私聊主界面
} catch (Exception e1) {e1.printStackTrace();}
}});
??
//初始化UDP协议端口信息
//首先向已在线的程序发送本机的IP以及请求响应并对相应的组播端进行监听 public void JoinGroup(){
17 第 页
工程技术学院毕业设计(论文)专用纸
try {
group=InetAddress.getByName(\初始化广播聊天信息组 groupC=InetAddress.getByName(\初始化登录信息组 socket=new DatagramSocket(); byte notify[]=new byte[100]; byte nametag[]=new byte[20]; nametag=name.getBytes();
//发送一个登录信息给已登录的用户,通知他们本程序上线。 //包的数据结构为:判断位+用户名+IP地扯+用户名长度 notify=new String(\
+InetAddress.getLocalHost().getHostAddress()+name.length()).getBytes();
packet=new DatagramPacket(notify,notify.length,groupC,CATCH_PORT); socket.send(packet);
socketC=new MulticastSocket(CATCH_PORT); socketC.joinGroup(groupC);
Catcher catcher=new Catcher(socketC,this,name,userinfo); CheckIn login=new CheckIn(this,userinfo);
} catch (Exception e) { e.printStackTrace(); }}
用来显示用用户名及在线人的窗口,并对窗口中各组件实施监听。让其可顺利生成
各个聊天主界面。 3.Catcher
//实现对组播端口的监听,并作出反映
public void run(){
try {socket=new DatagramSocket();
while(true){
byte[] Rdata=new byte[256];
packet=new DatagramPacket(Rdata,Rdata.length); Csocket.receive(packet);//等待接受数据包 String count=new
String(packet.getData()).substring(packet.getLength()-1,packet.getLength());
int num=Integer.parseInt(count);
//count记录了数据包的最后一位数,也就是记录了用户名的长度。
18 第 页
工程技术学院毕业设计(论文)专用纸
String check=new String(packet.getData()).
substring(1+num,packet.getLength()-1); //check为数据包的IP地址
String judge=new String(packet.getData()).substring(0,1); String usertag=new String (packet.getData()).substring(1,num+1); if(judge.equals(\
//judge为“C”时反送一个含有对方用户名以及本机的IP的数据包到组播组
}
??
public void Connect(String check){ //Connect()方法实现了对对方回应本机信息的过程,
//其中第一以及最后一个为无用信息,在接受方被吸收掉
??
CheckSocket=new Socket(check,CHECK_PORT); in=new BufferedReader(new
InputStreamReader(CheckSocket.getInputStream()));
out=new PrintWriter(CheckSocket.getOutputStream());
??
用来对登录信息的监听,并解析传送过来的数据包。 4.Listener
public void run(){
try {while(true){
}
byte[] Rdata=new byte[256];
packet=new DatagramPacket(Rdata,Rdata.length);//用Rdata数组来接收数据, MSocket.receive(packet);
//并传给MulticastSocket对象
SF.groupchat.processMsg(new String(packet.getData())); SF.groupchat.setVisible(true);ring();
} catch (IOException e) {
e.printStackTrace();}}
19 第 页
工程技术学院毕业设计(论文)专用纸
用来对群消息的监听及处理,将接收到的消息打包,传给MulticastSocket对象,再
利用CheckIn和Logon对象进行处理。 5.CheckIn
//对回应信息的端口的监听,一旦收到回应信息则开启一个新线程对其进行信息的接收
public void run(){
try {
Check=new ServerSocket(CHECK_PORT);
} catch (IOException e) {e.printStackTrace();} try {
while(true){
client=Check.accept();
Logon ll=new Logon(sf,client,userinfo); ll.start();}
} catch (IOException e) {e.printStackTrace(); }}
6.Logon
public void run(){
//run()方法实现对回应的TCP连接的信息的接收,并且完成对UserInfo信息的保存
String msg=null; Try{
msg=receiveMsg();
name=msg;//获取对方的名字 msg=receiveMsg(); ip=msg;//获取对方的IP { }
sf.processFriend(userinfo[k].getName()); msg=receiveMsg(); ??
}
k=sf.friList.getSelectedIndex(); userinfo[k]=new UserInfo(name,ip);
20 第 页