📄 kbrll.java
字号:
/* 2004年毕业设计
聊天室客户端程序 kbrll.java
设计人:王楠
*/
//加载必要的类
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.*;
//定义主类
public class kbrll
{
//创建类变量
static jform1 form1=new jform1();
static jform2 form2=new jform2();
static kbrll kbr1=new kbrll(); //创建本类实体
static String llname; //llname为本地昵称
static String s_ip; //server的ip地址
static int s_port; //server的端口
static String rece; //接收广播信息
static boolean biao=true; //循环标识
static Vector ll=new Vector(10,10); //其它人昵称集合
static Socket s; //主套接字
static String mjian="~'`"; //信息间隔符
static boolean qiao=false; //悄悄话标识
//类方法,程序起点
public static void main(String kerberos[])
{
form1.button1.addActionListener(new aclis1());//设form1.button1的聆听者
form1.load();
while(biao){}//等待form1的连接成功
System.out.println("ok");
form2.addWindowListener(new aclis2());
form2.button1.addActionListener(new aclis1());//设form2.button1的聆听者
form2.list1.addItemListener(new aclis1()); //设form2.list1的聆听者
form2.checkbox1.addItemListener(new aclis2());//设form2.checkbox1的聆听者
//反复侦听广播
try{
MulticastSocket msock=new MulticastSocket(1129); //创建广播接收类
InetAddress llip=InetAddress.getByName("224.0.1.129"); //创建广播地址
msock.joinGroup(llip); //加入多播地址
//侦听广播
while(true)
{
byte[] buf=new byte[512];
DatagramPacket mpack=new DatagramPacket(buf,buf.length);
msock.receive(mpack);
rece=new String(mpack.getData());//将数据包转换成字符串
System.out.println(rece);
kbr1.message(rece); //分析处理字符串
}//end while
}catch(IOException e){}
}//end main
//连接信息通信方法
static void sock1(String sname,int sport,String llname)
{
try{
Socket sp=new Socket(sname,sport);
//定义输出流
PrintStream out=new PrintStream(sp.getOutputStream());
//定义输入流
BufferedReader in
=new BufferedReader(new InputStreamReader(sp.getInputStream()));
out.println("liao"); //向服务器发送标识信息
String ltsname; //聊室名称
String sin=in.readLine(); //读取服务器返回信息
if(sin.equals("yes")) //判断是否为聊天服务器
{
out.println(llname); //向服务器发送本机聊天昵称
sin=in.readLine(); //接收服务器返回信息
if(sin.equals("max")){
form1.label1.setText("聊天室人已满");
form1.load();
}
if(sin.equals("more")) //重名
{form1.label1.setText("此昵称已存在,换之");
//关闭流和连接
//sp.close();
// in.close();
// out.close();
form1.load();
}//if
if(sin.equals("ok")) //可以加入
{
form1.label2.setText("正在下载信息..........");
ltsname=in.readLine(); //读取聊天室名称
sin=in.readLine(); //读取用户集合的长度
int x=Integer.parseInt(sin); //转换
form2.load();
if(x>0)
for(int i=0;i<x;i++)
{
sin=in.readLine(); //读取用户
ll.add(sin); //加入本地
form2.list1.add(sin);
}//for
form2.setTitle("Kerberos's connect "+ltsname);
form2.label2.setText("聊天室共有"+(x+1)+"人");
s_ip=sname; //将server的ip赋给s_ip
s_port=sport; //将server的端口赋给s_port
form1.dispose(); //关闭form1
//打开form2
biao=false;
}//if
}//if
//如果不是聊天服务器,退出程序
else
{
System.out.println("所连接非聊天服务器");
form1.dispose();
System.exit(0);
}//else
sp.close();
in.close();
out.close();
}catch(IOException e){
form1.label1.setText("服务器或端口有误");
form1.load();
}
}//end sock
//聊天信息通信方法
static void sock2(String ip,int po,String fo)
{
try{
Socket sp=new Socket(ip,po);
//定义输出流
PrintStream out=new PrintStream(sp.getOutputStream());
//定义输入流
BufferedReader in
=new BufferedReader(new InputStreamReader(sp.getInputStream()));
int len=fo.length();
System.out.println(fo);
out.println("mess"); //发送聊天请求
out.println(len); //发送信息长度
for(int i=0;i<len;i++)
out.println(fo.substring(i,i+1));//发送信息
}catch(Exception e){}
}
//退出聊天室通信方法
static void sock3(String ip,int po,String fo)
{
try{
Socket sp=new Socket(ip,po);
//定义输出流
PrintStream out=new PrintStream(sp.getOutputStream());
//定义输入流
BufferedReader in
=new BufferedReader(new InputStreamReader(sp.getInputStream()));
out.println(fo);
}catch(Exception e){}
}
//字符串分析方法
void message(String srece)
{
if(srece.startsWith("@"))
{
int dfip=srece.indexOf("@",1);
String snip=srece.substring(2,dfip); //取出IP地址
if(s_ip.equals(snip)) //判断是否为服务器地址
{ srece=srece.substring(dfip+1);
String str=srece.substring(0,3); //取标识字符串
//添加用户
if(str.equals("+++"))
{
int df=srece.indexOf("+++",3);
String sn=srece.substring(3,df); //取出用户名
if(!sn.equals(llname))
form2.list1.add(sn);
ll.add(sn);
form2.label2.setText("聊天室共有"+(ll.size()+1)+"人");
}//end if
//删除用户
if(str.equals("---"))
{
int df=srece.indexOf("---",3);
String sn=srece.substring(3,df);//取出用户名
if(!sn.equals(llname))
{
form2.list1.remove(sn);
ll.removeElement(sn);
form2.label2.setText("聊天室共有"+(ll.size()+1)+"人");
}
else{//如果用户名为自己,则是被服务器踢出
form2.rtext1.append("因为您的不良言行惹怒了管理员,所以您将被踢出聊天室。");
form2.rtext1.append("\n请倒数十秒,然后向管理员的方向忏悔。");
form2.rtext1.append("\n");
//倒数十秒后退出
try{
for(int i=9;i>(-1);i--)
{
form2.rtext1.append(""+i+" ");
Thread.sleep(1000);
}
form2.dispose();
System.exit(0);
}catch(Exception e){}
}
}//end if
//添加聊天信息
if(str.equals(mjian))
{
int df1=srece.indexOf(mjian,3);
String sn1=srece.substring(3,df1); //取出信息读取权艰
String sn2=srece.substring(df1+3); //取出聊天信息
System.out.println(sn1);
System.out.println(sn2);
if(sn1.equals("所有人")||sn1.equals(llname))//可读
{
int rtexth=form2.rtext1.getRows();
form2.rtext1.append(sn2);
form2.rtext1.append("\n");
}//end if
}//end if
}//end if
}//end if
}//end message
//内部类,用于事件聆听
static class aclis1 implements ActionListener,ItemListener
{
//按钮事件
public void actionPerformed(ActionEvent e)
{
String dx=e.getActionCommand();
//form1.button1
if(dx.equals("连接"))
{
String sname;
int sport;
form1.button1.setVisible(false);
form1.text1.setEditable(false);
form1.text2.setEditable(false);
form1.text6.setEditable(false);
form1.label2.setVisible(true);
try{
sname=form1.text1.getText(); //取得待连接地址
llname=form1.text6.getText(); //取得聊天昵称
sport=Integer.parseInt(form1.text2.getText()); //取得端口号
kbr1.sock1(sname,sport,llname); //调用连接方法
}catch(Exception d){form1.label1.setText("端口输入类型有误");
form1.load();
}
}
//form2.button1
else if(dx.equals("发送"))
{
String toname,info,m,inmess;
toname=form2.text1.getText();
m=form2.rtext2.getText();
if(!m.equals(""))
{
info=llname+" 对 "
+toname+"\b说:"
+m;
if(qiao==true)
{
inmess=mjian+toname+mjian+"悄悄话>> "+info;
if(!toname.equals("所有人"))
form2.rtext1.append("\n悄悄话>> "+info);
}
else
inmess=mjian+"所有人"+mjian+info; //格式化聊天信息
System.out.println(inmess);
form2.rtext2.setText("");
kbr1.sock2(s_ip,s_port,inmess); //向服务器发送聊天信息
} }
}//end actionPerformed
//列表框事件
public void itemStateChanged(ItemEvent e)
{
form2.text1.setText(form2.list1.getSelectedItem());
}//end itemStateChanged
}//end class aclis
//复选框事件和退出事件
static class aclis2 extends WindowAdapter implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
qiao=!qiao;
System.out.println(qiao);
}//end itemStateChanged
public void windowClosing(WindowEvent e)
{
//向服务器发送退出信息
kbrll.sock3(kbrll.s_ip,kbrll.s_port,"---"+kbrll.llname+"---");
form2.dispose();
System.exit(0);
}
}
}//end class kbrll
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -