⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverframe.java

📁 在主函数中建立一个服务器套接字端口
💻 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 + -