⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatclient.java~112~

📁 java编写的聊天室客户端程序
💻 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 + -