📄 chatserver.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 + -