📄 chatclient.java~112~
字号:
package chatClient;
/**
* <p>Title:聊天室客户端 </p>
*
* <p>Description:
* 自定义数据段协议:
* 1.client->server show nick:(the first message send to server)
* [usrNick]
* 2.client->server mesage :
* [usrNick]:message
* 3.server->client
* [msgType] + [message]
* 1 BYTE
* 1:usrListBroadcast + [usrNum] + ([usrNickLen] + [usrNick] + [IPLen] + [IP])* usrNum
* 2 BYTE 1 BYTE 2 BYTE
*
* 2:msgBroadcast + [usrNick]: + msg
*
* </p>
*
* <p>Copyright: Copyright (c) 2007</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import javax.swing.tree.*;
public class ChatClient extends WindowAdapter implements ActionListener,Runnable {
private JFrame f = null;
private JPanel p0 = null;
private JTextField nickField = null;
private JLabel nickLabel;
private JPanel p1 = null;
private JLabel ipAddrLabel;
private JTextField ipAddr = null;
private JButton button_connect = null;
private JPanel p2 = null;
private JTree tree = null;
private DefaultTreeModel treeModel=null;
private JPanel p3 = null;
private JLabel revMsgLabel;
private JTextArea revMsg = null;
private JButton button_clear = null;
private JLabel sendMsgLabel;
private JTextArea sendMsg = null;
private JButton button_send = null;
private BorderLayout borderLayout1 = new BorderLayout();
private BorderLayout borderLayout2 = new BorderLayout();
private BorderLayout borderLayout3 = new BorderLayout();
private DefaultMutableTreeNode root=null;
private Socket socket;
private DataInputStream in;
private DataOutputStream out;
private String usrNick;
public ChatClient() {
f = new JFrame("ChatClient");
Container contentPane = f.getContentPane();
f.setSize(400, 500);
contentPane.setLayout(borderLayout1);
p0 = new JPanel();
BorderLayout borderLayoutP0=new BorderLayout();
p0.setLayout(borderLayoutP0);
nickLabel = new JLabel(" User Nick:");
nickLabel.setPreferredSize(new Dimension(100,30));
p0.add(nickLabel,borderLayoutP0.WEST);
nickField=new JTextField(new FixedLengthDocument(9),"anonymous",9);
p0.add(nickField,borderLayoutP0.CENTER);
p1 = new JPanel();
BorderLayout borderLayoutP1=new BorderLayout();
p1.setLayout(borderLayoutP1);
ipAddrLabel = new JLabel(" ServerIP:");
ipAddrLabel.setPreferredSize(new Dimension(100,30));
ipAddr = new JTextField();
button_connect = new JButton("connect");
button_connect.setPreferredSize(new Dimension(100, 30));
button_connect.addActionListener(this);
p1.add(ipAddrLabel,borderLayoutP1.WEST);
p1.add(ipAddr,borderLayoutP1.CENTER);
p1.add(button_connect,borderLayoutP1.EAST);
JPanel p12=new JPanel();
p12.setLayout(new GridLayout(2,1));
p12.add(p0);
p12.add(p1);
f.add(p12, borderLayout1.NORTH);
p2 = new JPanel();
p2.setSize(100, 400);
root = new DefaultMutableTreeNode("User List");
tree = new JTree(root);
treeModel=(DefaultTreeModel)tree.getModel();
JScrollPane scrollPane=new JScrollPane();
scrollPane.setViewportView(tree);
scrollPane.setPreferredSize(new Dimension(120, 768));
p2.add(scrollPane);
f.add(p2, borderLayout1.WEST);
p3 = new JPanel();
revMsg = new JTextArea();
revMsg.setLineWrap(true);
JScrollPane revScrollPane = new JScrollPane(revMsg);
revMsg.setEditable(false);
button_clear = new JButton("clear");
button_clear.addActionListener(this);
sendMsg = new JTextArea();
sendMsg.setLineWrap(true);
sendMsg.setEditable(false);
JScrollPane sendScrollPane = new JScrollPane(sendMsg);
button_send = new JButton("send");
button_send.addActionListener(this);
button_send.setEnabled(false);
JPanel p_3_1 = new JPanel();
revMsgLabel = new JLabel("消息列表:");
p_3_1.setLayout(borderLayout2);
p_3_1.add(revMsgLabel, borderLayout2.NORTH);
p_3_1.add(button_clear, borderLayout2.SOUTH);
p_3_1.add(revScrollPane, borderLayout2.CENTER);
JPanel p_3_2 = new JPanel();
sendMsgLabel = new JLabel("写消息:");
p_3_2.setLayout(borderLayout3);
p_3_2.add(sendMsgLabel, borderLayout3.NORTH);
p_3_2.add(button_send, borderLayout3.SOUTH);
p_3_2.add(sendScrollPane, borderLayout3.CENTER);
p3.setLayout(new GridLayout(2, 1));
p3.add(p_3_1);
p3.add(p_3_2);
f.add(p3, borderLayout1.CENTER);
f.show();
f.addWindowListener(this);
}
public static void main(String[] args) {
ChatClient chatclient = new ChatClient();
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==button_connect)
{
if(button_connect.getText().equals("connect"))
{
try {
String ipstr = ipAddr.getText();
socket = new Socket(ipstr, 10000);
button_connect.setText("disconnect");
usrNick = nickField.getText();
nickField.setEditable(false);
sendMsg.setEditable(true);
button_send.setEnabled(true);
ipAddr.setEditable(false);
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
new Thread( this ).start();
// out.writeUTF(usrNick.length()+usrNick);//message type 1
}
catch (IOException ie)
{
revMsg.setText(revMsg.getText()+"\n"+ie.toString());
}
}//if(button_connect.getText().equals("connect"))
else
{
try{
out.flush();
out.close();
socket.close();
button_connect.setText("connect");
nickField.setEditable(true);
sendMsg.setEditable(false);
button_send.setEnabled(false);
ipAddr.setEditable(true);
}
catch(IOException ie)
{
revMsg.setText(revMsg.getText()+"\n"+ie.toString());
}
}
}//if(e.getSource()==button_connect)
else if(e.getSource()==button_send)
{
try
{
String sen = sendMsg.getText();
out.writeUTF("["+usrNick+"]:"+sen);//message type 2
}
catch(IOException ie)
{
revMsg.setText(revMsg.getText()+"\n"+ie.toString());
}
}//else if(e.getSource()==button_send)
else if(e.getSource()==button_clear)
{
revMsg.setText("");
}//else if(e.getSource()==button_clear)
}
public void run() {
try {
// Receive messages one-by-one, forever
while (true) {
String message = in.readUTF();
String type=message.substring(0,1);
if(type.equals("2"))//message
{
revMsg.setText(revMsg.getText() + "\n" + message.substring(1,message.length()));
}
else if(type.equals("1"))//usrListBroadcast
{
int i=0;
int index=3;
int userNum=Integer.parseInt(message.substring(1,3));
root.removeAllChildren();
treeModel.reload();//删除完后务运行DefaultTreeModel的reload()操作,整个Tree的节点才会真正被删除
for(i=0;i<userNum;i++)
{
String tmpStr=message.substring(index,index+1);
int nicklen=Integer.parseInt(tmpStr);
index++;
String nick=message.substring(index,index+nicklen);
index+=nicklen;
int iplen=Integer.parseInt(message.substring(index,index+2));
index+=2;
String ip=message.substring(index,index+iplen);
index+=iplen;
DefaultMutableTreeNode newNode=new DefaultMutableTreeNode(nick+"["+ip+"]");
treeModel.insertNodeInto(newNode,root,root.getChildCount());
tree.scrollPathToVisible(new TreePath(newNode.getPath()));
//tree的scrollPathToVisible()方法在使Tree会自动展开
}
}
}
} catch( IOException ie )
{
revMsg.setText(revMsg.getText()+"\n"+ie.toString());
}
}
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -