📄 server.java
字号:
/*
* Server.java
*
*
*/
package com.project.chat.server;
import com.project.util.CharacterUtil;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
/**
*
* @author zl
*/
public class Server extends javax.swing.JFrame
{
private static final String CONNECT_THREAD = "CONNECT";
private static Thread thread;
private static Thread thread2;
private static Thread thread3;
private Map map = new HashMap(); //用户名与端口号的映射
/** Creates new form Server */
public Server()
{
initComponents();
this.jTextArea1.setEditable(false);
this.jTextArea1.setForeground(new java.awt.Color(245,0,0));
this.addWindowListener(new ServerClosed(this));
}
public Map getMap()
{
return map;
}
public void setMap(Map map)
{
this.map = map;
}
public void setUsersList()
{
this.jTextArea1.setText(""); //先清空之前的用户列表
for(Iterator i = map.keySet().iterator();i.hasNext();)
{
String username = (String)i.next();
this.jTextArea1.append(username + "\n");
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" 生成的代码 ">//GEN-BEGIN:initComponents
private void initComponents()
{
buttonGroup1 = new javax.swing.ButtonGroup();
jPanel2 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jSeparator2 = new javax.swing.JSeparator();
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
setTitle("\u670d\u52a1\u5668");
setResizable(false);
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "\u670d\u52a1\u5668\u4fe1\u606f", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 13), new java.awt.Color(0, 51, 204)));
jLabel1.setText("\u670d\u52a1\u5668\u72b6\u6001");
jLabel3.setForeground(new java.awt.Color(204, 0, 51));
jLabel3.setText("\u505c\u6b62");
jLabel4.setText("\u7aef\u53e3\u53f7");
jButton1.setText("\u542f\u52a8\u670d\u52a1\u5668");
jButton1.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
jButton1ActionPerformed(evt);
}
});
org.jdesktop.layout.GroupLayout jPanel2Layout = new org.jdesktop.layout.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel2Layout.createSequentialGroup()
.add(73, 73, 73)
.add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 85, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(48, 48, 48)
.add(jLabel3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 65, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(83, Short.MAX_VALUE))
.add(jSeparator2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 354, Short.MAX_VALUE)
.add(jPanel2Layout.createSequentialGroup()
.add(19, 19, 19)
.add(jLabel4)
.add(33, 33, 33)
.add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 99, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(40, 40, 40)
.add(jButton1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 104, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(23, Short.MAX_VALUE))
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel2Layout.createSequentialGroup()
.add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 24, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jLabel3))
.add(21, 21, 21)
.add(jSeparator2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(jLabel4)
.add(jTextField1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jButton1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 23, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addContainerGap(19, Short.MAX_VALUE))
);
jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "\u5728\u7ebf\u7528\u6237\u5217\u8868", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 13), new java.awt.Color(0, 51, 204)));
jTextArea1.setColumns(20);
jTextArea1.setForeground(new java.awt.Color(0, 51, 204));
jTextArea1.setRows(5);
jScrollPane1.setViewportView(jTextArea1);
org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup()
.addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 334, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup()
.addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 306, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1, 0, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(jPanel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(jPanel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(5, 5, 5)
.add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jButton1ActionPerformed
{//GEN-HEADEREND:event_jButton1ActionPerformed
String command = evt.getActionCommand();
if("启动服务器".equals(command))
{
String hostPort = this.jTextField1.getText();
if(CharacterUtil.isEmpty(hostPort))
{
JOptionPane.showMessageDialog(this,"端口号不能为空!","警告",JOptionPane.WARNING_MESSAGE);
this.jTextField1.requestFocus();
return;
}
if(!CharacterUtil.isNumber(hostPort))
{
JOptionPane.showMessageDialog(this,"端口号必须为数字!","警告",JOptionPane.WARNING_MESSAGE);
this.jTextField1.requestFocus();
return;
}
if(!CharacterUtil.isPortCorrect(hostPort))
{
JOptionPane.showMessageDialog(this,"端口号必须在 1024 与 65535 之间!","警告",JOptionPane.WARNING_MESSAGE);
this.jTextField1.requestFocus();
return;
}
int port = Integer.parseInt(hostPort);
thread = new ConnectThread(this,CONNECT_THREAD,port);
thread.start();
thread2 = new ExitThread(this);
thread2.start();
thread3 = new ServerUDP(this);
thread3.start();
this.jButton1.setText("停止服务器");
this.jLabel3.setText("运行中");
this.jTextField1.setEnabled(false);
this.jButton1.setEnabled(false);
}
}//GEN-LAST:event_jButton1ActionPerformed
/**
* @param args the command line arguments
*/
public static void main(String args[])
{
java.awt.EventQueue.invokeLater(new Runnable()
{
public void run()
{
new Server().setVisible(true);
}
});
}
// 变量声明 - 不进行修改//GEN-BEGIN:variables
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JSeparator jSeparator2;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTextField jTextField1;
// 变量声明结束//GEN-END:variables
}
class ServerClosed extends WindowAdapter
{
private Server server;
public ServerClosed(Server server)
{
this.server = server;
}
public void windowClosing(WindowEvent event)
{
try
{
Map map = server.getMap();
Set set = map.entrySet();
Iterator iterator = set.iterator();
while(iterator.hasNext()) //向每个客户端发送信息
{
Map.Entry me = (Map.Entry)iterator.next();
String username = (String)me.getKey();
String ports = (String)me.getValue();
int index = ports.indexOf("_");
int port = Integer.parseInt(ports.substring(0,index));
int lastIndex = ports.lastIndexOf("_");
String address = ports.substring(lastIndex + 1);
InetAddress clientAddress = InetAddress.getByName(address);
Socket socket = new Socket(clientAddress,port);
OutputStream outputStream = socket.getOutputStream();
String message = "SERVER_CLOSED";
outputStream.write((message).getBytes());
outputStream.close();
socket.close();
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
System.exit(0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -