📄 chatapplet.java
字号:
System.out.println("request into secret");
}
else
{ list1.deselect(index);
list1.select(selecti);
}
}
}
//Font information
float fsize=Float.parseFloat(fontsize.getText());
//checkbox
if(e.getSource()==ch1)
{ if(e.getStateChange()==e.SELECTED)
{ ch1.setState(true);
if(ch3.getState())
ch3.setState(false);
if(ch2.getState())
ch2.setState(false);
msg_txt.setFont(msg_txt.getFont().deriveFont(Font.BOLD,fsize));
}
else
{ ch1.setState(false);
msg_txt.setFont(msg_txt.getFont().deriveFont(Font.PLAIN,fsize));
}
}
if(e.getSource()==ch2)
{ if(e.getStateChange()==e.SELECTED)
{ ch2.setState(true);
if(ch3.getState())
ch3.setState(false);
if(ch1.getState())
ch1.setState(false);
msg_txt.setFont(msg_txt.getFont().deriveFont(Font.ITALIC,fsize));
}
else
{ ch2.setState(false);
msg_txt.setFont(msg_txt.getFont().deriveFont(Font.PLAIN,fsize));
}
}
if(e.getSource()==ch3)
{ if(e.getStateChange()==e.SELECTED)
{ ch3.setState(true);
ch1.setState(false);
ch2.setState(false);
msg_txt.setFont(msg_txt.getFont().deriveFont(Font.PLAIN,fsize));
}
else
ch3.setState(false);
}
//checkboxgroup
if(e.getSource()==cr1&&e.getStateChange()==e.SELECTED)
{ msg_txt.setForeground(Color.red);
color="RED";
}
if(e.getSource()==cr2&&e.getStateChange()==e.SELECTED)
{ msg_txt.setForeground(Color.blue);
color="BLUE";
}
if(e.getSource()==cr3&&e.getStateChange()==e.SELECTED)
{ msg_txt.setForeground(Color.green);
color="GREEN";
}
if(e.getSource()==cr4&&e.getStateChange()==e.SELECTED)
{ msg_txt.setForeground(Color.black);
color="BLACK";
}
}
//other member function
public void disconnect() //客户端点击断开连接要运行的方法
{ if(soc!=null)
{ try
{ chat_txt.setText("");
name_txt.setText("");
current.setText("");
list1.clear();
listen.suspend();
ps.println("QUIT"); //用打印流发送QUIT信息通知服务器断开此次通信
ps.flush();
soc.close();
soc=null; //关闭套接字
}
catch(IOException e)
{ System.out.println("Error:"+e);
}
finally //default settings
{ cr1.setState(false);
cr2.setState(false);
cr3.setState(false);
cr4.setState(true);
//---------------
ch1.setState(false);
ch2.setState(false);
ch3.setState(true);
//---------------
fontsize.setText("12");
}
}// end of if
}
class Listen extends Thread //客户端线程类用来监听服务器传来的信息
{ String name=null; //用来存储客户端连接后的name信息
DataInputStream dis=null; //用来实现客户端接受服务器数据的输入流
PrintStream ps=null; //用来实现从客户端发送数据到服务器的打印流
Socket socket=null; //用来存储客户端的socket信息
chatApplet parent=null; //用来存储当前运行的chatApplet实例
public Listen(chatApplet p,String n,Socket s) //Listen类的构造器
{ //接受参数
parent=p;
name=n;
socket=s;
try
{ //实例化两个数据流
dis=new DataInputStream(s.getInputStream());
ps=new PrintStream(s.getOutputStream());
}
catch(IOException e)
{ System.out.println("Error:"+e);
parent.disconnect();
}
} //end of Listen constractor
public void run() //线程运行方法
{ String msg=null;
while(true)
{ try
{ byte b[]=new byte[512];
int count=dis.read(b);
StringBuffer sbuf=new StringBuffer();
for(int i=0;i<count;i++)
sbuf.append((char)b[i]);
msg=sbuf.toString();
} //读取从服务器传来的信息
catch(IOException e)
{ System.out.println("Error:"+e);
parent.disconnect();
}
if(msg==null) //如果从服务器传来的信息为空则断开此次连接
{ parent.listen=null;
parent.soc=null;
parent.list1.clear();
return;
}
StringTokenizer st=new StringTokenizer(msg,":"); //用StringTokenizer类来实现读取分段字符
String keyword=st.nextToken(); //读取信息头即关键字用来识别是何种信息
if(keyword.equals("PEOPLE")) //如果是PEOPLE则是服务器发来的客户连接信息
//主要用来刷新客户端的用户列表
{ parent.list1.clear();
while(st.hasMoreTokens()) //遍历st取得目前所连接的客户
{ String str=st.nextToken();
parent.list1.addItem(str);
}
}
else if(keyword.equals("MSG")) //如果关键字是MSG则是服务器传来的聊天信息
//主要用来刷新客户端聊天信息区将每个客户的聊天内容显示出来
{ int fontstyle=Integer.parseInt(st.nextToken());
int fontsize=Integer.parseInt(st.nextToken());
String fontcolor=st.nextToken();
String usr=st.nextToken();
String temp=usr+st.nextToken("\0");
parent.chat_txt.append(temp);
parent.chat_txt.append("\n\n");
parent.current.setFont(chat_txt.getFont().deriveFont(fontstyle,(float)fontsize));
parent.current.setText(temp);
if(fontcolor.equalsIgnoreCase("RED"))
parent.current.setForeground(Color.red);
if(fontcolor.equalsIgnoreCase("BLUE"))
parent.current.setForeground(Color.blue);
if(fontcolor.equalsIgnoreCase("GREEN"))
parent.current.setForeground(Color.green);
if(fontcolor.equalsIgnoreCase("BLACK"))
parent.current.setForeground(Color.black);
}
else if(keyword.equals("SYSMSG")) //系统消息
{ String info=st.nextToken("\0");
String title="System Message";
JOptionPane.showMessageDialog(parent,info,title,JOptionPane.PLAIN_MESSAGE);
}
else if(keyword.equals("CONNECT")) //有用户上线
{ String usr=st.nextToken();
parent.list1.addItem(usr+" 上线");
}
else if(keyword.equals("QUIT")) //有用户下线
{ String usr=st.nextToken();
parent.list1.addItem(usr+" 退出");
}
else if(keyword.equals("REQCON"))
{ boolean agree;
String usr=st.nextToken();
int rv;
if(select==null)
{
System.out.println("respond request");
String info=usr+"要与你进入悄悄话模式,同意否?";
String title="make sure";
rv=JOptionPane.showConfirmDialog(parent,info,title,JOptionPane.OK_CANCEL_OPTION);
if(rv==JOptionPane.OK_OPTION)
{
agree=true;
int i;
for(i=0;i<parent.list1.getItemCount();i++)
{
if(parent.list1.getItem(i).equals(usr))
{ parent.list1.select(i);
select=usr;
selecti=i;
break;
}
}
}
else
agree=false;
StringBuffer msg1=new StringBuffer("RESPOND:");
msg1.append(usr+" "+agree);
ps.println(msg1);
ps.flush();
}
else
{
String info=usr+"要与你进入悄悄话模式\n";
info=info+" 若同意,则会先退出与 "+parent.list1.getSelectedItem()+"的悄悄话模式";
info=info+"\n 若撤消则拒绝"+usr+"的请求 ";
String title="make sure";
rv=JOptionPane.showConfirmDialog(parent,info,title,JOptionPane.OK_CANCEL_OPTION);
if(rv==JOptionPane.OK_OPTION)
{
agree=true;
StringBuffer msg1=new StringBuffer("RESPOND:");
msg1.append(usr+" "+agree);
ps.println(msg1);
ps.flush();
StringBuffer msg2=new StringBuffer("REQEXIT:");
msg2.append(parent.list1.getSelectedItem());
ps.println(msg2);
ps.flush();
parent.list1.deselect( parent.selecti); //change list state;
for(int i=0;i<parent.list1.getItemCount();i++)
{
if(parent.list1.getItem(i).equals(usr))
{ parent.list1.select(i);
select=usr;
selecti=i;
break;
}
}
}
else
{ agree=false;
StringBuffer msg1=new StringBuffer("RESPOND:");
msg1.append(usr+" "+agree);
ps.println(msg1);
ps.flush();
}
}
}
else if(keyword.equals("REQEXIT"))
{ String usr=st.nextToken();
String info=usr+"要与你退出 悄悄话模式";
String title="make sure";
JOptionPane.showMessageDialog(parent,info,title,JOptionPane.PLAIN_MESSAGE);
parent.list1.deselect( parent.selecti); //change list state;
select=null;
selecti=-1;
}
else if(keyword.equals("RESPOND"))
{ StringTokenizer resp=new StringTokenizer(st.nextToken());
String usr=resp.nextToken();
boolean agree=Boolean.parseBoolean(resp.nextToken());
if(agree)
{ String info=usr+"同意与你进入 悄悄话模式";
String title="make sure";
JOptionPane.showMessageDialog(parent,info,title,JOptionPane.PLAIN_MESSAGE);
}
else
{ String info=usr+"拒绝与你进入 悄悄话模式";
String title="make sure";
JOptionPane.showMessageDialog(parent,info,title,JOptionPane.PLAIN_MESSAGE);
parent.list1.deselect( parent.selecti);
select=null;
selecti=-1;
}
}
else if(keyword.equals("SERQUIT")) //如果关键字是QUIT则是服务器关闭的信息
//用来切断此次连接
{ System.out.println("Quit");
try
{ parent.listen.stop();
parent.listen=null;
parent.soc.close();
parent.soc=null;
}
catch(IOException e)
{ System.out.println("Error:"+e);
}
parent.list1.clear();
return;
}
} //end of while
} //end of run method
} //end of Listen inner class
} //end of chatApplet class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -