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

📄 chatserver.java

📁 基于C/S的JAVA语言开发的聊天程序
💻 JAVA
字号:
import java.io.*;
import java.net.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;

//服务器类
public class ChatServer extends JFrame
{
	private JTextArea displayArea = new JTextArea();
	private static ServerSocket serverSocket;
	private Hashtable ht;
	
	public static void main(String[] args) throws Exception 
	{
		ChatServer chatserver = new ChatServer();
        chatserver.setDefaultCloseOperation(
			JFrame.EXIT_ON_CLOSE);
		chatserver.runServer();
	}
	
	//初始化服务器的GUI
	public ChatServer() throws IOException
	{
		super("ChatServer" );
		
		Container container = getContentPane();
		displayArea.setEditable(false);

		container.add( new JScrollPane( displayArea ),
            BorderLayout.CENTER );
		setSize( 500, 400 );
		setVisible( true );
	}

	//运行服务器
	public void runServer()
	{		
		Socket clientSocket;
		try
		{
			//ht用来记录所有连接客户端的信息,包括客户端的Socket和输入流
			ht = new Hashtable();

			//创建一个ServerSocket对象
			serverSocket = new ServerSocket(5555,100);
			
			displayArea.setText("Chat Server started at: " + 
				serverSocket.getInetAddress().getLocalHost() + ":" + 
				serverSocket.getLocalPort() + "\n");
			displayArea.setCaretPosition(displayArea.getText().length());

			while(true)
			{
				//允许服务器接受连接
				clientSocket = serverSocket.accept();
				displayArea.append( "Connection from: " + clientSocket + "\n");
				displayArea.setCaretPosition(displayArea.getText().length());
				
				//创建一个输出流
				DataOutputStream outData = new 
					DataOutputStream(clientSocket.getOutputStream());

				//将输出流存储在key值为clientSocket的ht中
				ht.put(clientSocket, outData);
				
				//新建一个线程并启动
				Thread thread = new Thread(
					new ServerThread(clientSocket, ht, displayArea));
				thread.start();		
				
			}
		}
		catch(IOException ex)
		{
			ex.printStackTrace();
		}
	}
}

//自定义线程类,能读取客户端所传送来的信息并传送给所有在线用户
class ServerThread extends Thread implements Runnable
{
	private Socket clientSocket;
	private Hashtable ht;
	private JTextArea displayArea;
	
	public ServerThread(Socket clientSocket, Hashtable ht, JTextArea displayArea)
	{
		this.clientSocket = clientSocket;
		this.ht = ht;
		this.displayArea = displayArea;
	}
	
	public void run()
	{
		DataInputStream inData;
		
		try
		{
			//创建一个输入流
			inData = new DataInputStream(clientSocket.getInputStream());
			
			while(true)
			{
				//用readUTF()方法读取客户端所传送来的信息
				String message = inData.readUTF();

				//将信息显示在服务器端
				displayArea.append("Message from: " + message + "\n");
				displayArea.setCaretPosition(displayArea.getText().length());

				synchronized(ht)
				{
					//通过elements()方法取得Hashtable中所有的对象
					for(Enumeration e = ht.elements();e.hasMoreElements();)
					{
						//通过nextElement()方法取得客户端的输出流
						DataOutputStream outData = 
							(DataOutputStream)e.nextElement();
						try
						{
							//通过writeUTF()方法将一个客户端所传送来的信息
							//传送给所有在线用户
							outData.writeUTF(message);
						}
						catch(IOException ex)
						{
							ex.printStackTrace();
						}
					}	
				}
				
			} 
		}
		catch(IOException ex)
		{
		}
		finally
		{
			synchronized(ht)
			{
				displayArea.append("Remove from: " + clientSocket + "\n");
				displayArea.setCaretPosition(displayArea.getText().length());
				
				//通过remove()方法将客户端的信息从Hashtable中删除
				ht.remove(clientSocket);
				
				try
				{
					//通过close()方法关闭客户端Socket
					clientSocket.close();
				}
				catch(IOException ex)
				{
				}
			}
		}

	}
}

⌨️ 快捷键说明

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