📄 chatserver.java
字号:
/**
* Socket 网络聊天室(服务器)
*
*@author 董利伟
*@version 1.0 2006/07/26
*/
package dongliwei.chat.server;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
/**
*在此处我们把窗体设置为一个实现 Runnable 接口的线程以使他的
*工作更具灵活性,在启动线程后又将启动一个名为 Service 的线程
*将为每一个接受到的 Socket 分配一个线程
*/
public class ChatServer extends JFrame implements Runnable
{
JPanel jp1;//窗体上的默认容器
JFrame jf;//窗体本身的引用
int frame_X;//窗体的 X 坐标
int frame_Y;//窗体的 Y 坐标
JLabel title;//窗体标题
JLabel txtIP;//显示IP
JLabel txtPart;//显示端口号
int part = 6000;//保存端口号(默认值6000)
String ip = "127.0.0.1";//保存服务器IP地址
JButton btStartup;//启动服务器
JButton btPause;//中止服务器
JButton btConfigure;//配置服务器
ServerSocket server;//服务器
boolean isRun;//用于判断服务器是否继续运行
int iscomm = 1;// 1 用来表示传播数据, -1 表示广播用户列表
Vector vectorUserName = new Vector();//用于存储用户的昵称列表
Vector vectorUser = new Vector();//用于存储每个用户的Socket
Thread th;
public ChatServer()
{
jp1 = (JPanel)this.getContentPane();
jf = this;
jp1.setLayout(null);
title = new JLabel("聊天室服务器");
title.setBounds(150,45,450,50);
title.setFont(new Font("宋体",Font.BOLD,40));
title.setForeground(Color.red);
jp1.add(title);
txtIP = new JLabel("服务器IP地址 " + ip);
txtIP.setBounds(100,115,300,25);
txtIP.setFont(new Font("宋体",Font.BOLD,15));
txtIP.setForeground(Color.red);
jp1.add(txtIP);
txtPart = new JLabel("端口号 " + String.valueOf(part));
txtPart.setBounds(370,115,150,25);
txtPart.setFont(new Font("宋体",Font.BOLD,15));
txtPart.setForeground(Color.red);
jp1.add(txtPart);
btStartup = new JButton("启动服务器");
btStartup.setBounds(100,170,100,25);
btStartup.addActionListener(new BtEvent());
jp1.add(btStartup);
btPause = new JButton("终止服务器");
btPause.addActionListener(new BtEvent());
btPause.setBounds(230,170,100,25);
jp1.add(btPause);
btConfigure = new JButton("配置服务器");
btConfigure.setBounds(360,170,100,25);
btConfigure.addActionListener(new BtEvent());
jp1.add(btConfigure);
this.setSize(550,350);
this.setTitle("聊天室服务器");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Toolkit tk = this.getToolkit();
Dimension dms = tk.getScreenSize();
this.frame_X = (int)(dms.getWidth()) / 2 - this.getWidth() / 2;
this.frame_Y = (int)(dms.getHeight()) / 2 - this.getHeight() / 2;
this.setLocation(this.frame_X,this.frame_Y);
this.setVisible(true);
th = new Thread(this);
}
public static void main(String args[])
{
new ChatServer();
}
public void run()
{
try
{
while(isRun)
{
System.out.println("服务器正在接收新用户........");
Socket client = server.accept();
System.out.println("服务器已接收新用户........\n\n");
Service ss = new Service(client);
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
class BtEvent implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == btStartup && btStartup.isEnabled())
{
try
{
System.out.println("端口号" + part);
server = new ServerSocket(part);
isRun = true;
btStartup.setEnabled(false);
th.start();
}
catch (Exception ex)
{
System.out.println(ex);
}
}
else if(e.getSource() == btPause && btStartup.isEnabled() == false)
{
try
{
server.close();
System.out.println("服务器已终止.....");
btStartup.setEnabled(true);
}
catch (Exception ex)
{
System.out.println(ex);
}
}
else if(e.getSource() == btConfigure)
{
new ConfigureDialog();
}
}
}
class Service extends Thread
{
String data;
Socket client;
public Service(Socket client)
{
this.client = client;
this.start();
}
public void run()
{
try
{
while(true)
{
iscomm = 1;
System.out.println(client + "正在接受数据...");
// communications(client);
InputStream in = client.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String str = "";
if(iscomm == 1)
{
while((str = br.readLine()) != null)
{
System.out.println("接受到的信息" + str);
if(str.startsWith("$newuser"))
{
iscomm = -1;
break;
}
else if(str.startsWith("$quituser"))
{
iscomm = 0;
break;
}
else
{
Enumeration enu = vectorUser.elements();
while(enu.hasMoreElements())
{
Socket s1 = (Socket)enu.nextElement();
PrintWriter ps = new PrintWriter(new OutputStreamWriter(s1.getOutputStream()));
ps.println(str);
ps.flush();
}
}
}
}
if(iscomm == 0)
{
String name = str.substring(9);
vectorUserName.remove(name);
vectorUser.remove(client);
Enumeration enu = vectorUser.elements();
while(enu.hasMoreElements())
{
Socket s1 = (Socket)enu.nextElement();
PrintWriter ps = new PrintWriter(new OutputStreamWriter(s1.getOutputStream()));
System.out.println("将要发送" + str);
ps.println(str);
ps.flush();
}
Enumeration enu2 = vectorUser.elements();
while(enu2.hasMoreElements())
{
Socket s2 = (Socket)enu2.nextElement();
PrintWriter ps = new PrintWriter(new OutputStreamWriter(s2.getOutputStream()));
Enumeration enu1 = vectorUserName.elements();
while(enu1.hasMoreElements())
{
String sss = (String)enu1.nextElement();
System.out.println(sss + "22222222222");
ps.println("$newuser" + sss);//广播用户列表
ps.flush();
}
}
iscomm = 1;
}
if(iscomm == -1)
{
String name = str.substring(8);
vectorUserName.addElement(name);
vectorUser.addElement(client);
Enumeration enu2 = vectorUser.elements();
while(enu2.hasMoreElements())
{
Socket s2 = (Socket)enu2.nextElement();
PrintWriter ps = new PrintWriter(new OutputStreamWriter(s2.getOutputStream()));
ps.println("$userjion" + name);// 通知加入新用户
ps.flush();
Enumeration enu1 = vectorUserName.elements();
while(enu1.hasMoreElements())
{
String sss = (String)enu1.nextElement();
System.out.println(sss + "22222222222");
ps.println("$newuser" + sss);//广播用户列表
ps.flush();
}
}
iscomm = 1;
}
}
}
catch (Exception ex)
{
System.out.println(ex);
}
iscomm = 1;
}
}
/**
*对话框用于设置服务器的端口号
*/
class ConfigureDialog
{
JDialog jdg;
JLabel locaIP;
JTextField txtLocaIP;
JLabel locaPart;
JTextField txtLocaPart;
JButton btOk;
JButton btClose;
public ConfigureDialog()
{
jdg = new JDialog(jf);
jdg.setLayout(null);
locaIP = new JLabel("本地 IP ");
locaIP.setBounds(100,30,100,25);
jdg.add(locaIP);
txtLocaIP = new JTextField(ip);
txtLocaIP.setBounds(200,30,100,25);
txtLocaIP.setColumns(20);
jdg.add(txtLocaIP);
locaPart = new JLabel("本地端口号");
locaPart.setBounds(100,70,100,25);
jdg.add(locaPart);
txtLocaPart = new JTextField(String.valueOf(part));
txtLocaPart.setBounds(200,70,100,25);
txtLocaPart.setColumns(20);
jdg.add(txtLocaPart);
btOk = new JButton("确定");
btOk.setBounds(100,110,100,25);
btOk.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String strip = txtLocaIP.getText().trim();
String strpart = txtLocaPart.getText().trim();
int int_part = 0;
try
{
int_part = Integer.parseInt(strpart);
}
catch (Exception ex)
{
System.out.println(ex);
}
if(strip.equals(""))
{
JOptionPane.showMessageDialog(null, "您的IP不能为空", "错误提示", JOptionPane.ERROR_MESSAGE);
txtLocaIP.setText(ip);
txtLocaPart.setText(String.valueOf(part));
}
else if(strpart.equals(""))
{
JOptionPane.showMessageDialog(null, "您的端口号不能为空", "错误提示", JOptionPane.ERROR_MESSAGE);
txtLocaIP.setText(ip);
txtLocaPart.setText(String.valueOf(part));
}
else if(int_part < 1024 || int_part > 65535)
{
JOptionPane.showMessageDialog(null, "端口号应该设置在 1024--65535 之间", "错误提示", JOptionPane.ERROR_MESSAGE);
txtLocaIP.setText(ip);
txtLocaPart.setText(String.valueOf(part));
}
else
{
ip = txtLocaIP.getText();
part = Integer.parseInt(txtLocaPart.getText().trim());
txtIP.setText("服务器IP地址 " + ip);
txtPart.setText("端口号 " + String.valueOf(part));
}
}
});
jdg.add(btOk);
btClose = new JButton("取消");
btClose.setBounds(230,110,100,25);
btClose.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jdg.dispose();
}
});
jdg.add(btClose);
jdg.setTitle("配置服务器");
jdg.setSize(450,220);
jdg.setLocation(frame_X,frame_Y);
jdg.setVisible(true);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -