📄 server.java
字号:
import java.net.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/*服务器端主要实现了创建服务器界面,接受客户端数据并转发给其他客户端功能;
功能有将客户端数据记录并显示在服务器界面上,并保存到一个jilu.txt文件中;
还添加了读取服聊天记录jilu.txt文件并显示到另一窗体上的功能;
还有清空聊天记录功能,聊天记录文件jilu.txt也将清空;
退出服务器功能;
*/
public class Server
{
public static Client user[]=new Client[20]; //存放所有通信线程
public static int sum=0; //连接客户总数
public static String message;
public static void main(String args[])throws Exception
{
try
{
new Fuwuqi();//进入服务器界面
ServerSocket s = new ServerSocket(5432);//指定端口
while (true)
{
Socket s1=s.accept(); //等待客户连接,若成功则返回一个socket对象
DataOutputStream dos = new DataOutputStream(s1.getOutputStream());//取得socket输出流
DataInputStream din = new DataInputStream(s1.getInputStream());//取出socket输入流
user[sum]=new Client(sum,dos,din); //创建与客户对应的通信线程
new Thread(user[sum]).start();//启动发送数据到客户端线程
sum++;
}
} catch (IOException e) { }
}
}
//通信线程处理与对应客户的数据通信,将来自客户数据发往其他客户
class Client implements Runnable
{
int id; //客户标识
DataOutputStream dos; //去往客户的输出流
DataInputStream din; //来自客户的输入流
public Client(int id,DataOutputStream dos, DataInputStream din)
{
this.id=id;
this.dos=dos;
this.din=din;
}
public void run()
{ //循环读取客户数据转发给其他客户
while(true)
{
try
{
Server.message=din.readUTF(); //读客户数据,无数据时线程将挂起
Fuwuqi.xianshi.append(Server.message+"\n"); //将消息添加到服务器文本域显示
int m=Server.sum;
for (int i=0;i<m;i++) //转发给其他所有客户
{
Server.user[i].dos.writeUTF(Server.message);
}
}
catch(IOException e) {}
}
}
}
//服务器界面
class Fuwuqi extends JFrame implements ActionListener
{
public static TextArea xianshi; //消息文本框
public static JLabel lab;
public Fuwuqi()
{
super("记录客户端发送的消息");
MenuBar m = new MenuBar();
setMenuBar(m);
Menu m1 = new Menu("消息");
Menu m4 = new Menu("聊天记录");
m.add(m1);
m.add(m4);
MenuItem m5 = new MenuItem("显示记录");
MenuItem m6 = new MenuItem("保存记录");
MenuItem m2 = new MenuItem("清空消息");
MenuItem m3 = new MenuItem("退出");
m1.add(m2);
m4.add(m6);
m4.addSeparator();
m4.add(m5);
m1.addSeparator();
m1.add(m3);
m2.addActionListener(this);//注册控件监听事件
m3.addActionListener(this);
m5.addActionListener(this);
m6.addActionListener(this);
xianshi = new TextArea(15,40);
this.add(xianshi);
this.add("Center",xianshi);
setSize(400,400);
setVisible(true);
//窗体关闭事件
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if(JOptionPane.OK_OPTION == JOptionPane.showConfirmDialog(Fuwuqi.this,"真的要退出吗?",
"结束程序",JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE))
{
Window w=e.getWindow();
w.dispose();
System.exit(0);
}
}
});
}
public void actionPerformed(ActionEvent e)
{
String comp=e.getActionCommand();
if(comp.equals("清空消息"))
{
xianshi.replaceRange("",0,160);//清空文本域的内容
}
else if(comp.equals("退出"))
{
dispose(); //关闭窗体,并退出服务器程序
System.exit(0);
}
//文件操作主要用到了FileWriter和FileReader类
else if(comp.equals("保存记录"))
{
try
{
String s = Fuwuqi.xianshi.getText();//获取服务器数据
FileWriter out = new FileWriter("jilu.txt");//创建文件
out.write(s);//将数据写入文件
out.write("\n");
out.close();
}catch(IOException q){}
}
else if(comp.equals("显示记录"))
{
new Jilu();//进入聊天记录界面
}
}
}
//显示聊天记录界面
class Jilu extends JFrame
{
public Label l;
public TextArea t;
public Jilu()
{
super("显示聊天记录");
l = new Label("聊天记录");
t = new TextArea(10,30);
this.add("North",l);
this.add("Center",t);
setSize(300,300);
setVisible(true);
char [] buf = new char[1024];
try
{
FileReader in = new FileReader ("jilu.txt");//读取文件界面
int len = in.read(buf);
t.append(new String(buf,0,len)+"\n");//将文件内容显示到文本框
in.close();
}catch(IOException x){}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -