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

📄 clientmain.java

📁 用hibernata连接数据库的java聊天室 有服务器端可踢人
💻 JAVA
字号:
package cr;


import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Vector;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/*
*聊天室客户端的初始化类
*/
public class ClientMain extends JFrame implements ActionListener,Runnable{
  ListTable ltaOnline;                    //在线用户的列
  JTextArea jtaChats;                     //聊天记录的显示区
  JTextField jtfChat;                     //发言内容的输入框
  JTextField jtfObject;                   //发言针对对象
  JLabel jlaOnlineSum;                    //在线人数
  String strInetAddress;                  //存放服务器地址
  PrintWriter pwrTemp=null;               //与服务器相连接的输出流
  BufferedReader breTemp=null;
  Thread t;
    public ClientMain() {
        //初始化主界面
       super("Xiang的聊天室的客户端");
       this.setSize(620,500);
       Container conMain=this.getContentPane();
       this.setDefaultCloseOperation(3);

       jtaChats=new JTextArea();
       ltaOnline=new ListTable();

       JPanel jpaDown=new JPanel();

       JButton jbuSend=new JButton("发言");
       jbuSend.addActionListener(this);
       jlaOnlineSum=new JLabel("0");
       jtfChat=new JTextField(25);
       jtfObject=new JTextField("   所有人   ");
       jtfObject.setEditable(false);
       jpaDown.add(new JLabel("对:"));
       jpaDown.add(jtfObject);
       jpaDown.add(new JLabel("说:"));
       jpaDown.add(jtfChat);
       jpaDown.add(jbuSend);
       jpaDown.add(new JLabel("在线人数:"));
       jpaDown.add(jlaOnlineSum);


       conMain.add(new JScrollPane(jtaChats),BorderLayout.CENTER);
       conMain.add(ltaOnline,BorderLayout.EAST);
       conMain.add(jpaDown,BorderLayout.SOUTH);


       this.setVisible(true);
       this.validate();

       //以下是要求用户输入服务器IP的对话框
       JTextField jtfInetAddress=new JTextField();
       JOptionPane.showMessageDialog(this,jtfInetAddress,"请输入服务器端的IP地址",JOptionPane.INFORMATION_MESSAGE);
       strInetAddress=jtfInetAddress.getText().trim();
       //建立连接
       listenConnect();
   }
    //与服务器建立连接并进行通信
    void listenConnect(){
    	
    	Socket socConnect=null;                  //与服务器连接的套接字
        String strTemp="";                        //临时字符串变量
        InetAddress iadTemp=null;                //服务器地址对象
        ClientConnectListen ccl=new ClientConnectListen();
       // int intSum=1;

        try {
            iadTemp = InetAddress.getByName(strInetAddress);       //创建服务器地址对象
            try {
               socConnect = new Socket(iadTemp,4000);              //创建与服务器连接的套接字
               
               try {                                               //获取与服务器连接的输入输出流
                   breTemp = new BufferedReader(new InputStreamReader(socConnect.
                        getInputStream()));
                   pwrTemp=new PrintWriter(socConnect.getOutputStream(),true);
                   //获取在线聊友列表并起一个合法的昵称
                   if (this.getOnlineList()==false){              //在这个过程中出现异常给出提示
                        jtaChats.append("获取在线聊友列表或与服务器通信时失败!"+"\n");
                   }
                   

               } catch (IOException ex2) {
                   jtaChats.append("获取IO流失败!"+"\n");        //获取IO流出现异常给出提示
               }

            } catch (IOException ex) {
                jtaChats.append("建立Socket失败!"+"\n");         //建立Socket出现异常给出提示
            }

         } catch (UnknownHostException ex1) {
              jtaChats.append("你所输入的IP无效!"+"\n");          //所输入的IP无效则给出提示
         }
         ccl= new ClientConnectListen(socConnect,this);
         ccl.start();
//         while(true){
//        	 ExecutorService exec=Executors.newCachedThreadPool();
//             try {
//            	 
//    			String result=exec.submit(new Listenwords(breTemp)).get();
//    		    if (result.equals("ADD")){    //“ADD”消息的下一次消息发送的是要添加的聊友昵称
//                    ltaOnline.addElement(breTemp.readLine()); //加到在线聊友昵称列表
//                  //  ltaOnline.refurbish();                    //刷新显示
//                    jlaOnlineSum.setText(""+ltaOnline.getSum());   //更新在线人数
//                }
//                else {
//                    if (result.equals("DEL")){    //“DEL”消息的下一次消息发送的是要删除的聊友昵称
//                        ltaOnline.delElement(breTemp.readLine());  //在线聊友昵称列表中删除
//                      //  ltaOnline.refurbish();                     //刷新显示
//                        jlaOnlineSum.setText(""+ltaOnline.getSum());   //更新在线人数
//                    }
//                    else {
//                         jtaChats.append(result+ "\n");   //聊天信息追加到聊天记录区
//                    }
//                 }
//    		} catch (InterruptedException e) {
//    			jtaChats.append("接收服务器信息时出错,可能是服务器已关闭\n");
//    		} catch (ExecutionException e) {
//    			jtaChats.append("接收服务器信息时出错,可能是服务器已关闭\n");
//    		} catch (IOException e) {
//    			jtaChats.append("接收服务器信息时出错,可能是服务器已关闭\n");
//    		}
//         }
        
        }
//    public void runTask(){
//    	if(null==t){
//    		t=new Thread(this){
//				public void run(){
//					try {
//						String strTempq;
//			             while ((strTemp=breTemp.readLine())!=null) {
//			                 if (strTemp.equals("ADD")){    //“ADD”消息的下一次消息发送的是要添加的聊友昵称
//			                     ltaOnline.addElement(breTemp.readLine()); //加到在线聊友昵称列表
//			                   //  ltaOnline.refurbish();                    //刷新显示
//			                     jlaOnlineSum.setText(""+ltaOnline.getSum());   //更新在线人数
//			                 }
//			                 else {
//			                     if (strTemp.equals("DEL")){    //“DEL”消息的下一次消息发送的是要删除的聊友昵称
//			                         ltaOnline.delElement(breTemp.readLine());  //在线聊友昵称列表中删除
//			                       //  ltaOnline.refurbish();                     //刷新显示
//			                         jlaOnlineSum.setText(""+ltaOnline.getSum());   //更新在线人数
//			                     }
//			                     else {
//			                          jtaChats.append(strTemp+ "\n");   //聊天信息追加到聊天记录区
//			                     }
//			                  }
//			                 sleep(10);
//			               }
//			           }catch (IOException ex) {
//			                
//			            } catch (InterruptedException e) {
//			            	 jtaChats.append("接收服务器信息时出错,可能是服务器已关闭\n");
//					}
//				}
//			};
//    	}
//    }
    //获取在线聊友列表并起一个合法的昵称
    public boolean getOnlineList(){
       boolean booTemp=true;         //标记本方法是否正常执行的变量
       try{
          String strTemp="";          //字符串临时变量
          strTemp=breTemp.readLine();          //获取在线聊友人数
          int intTemp=Integer.parseInt(strTemp);      //转换为整型

          for (int i=0;i<intTemp;i++){         //循环获取在线聊友昵称
               strTemp=breTemp.readLine().trim();
               ltaOnline.addElement(strTemp);
          }
       //   ltaOnline.refurbish();             //刷新列表显示

          //提示用户输入一个昵称
          JTextField jtfName=new JTextField(25);
          JOptionPane.showMessageDialog(this,jtfName,
                       "请输入您的昵称,注意最好不要取已经在使用的",JOptionPane.INFORMATION_MESSAGE);
          String strName=jtfName.getText().trim();
          pwrTemp.println(strName);

          if (breTemp.readLine().equals("TRUE")){         //用户所取的昵称有重复
             strName=breTemp.readLine();                  //接收服务器强制更改后的昵称
             jtaChats.append("由于您的昵称已经有人在使用,所以被服务器强制改为:"+strName+"\n");  //提示用户
          }
       }catch(IOException ex){booTemp=false;}          //出现异常置标志为FALSE
       return booTemp;
    }

    //定义在线聊友列表的内嵌类
    class ListTable extends JPanel implements MouseListener{
       private BaTable jtaMain;     //用于显示聊友昵称的表
       private Vector vecHead,      //表头
                       vecData;      //数据体
       ListTable(){
           super();
           vecHead=new Vector();
           vecData=new Vector();
         //  Vector vecRow=new Vector();
           vecHead.add("");
           jtaMain=new BaTable(vecData,vecHead);    //创建一个初始列表
           jtaMain.addMouseListener(this);         //加鼠标监听
           this.add(jtaMain);
       }

       //在表中增加一个聊友昵称
       void addElement(String strElement){
            Vector vecRow=new Vector();
            vecRow.add(strElement);
            vecData.add(vecRow);
            jtaMain.revalidate();
       }
       //在表中删除一个聊友昵称
       void delElement(String strElement){
           Vector vecRow=new Vector();
           vecRow.add(strElement);
           vecData.removeElement(vecRow);
           jtaMain.revalidate();
       }
       //获取列表中的人数
       int getSum(){
           return vecData.size()-1;          //减去“所有人”项
       }
       //判断某个昵称是否有人在使用
       boolean isBeing(String strElement){
           Vector vecRow=new Vector();
           vecRow.add(strElement);
           return vecData.contains(vecRow);

       }
       //获取某个序号的聊友昵称
       String isName(int intTemp){
            Vector vecRow=(Vector)vecData.get(intTemp);
           return (String)vecRow.get(0);

       }
       //获取某个昵称的聊友的序号
       int getIndex(String strName){

           Vector vecRow=new Vector();
           vecRow.add(strName);
           return vecData.indexOf(vecRow);
       }

        public void mouseClicked(MouseEvent e) {
        }

        public void mousePressed(MouseEvent e) {
            //在聊友列表中点击某个聊友时,将其昵称填入到聊天对象框中
             jtfObject.setText((String)jtaMain.getValueAt(jtaMain.getSelectedRow(),0));
        }

        public void mouseReleased(MouseEvent e) {
        }

        public void mouseEntered(MouseEvent e) {
        }

        public void mouseExited(MouseEvent e) {
        }
    }

    //继承一个JTable,将表项的缺省模式改为不可编辑
    public class BaTable extends JTable{
        public BaTable(){super();}       //缺省构造方法

        public BaTable(Vector data, Vector head){    //向量构造方法
            super(data,head);
        }
        public boolean isCellEditable(int row,int column){
            return false;   }        //表项不可编辑
    }


    public static void main(String args[]){
        new ClientMain();
    }

    public void actionPerformed(ActionEvent e) {
        pwrTemp.println(jtfObject.getText().trim()+"\1"+jtfChat.getText());
        //将发言内容发送到服务器,聊天对象与发言内容之间用“\1”分割
    }
	public void run() {
		
	}

	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -