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

📄 chatserver.java

📁 socket聊天程序 简单实用实现多种功能
💻 JAVA
字号:
package ChatServer;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Container;
import java.net.*;
import java.io.*;
import java.util.*;


public class ChatServer extends JFrame implements ActionListener
{
	
	
	JTextArea txt;
	
	JButton button;
	
	JButton button1;
	
	ServerSocket svrSck;
	
	JLabel Luser;
	
	JLabel Lpsw;
	
	JTextField user;
	
	JTextField psw;
	
	JButton ok;
	
	JTextField threadNo;
	
	JButton kick;
	
	
	Vector m_threads=new Vector();
	
	ObjectInputStream is;
	
	ObjectOutputStream os;
	
	public ChatServer()
	{
		setResizable(false);
		
		setTitle("Java聊天室-服务器");
		
		getContentPane().setLayout(null);
		
		setBounds(100, 100, 400, 400);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		txt = new JTextArea();
		
		txt.setBounds(20,20,350,120);
		
		getContentPane().add(txt);
		
		
		
		
		
		button = new JButton("清屏");
		
		button.setBounds(20,330,77,25);
		
		getContentPane().add(button);
		
		button.addActionListener(this);
		
		
		button1 = new JButton("关闭");
		
		button1.setBounds(290,330,77,25);
		
		getContentPane().add(button1);
		
		button1.addActionListener(this);
		
		
		setVisible(true);
		
		txt.setText("等待连接。。。\n");
	}
	
	
	public void notifyRoom() 
	{ 
				//监视聊天窗口的连接变化,不
    			//断刷新clients数组并刷新客户端列表信息(通过sendclients函数完成)
    	StringBuffer people = new StringBuffer("PEOPLE");
    			//PEOPLE表示是客户列表信息
    	for (int i = 0; i < m_threads.size(); i++)
    	{
      
      		ServerThread c = (ServerThread) m_threads.elementAt(i);
      		
      		people.append(":" + c.getID());
      		
    }
    
    //sendClients(people);
    
    
  }
	
	public synchronized void disconnect(ServerThread c) 
	{
    			//删除 Vector m_threads 里面的由参数c指定的客户,而没有刷新客户端的名字列表
    			//刷新客户端名字列表工作由notifyroom来完成
   		try {
      			txt.append("系统消息:             "
      			
                        + c.getID() + "        断开连接\n");
      
     			 m_threads.removeElement(c);
     	 
      			txt.setText("目前已经有" + m_threads.size() + "用户连接");

      			//关掉流
      			c.m_in.close();
      			
      			c.m_out.close();
       				//断开socket连接
      			c.m_socket.close();

    }
    catch (IOException e) {
    	
      txt.append("系统消息:" + "Error " + e);
      
    }
    
  }

	
	public void actionPerformed(ActionEvent evt)
	{
		
		try{
			
			if(evt.getSource() == button)
			{
				
				txt.setText("");		
				
			}
			
			else if(evt.getSource() == button1)
			{
				
				System.exit(0);
				
			}
			
			else if((evt.getSource() == ok)&&user.getText().equals("admin")&&psw.getText().equals("admin"))
			{
				
				threadNo.setVisible(true);
				
				kick.setVisible(true);
			
			}
			else if(evt.getSource() == kick)
			{
				int i,j;
				
				j = Integer.parseInt(threadNo.getText());
				
				ServerThread st1=(ServerThread)m_threads.elementAt(j);
				
				disconnect(st1);
			
			}
			
		}
		
		catch(Exception e)
		{
			
			txt.append("\n writing wrong object!");
			
		}
		
	}
	
	

	
	public void runServer()
	{
		try
		{
			svrSck = new ServerSocket(5555,100);
			
			int nid=0;

            while(true)

            {

                //监听是否有新聊天者Chat Applet连接到聊天Server,

                //线程运行到该语句会封锁,直到有新的连接产生。

                Socket s=svrSck.accept();

                //System.out.println("accepted");
                txt.setText("accepted!");

                //创建一个新的ServerThread.

                ServerThread  st=new ServerThread(s,m_threads);

                //为该线程设置一个ID号。

                st.setID(nid++);

                //将该线程加入到m_threads Vector中。

                m_threads.addElement(st);

                //启动服务线程。

                new Thread(st). start();

                //通知所有ChatClient有一个新的网友加入。

                for(int i=0;i<m_threads.size();i++)

                {

                    ServerThread st1=(ServerThread)m_threads.elementAt(i);

                    st1.write("welcome***《 "+st.getID()+" 》***to enter chatroom!");

                }

                txt.setText("Listen again...");

            }
				
		}
		
		catch(Exception e)
		
		{
			
			System.out.println("Server is down...");
			
		}
	}
	
	public static void main(String[] args)
	{
		new ChatServer().runServer();
	}
}



class ServerThread implements Runnable
{

		Vector m_threads;

        Socket m_socket=null;

        DataInputStream m_in=null;

        DataOutputStream m_out=null;

        int m_nid;
        

        //初始化该线程。

        public ServerThread(Socket s,Vector threads)

        {

            m_socket=s;

            m_threads=threads;

            try

            {   //构造数据输入、输出流对象

                m_in=new DataInputStream(m_socket.getInputStream());

                m_out=new DataOutputStream(m_socket.getOutputStream());

            }

            catch(Exception e)

            {
				e.printStackTrace();
            }

        }

 public void run()  //线程的执行体。

        {

            System.out.println("thread is running");

            try

            {

                while(true)

                {

                    
                    String s = m_in.readUTF();
                    
                    
                  //text
					try
					{
						StringTokenizer st = new StringTokenizer(s, ":");
                    
                    	String keyword = st.nextToken();
                    	
                    	if(keyword.equals("send"))
                    	{
                    		for(int i=0;i<m_threads.size();i++)

                    		{

                        		ServerThread st1=(ServerThread)m_threads.elementAt(i);

                        		st1.write("***《"+getID()+"》 ***说:"+s);

                    		}
                    	}
                    	else
                    	{
                    		for(int i=0;i<m_threads.size();i++)

                    		{

                        		ServerThread st1=(ServerThread)m_threads.elementAt(i);
                        		
                        		String id = String.valueOf(st1.getID());
                        		
                        		if(id.equals(keyword))

                        			st1.write("***《"+getID()+"》 ***说:"+s);

                    		}
                    
                    	}
                    	
					}
					catch(NoSuchElementException e)
					{
					}
					
                 

                }

            }

            catch(Exception e)

            {  
            	
            	e.printStackTrace();

            }

            //从m_threads Vector中删除该线程,表示该线程已经离开聊天室。

            

        }

        //将msg送回对应的客户端

        public void write (String msg)

        {

            synchronized(m_out)

            {

                try

                {

                    m_out.writeUTF(msg);

                }

                catch(IOException e){}

            }

        }

        public int getID()  //获得该线程的ID.

        {

            return m_nid;

          }

        public void setID(int nid)  // //设置线程的ID.

        {

            m_nid=nid;

        }
        
        
}

⌨️ 快捷键说明

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