📄 server.java
字号:
package day16.homework;
import java.io.*;
import java.net.*;
import java.nio.*;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Server extends JFrame implements ActionListener{
private JTextArea text;
private Map<Socket,PrintStream> map;//保存所有的socket和对应的写出流
private boolean pos;
public Server(){
super("F-Chat Server 服务器端窗口");
map = new HashMap<Socket,PrintStream>();
this.construct();
this.setSize(400,550);
this.setLocation(500,250);
this.setVisible(true);
}
public void construct(){
text = new JTextArea();
text.setEditable(false);
text.setBackground(new Color(200,200,225));
JScrollPane pane = new JScrollPane(text);
pane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
this.add(pane,BorderLayout.CENTER);
JMenuBar bar = new JMenuBar();
JMenu menu = new JMenu("Admin");
String[] s = {"Start","Append Time","Save Chating Record","About","Exit"};
menu = this.makeMenu(menu, s, this);
bar.add(menu);
this.setJMenuBar(bar);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
try {
exit();
} catch (Exception e1) {
e1.printStackTrace();
}
}
});
}
//制作菜单的方法
public JMenu makeMenu(JMenu parent,String[] items,ActionListener target){
if(parent==null || items.length==0)
return null;
JMenu menu = parent;
for(int i=0;i<items.length;i++){
JMenuItem item = new JMenuItem(items[i]);
menu.add(item);
if(target!=null)
item.addActionListener(target);
}
return menu;
}
//开启服务器的线程
class StartThread extends Thread{
public void run(){
try {
int ch = JOptionPane.showConfirmDialog(null,
"comfirm to start the Server ?",
"comfirm", JOptionPane.YES_NO_OPTION);
if(!(ch==JOptionPane.YES_OPTION))
return;
//开启服务器
text.setText("Server is starting,please wait...... \n");
for(int i=0;i<3;i++){
text.append(3-i + " seconds left... ... \n");
Thread.sleep(1000);
}
ServerSocket ss = new ServerSocket(2000);
text.append("Server started successfully!! \n");
pos = true;//表明服务器运行了
for(;;){
Socket s = ss.accept();
PrintStream ps = new PrintStream(s.getOutputStream());
text.append("initiating new Socket Server Thread! \n");
map.put(s,ps);//把这个socket和它的输出流放进map里
new ServerThread(s).start();//分配每个socket用户一个线程
text.append("new socket : \n"+s+"at : \n");
appendTime();
text.append("initiating successfully \n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
//服务聊天的线程
class ServerThread extends Thread{
private Socket so;
public ServerThread(Socket so){
this.so = so;
}
public void resetPosition(JTextArea text){//让垂直滚动条在最下面
int pos = text.getText().length();
text.setSelectionStart(pos);
text.setSelectionEnd(pos);
}
public void run(){
try {
BufferedReader br = new BufferedReader(new
InputStreamReader(so.getInputStream()));
PrintStream ps = new PrintStream(so.getOutputStream());
for(;;){
// Thread.sleep(1000);
String temp = br.readLine();
System.out.println(temp);
if(temp==null){
text.append("user"+so.toString()+" leaves at: \n");
appendTime();
br.close();
ps.close();
so.close();
break;
}
text.append(temp+"\n");
this.resetPosition(text);//让垂直滚动条在最下面
this.trans(temp.trim());//把信息传输
}
} catch (Exception e) {
e.printStackTrace();
} finally{//发生异常与否都要关闭socket,把so从set中除去
try {
map.get(so).close();//把这个socket的ps流关闭
so.close();
} catch (IOException e) {
e.printStackTrace();
}//客户端退出,关闭socket
map.remove(so);//把so从set中除去
}
}
public void trans(String t){
Set<Socket> set = map.keySet();
for(Socket s:set){
PrintStream ps = map.get(s);
ps.println(t);
}
}
}
public void save(){
appendTime();//给聊天记录添加时间
File file=null;
JFileChooser chooser = new JFileChooser();
chooser.showSaveDialog(this);
file = chooser.getSelectedFile();
if(file==null){
JOptionPane.showConfirmDialog(null, "NOT saved!!");
return;
}
try{
FileWriter writer = new FileWriter(file);
writer.write(text.getText());
writer.close();//关闭流
}catch(IOException e){
e.printStackTrace();
}
}
public void appendTime(){
Date date = new GregorianCalendar().getTime();
text.append(date+"\n");//给聊天记录添加时间
}
public void exit(){
if(text.getText().length()>5 && JOptionPane.showConfirmDialog(null, "是否保存聊天记录")==JOptionPane.YES_OPTION)
save();
System.exit(0);
}
public void actionPerformed(ActionEvent e) {
String temp = e.getActionCommand();
if("Start".equals(temp)){
if(pos){
JOptionPane.showConfirmDialog(null, "Server is RUNNING");
return;
}
new StartThread().start();
return;
}
if("About".equals(temp)){
new About();
return;
}
if("Save Chating Record".equals(temp)){
save();
return;
}
if("Append Time".equals(temp)){
appendTime();
return;
}
if("Exit".equals(temp)){
exit();
}
}
private class About extends JFrame{
public About(){
super("关于F-Chat");
this.setLayout(new GridLayout(2,1));
this.add(new JLabel("作者:zyh0532@126.com tarena sd_sd080126"));
this.add(new JLabel("3.29.2008 19:00 Verson: 1.2"));
this.setSize(400,200);
this.setLocation(250,150);
this.setVisible(true);
}
}
public static void main(String[] args) {
new Server();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -