📄 serverframe.java
字号:
package chatserver;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.borland.jbcl.layout.*;
import java.net.*;
import java.io.*;
import java.util.*;
public class ServerFrame extends JFrame {
JPanel contentPane;
BorderLayout borderLayout1 = new BorderLayout();
JPanel jPanel1 = new JPanel();
XYLayout xYLayout1 = new XYLayout();
JLabel jLabel2 = new JLabel();
JButton jButton1 = new JButton();
JLabel jLabel1 = new JLabel();
JLabel jLabel3 = new JLabel();
JTextField jTextField1 = new JTextField();
JScrollPane jScrollPane1 = new JScrollPane();
JTextArea jTextArea1 = new JTextArea();
JScrollPane jScrollPane2 = new JScrollPane();
JTextArea jTextArea2 = new JTextArea();
ServerSocket serverSocket=null;
Socket client=null;
BufferedReader in=null;
PrintStream out=null;
static Vector clients=new Vector();
//Construct the frame
public ServerFrame() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
//Component initialization
private void jbInit() throws Exception {
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(400,400);
this.setTitle("聊天室——服务器端");
jPanel1.setBackground(SystemColor.inactiveCaptionText);
jPanel1.setLayout(xYLayout1);
jLabel2.setFont(new java.awt.Font("Dialog", 0, 12));
jLabel2.setText("连接信息");
jButton1.setBackground(SystemColor.inactiveCaption);
jButton1.setFont(new java.awt.Font("Dialog", 0, 12));
jButton1.setText("开始监听");
jButton1.addActionListener(new ServerFrame_jButton1_actionAdapter(this));
jLabel1.setFont(new java.awt.Font("Dialog", 0, 12));
jLabel1.setText("监听端口:");
jLabel3.setFont(new java.awt.Font("Dialog", 0, 12));
jLabel3.setText("系统信息");
jTextField1.setFont(new java.awt.Font("Dialog", 0, 12));
jTextField1.setText("6544");
jTextArea1.setFont(new java.awt.Font("Dialog", 0, 12));
jTextArea1.setBorder(BorderFactory.createEtchedBorder());
jTextArea1.setText("");
jTextArea2.setFont(new java.awt.Font("Dialog", 0, 12));
jTextArea2.setBorder(BorderFactory.createEtchedBorder());
jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
contentPane.add(jPanel1, BorderLayout.CENTER);
jPanel1.add(jLabel1, new XYConstraints(41, 10, 81, 26));
jPanel1.add(jLabel2, new XYConstraints(41, 47, 92, 23));
jPanel1.add(jLabel3, new XYConstraints(41, 180, 54, -1));
jPanel1.add(jTextField1, new XYConstraints(126, 8, 117, 28));
jPanel1.add(jButton1, new XYConstraints(276, 9, 82, 29));
jPanel1.add(jScrollPane1, new XYConstraints(44, 72, 320, 106));
jPanel1.add(jScrollPane2, new XYConstraints(44, 205, 320, 135));
jScrollPane2.getViewport().add(jTextArea2, null);
jScrollPane1.getViewport().add(jTextArea1, null);
}
//Overridden so we can exit when window is closed
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
void jButton1_actionPerformed(ActionEvent e) {
int port=Integer.parseInt(jTextField1.getText());
jTextArea2.append("服务器开始启动。。。。\n");
try{
serverSocket = new ServerSocket(port);
}catch(Exception ex){
jTextArea2.append("服务器启动失败!\n");
}
ConnectSocket connect=new ConnectSocket();
connect.start();
}
public boolean checkName(Client newClient){
for(int i=0;i<clients.size();i++){
Client c = (Client) clients.elementAt(i);
if ( (c != newClient) && (c.name).equals(newClient.name))
return false;
}
return true;
}
public void disconnect(Client c){
try{
jTextArea1.append(c.name+"断开连接\n");
c.send("QUIT");
clients.removeElement(c);
c.socket.close();
}
catch(IOException ex){
jTextArea2.append("客户断开错误\n");
}
}
public void sendClients(String msg){
for(int i=0;i<clients.size();i++){
Client c=(Client)clients.elementAt(i);
c.send(msg);
}
}
public void sendToClient(String msg,String name){
for(int i=0;i<clients.size();i++){
Client c=(Client)clients.elementAt(i);
if(c.name.equals(name)){
c.send(msg);
}
}
}
public void notifyRoom(){
String people="PEOPLE";
for(int i=0;i<clients.size();i++){
Client c=(Client)clients.elementAt(i);
people+=":"+c.name;
}
sendClients(people);
}
//使用线程来实现信息的读取,解决程序死锁的问题
class Client extends Thread{
String name;
BufferedReader in;
PrintStream out;
Socket socket;
public Client(Socket client){
this.socket=client;
try{
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
out=new PrintStream(socket.getOutputStream());
String info=in.readLine();
StringTokenizer stinfo=new StringTokenizer(info,":");
String head=stinfo.nextToken();
name=stinfo.nextToken();
jTextArea1.append("系统消息:"+name+"已经连接\n");
}catch(IOException ex){
System.out.println("创建网络输入输出流错误!");
}
}
public void send(String msg){
out.println(msg);
out.flush();
}
public void run(){
String str="";
while(true){
try{
str=in.readLine();
}catch(IOException ex){
jTextArea2.append("输入输出异常\n");
disconnect(this);
notifyRoom();
return;
}
StringTokenizer st=new StringTokenizer(str,":");
String keyword=st.nextToken();
if(keyword.equals("QUIT")){
try{
send("QUIT");
notifyRoom();
this.stop();
jTextArea1.append("连接关闭");
}catch(Exception ex){
jTextArea2.append("套接字关闭异常\n");
}
break;
}
else if(keyword.equals("MSG")){
String command=st.nextToken();
if(command.equalsIgnoreCase("BOARD")){//实现信息的群发
String message="";
message="Msg:"+name+":"+st.nextToken();
sendClients(message);
}
else{//将信息发给某个客户
String message = "MSG:"+ name+":"+ st.nextToken();
sendToClient(message,command);
}
}
}
}
}
//使用线程来实现多客户聊天,解决只能处理单客户问题
class ConnectSocket extends Thread{
Socket socket;
public void run(){
while(true){
try {
socket = serverSocket.accept();
}
catch (IOException ex) {
jTextArea2.append("创建套接字连接错误\n");
}
if(socket!=null){
try{
Client client=new Client(socket);
clients.addElement(client);
if(checkName(client)){
client.start();
notifyRoom();
}
else{
disconnect(client);
}
}catch(Exception ex){
jTextArea2.append("信息读取错误!\n");
}
}
}
}
}
}
class ServerFrame_jButton1_actionAdapter implements java.awt.event.ActionListener {
ServerFrame adaptee;
ServerFrame_jButton1_actionAdapter(ServerFrame adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.jButton1_actionPerformed(e);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -