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

📄 chatserver.java

📁 Java scoket 网络聊天室(加入QQ表情)
💻 JAVA
字号:
/**
 *    Socket 网络聊天室(服务器)
 *
 *@author 董利伟
 *@version 1.0 2006/07/26
 */

package dongliwei.chat.server;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.net.*;
import java.util.*;


/**
 *在此处我们把窗体设置为一个实现 Runnable 接口的线程以使他的
 *工作更具灵活性,在启动线程后又将启动一个名为 Service 的线程
 *将为每一个接受到的 Socket 分配一个线程
 */
public class ChatServer extends JFrame implements Runnable
{
	JPanel jp1;//窗体上的默认容器
	JFrame jf;//窗体本身的引用
	
	int frame_X;//窗体的 X 坐标
	int frame_Y;//窗体的 Y 坐标
	
	
	JLabel title;//窗体标题
	
	JLabel txtIP;//显示IP
	JLabel txtPart;//显示端口号
	
	int part = 6000;//保存端口号(默认值6000)
	String ip = "127.0.0.1";//保存服务器IP地址
	
	JButton btStartup;//启动服务器
	JButton btPause;//中止服务器
	JButton btConfigure;//配置服务器
	
	ServerSocket server;//服务器
	
	boolean isRun;//用于判断服务器是否继续运行
	
	int iscomm = 1;// 1 用来表示传播数据, -1 表示广播用户列表
	
	Vector vectorUserName = new Vector();//用于存储用户的昵称列表
	
	Vector vectorUser = new Vector();//用于存储每个用户的Socket
	
	Thread th;
	
	public ChatServer()
	{
		jp1 = (JPanel)this.getContentPane();
		jf = this;
		jp1.setLayout(null);
		
		title = new JLabel("聊天室服务器");
		title.setBounds(150,45,450,50);
		title.setFont(new Font("宋体",Font.BOLD,40));
		title.setForeground(Color.red);
		jp1.add(title);

		txtIP = new JLabel("服务器IP地址 " + ip);
		txtIP.setBounds(100,115,300,25);
		txtIP.setFont(new Font("宋体",Font.BOLD,15));
		txtIP.setForeground(Color.red);
		jp1.add(txtIP);
		
		txtPart = new JLabel("端口号 " + String.valueOf(part));
		txtPart.setBounds(370,115,150,25);
		txtPart.setFont(new Font("宋体",Font.BOLD,15));
		txtPart.setForeground(Color.red);
		jp1.add(txtPart);
		
		btStartup = new JButton("启动服务器");
		btStartup.setBounds(100,170,100,25);
		btStartup.addActionListener(new BtEvent());
		jp1.add(btStartup);
		
		btPause = new JButton("终止服务器");
		btPause.addActionListener(new BtEvent());
		btPause.setBounds(230,170,100,25);
		jp1.add(btPause);

		btConfigure = new JButton("配置服务器");
		btConfigure.setBounds(360,170,100,25);
		btConfigure.addActionListener(new BtEvent());
		jp1.add(btConfigure);
		
		this.setSize(550,350);
		this.setTitle("聊天室服务器");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Toolkit tk = this.getToolkit();
		Dimension dms = tk.getScreenSize();
		this.frame_X = (int)(dms.getWidth()) / 2 - this.getWidth() / 2;
		this.frame_Y = (int)(dms.getHeight()) / 2 - this.getHeight() / 2;
		this.setLocation(this.frame_X,this.frame_Y);
		this.setVisible(true);
		th =  new Thread(this);
	}
	
	public static void main(String args[])
    {
        new ChatServer();
    }
    
    public void run()
    {
    	try 
	    {
	    	while(isRun)
			{
			    System.out.println("服务器正在接收新用户........");
			    Socket client = server.accept();
			    System.out.println("服务器已接收新用户........\n\n");
			    Service ss = new Service(client);				     	   
			}
	    }
	    catch (Exception ex)
	    {
	    	ex.printStackTrace();
	    }
    }
    
    class BtEvent implements ActionListener
    {
    	public void actionPerformed(ActionEvent e)
    	{
    		if(e.getSource() == btStartup && btStartup.isEnabled())
    		{
    			try 
			    {	
			    	System.out.println("端口号" + part);
			   	    server = new ServerSocket(part);
 
					isRun = true;
					btStartup.setEnabled(false);
			    	th.start();				 
			    }
			    catch (Exception ex) 
			    {
			    	System.out.println(ex);
			    }

    		}
    		else if(e.getSource() == btPause && btStartup.isEnabled() == false)
    		{
    			try 
			    {
			        server.close();
			        System.out.println("服务器已终止.....");
			        btStartup.setEnabled(true);
			    }
			    catch (Exception ex) 
			    {
			    	System.out.println(ex);
			    }
    		}
    		else if(e.getSource() == btConfigure)
    		{
    			new ConfigureDialog();
    		}
    	}
    }
    

    class Service extends Thread
    {
    	 String data;
		 Socket client;
		 
		 public Service(Socket client)
		 {
		 	this.client = client;
		 	this.start();
		 }
		 
		 public void run()
		 {
		 	try 
			 {
			 	while(true)	 	
			 	{
			 		iscomm = 1;
			 		System.out.println(client + "正在接受数据...");
			 	//	communications(client);
				    InputStream in = client.getInputStream();
				    BufferedReader br = new BufferedReader(new InputStreamReader(in));
				    String str = "";
				    
				    if(iscomm == 1)
				    {
				    	while((str = br.readLine()) != null)
				    	{
						    System.out.println("接受到的信息" + str);
						    
						    if(str.startsWith("$newuser"))
						    {
						    	iscomm = -1;
						    	break;
						    }
						    else if(str.startsWith("$quituser"))
						    {
						    	iscomm = 0;
						    	break;
						    }
						    else
						    {
						    	Enumeration enu = vectorUser.elements();
						    	while(enu.hasMoreElements())
						    	{
						    		Socket s1 = (Socket)enu.nextElement();
						    		PrintWriter	ps = new PrintWriter(new OutputStreamWriter(s1.getOutputStream()));
						    		ps.println(str);
						    		ps.flush();	
						    	}
						    }				    		
				    	}					  
				    }
				    if(iscomm == 0)
				    {
				    	String name = str.substring(9);
				    	vectorUserName.remove(name);
				    	vectorUser.remove(client);
				    	
				    	Enumeration enu = vectorUser.elements();
						while(enu.hasMoreElements())
						{
						    Socket s1 = (Socket)enu.nextElement();
						    PrintWriter	ps = new PrintWriter(new OutputStreamWriter(s1.getOutputStream()));
						    System.out.println("将要发送" + str);
						    ps.println(str);
						    ps.flush();	
						}
				    	
				    	Enumeration enu2 = vectorUser.elements();
					    
					    while(enu2.hasMoreElements())
					    {
					    	Socket s2 = (Socket)enu2.nextElement();
					    	PrintWriter	ps = new PrintWriter(new OutputStreamWriter(s2.getOutputStream()));	
					    	Enumeration enu1 = vectorUserName.elements();
					    	while(enu1.hasMoreElements())
					    	{	
					    		String sss = (String)enu1.nextElement();	    						    		
						    	System.out.println(sss + "22222222222");						   
						    	ps.println("$newuser" + sss);//广播用户列表
						    	ps.flush();					    			
					    	}
					    }
						iscomm = 1;	
				    }
				    if(iscomm == -1)
				    {
				    	String name = str.substring(8);
					    vectorUserName.addElement(name);
					    vectorUser.addElement(client);
					    
					    
					    Enumeration enu2 = vectorUser.elements();
					    
					    while(enu2.hasMoreElements())
					    {
					    	Socket s2 = (Socket)enu2.nextElement();
					    	PrintWriter	ps = new PrintWriter(new OutputStreamWriter(s2.getOutputStream()));	
					    	ps.println("$userjion" + name);// 通知加入新用户
					    	ps.flush();
					    	Enumeration enu1 = vectorUserName.elements();
					    	while(enu1.hasMoreElements())
					    	{	
					    		String sss = (String)enu1.nextElement();	    						    		
						    	System.out.println(sss + "22222222222");						    	
						    	ps.println("$newuser" + sss);//广播用户列表
						    	ps.flush();					    			
					    	}
					    }
					    iscomm = 1;
				    }	
			 	}				     
			 }
			 catch (Exception ex) 
			 {
			 	System.out.println(ex);
			 }
		 	iscomm = 1;	
 	
		 }
    }
    
    /**
     *对话框用于设置服务器的端口号
     */
    class ConfigureDialog
    {
    	JDialog jdg;
    	
    	JLabel locaIP;
    	JTextField txtLocaIP;
    	
    	JLabel locaPart;
    	JTextField txtLocaPart;
    	
    	JButton btOk;
    	JButton btClose;
    	
    	public ConfigureDialog()
    	{
    		jdg = new JDialog(jf);
    		jdg.setLayout(null);
    		
    		locaIP = new JLabel("本地 IP ");
    		locaIP.setBounds(100,30,100,25);
    		jdg.add(locaIP);
    		
    		txtLocaIP = new JTextField(ip);
    		txtLocaIP.setBounds(200,30,100,25);
    		txtLocaIP.setColumns(20);
    		jdg.add(txtLocaIP);
    		
    		locaPart = new JLabel("本地端口号");
    		locaPart.setBounds(100,70,100,25);
    		jdg.add(locaPart);
    		
    		txtLocaPart = new JTextField(String.valueOf(part));
    		txtLocaPart.setBounds(200,70,100,25);
    		txtLocaPart.setColumns(20);
    		jdg.add(txtLocaPart);
    		
    		btOk = new JButton("确定");
    		btOk.setBounds(100,110,100,25);
    		btOk.addActionListener(
    			new ActionListener()
    			{
    				public void actionPerformed(ActionEvent e)
    				{
    					String strip = txtLocaIP.getText().trim();
    					String strpart = txtLocaPart.getText().trim();
    					int int_part = 0;
    					try 
					    {
					     	   int_part = Integer.parseInt(strpart);
					    }
					    catch (Exception ex) 
					    {
					    	System.out.println(ex);
					    }
    					if(strip.equals(""))
    					{
    						JOptionPane.showMessageDialog(null, "您的IP不能为空", "错误提示", JOptionPane.ERROR_MESSAGE);
    						txtLocaIP.setText(ip);
    						txtLocaPart.setText(String.valueOf(part));
    					}
    					else if(strpart.equals(""))
    					{
    						JOptionPane.showMessageDialog(null, "您的端口号不能为空", "错误提示", JOptionPane.ERROR_MESSAGE);
    						txtLocaIP.setText(ip);
    						txtLocaPart.setText(String.valueOf(part));
    					}
    					else if(int_part < 1024 || int_part > 65535)
    					{
    						JOptionPane.showMessageDialog(null, "端口号应该设置在 1024--65535 之间", "错误提示", JOptionPane.ERROR_MESSAGE);
    						txtLocaIP.setText(ip);
    						txtLocaPart.setText(String.valueOf(part));
    					}
    					else
    					{
    						ip = txtLocaIP.getText();
    						part = Integer.parseInt(txtLocaPart.getText().trim());
    						txtIP.setText("服务器IP地址 " + ip);
    						txtPart.setText("端口号 " + String.valueOf(part));
    					}
    				}
    			});
    		jdg.add(btOk);
    		
    		btClose = new JButton("取消");
    		btClose.setBounds(230,110,100,25);
    		btClose.addActionListener(
    			new ActionListener()
    			{
    				public void actionPerformed(ActionEvent e)
    				{
    					jdg.dispose();
    				}
    			});
    		
    		jdg.add(btClose);
    		jdg.setTitle("配置服务器");
    		jdg.setSize(450,220);
    		jdg.setLocation(frame_X,frame_Y);
    		jdg.setVisible(true);
    	}
    	
    }
}

⌨️ 快捷键说明

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