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

📄 socketserver.java

📁 Socket进阶(Socket通信的服务器端)
💻 JAVA
字号:
package socketserver;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2004</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */

public class SocketServer
    extends JFrame
    implements Runnable {
  JPanel contentPane;
  JScrollPane jScrollPane1 = new JScrollPane();
  JLabel jLabel1 = new JLabel();
  JTextField jTextField1 = new JTextField();
  JButton jButton1 = new JButton();
  JButton jButton2 = new JButton();
  JTextArea jTextArea1 = new JTextArea();

  Socket socket;
  ServerSocket serverSocket;
  BufferedReader bufferedReader; //客户端消息缓冲区
  PrintWriter printWriter; //服务器端消息缓冲区

  //Construct the frame
  public SocketServer() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  //Component initialization
  private void jbInit() throws Exception {
    contentPane = (JPanel)this.getContentPane();
    jScrollPane1.setBounds(new Rectangle(22, 20, 276, 134));
    contentPane.setLayout(null);
    this.setSize(new Dimension(321, 268));
    this.setTitle("服务器端");
    jLabel1.setText("发送消息");
    jLabel1.setBounds(new Rectangle(22, 165, 64, 24));
    jTextField1.setText("");
    jTextField1.setBounds(new Rectangle(95, 165, 203, 24));
    jTextField1.addKeyListener(new SocketServer_jTextField1_keyAdapter(this));
    jButton1.setBounds(new Rectangle(48, 206, 70, 25));
    jButton1.setEnabled(false);
    jButton1.setText("发送");
    jButton1.addActionListener(new SocketServer_jButton1_actionAdapter(this));
    jButton2.setBounds(new Rectangle(199, 206, 70, 25));
    jButton2.setText("退出");
    jButton2.addActionListener(new SocketServer_jButton2_actionAdapter(this));
    jTextArea1.setText("");
    contentPane.addKeyListener(new SocketServer_contentPane_keyAdapter(this));
    contentPane.add(jScrollPane1, null);
    jScrollPane1.getViewport().add(jTextArea1, null);
    contentPane.add(jLabel1, null);
    contentPane.add(jTextField1, null);
    contentPane.add(jButton1, null);
    contentPane.add(jButton2, 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);
    }
  }

  public void run() {
    /**@todo Implement this java.lang.Runnable method*/
    try {
      serverSocket = new ServerSocket(1000); //建立端口号为1000的服务器的端口
      socket = serverSocket.accept(); //接收客户端
      bufferedReader = new BufferedReader(new InputStreamReader(socket.
          getInputStream())); //建立缓冲区
      printWriter = new PrintWriter(socket.getOutputStream());
      if (socket != null) {
        jTextArea1.append("客户端已连接!\n");
        jButton1.setEnabled(true);
      }
      GetInfo getInfo = new GetInfo();
      Thread t = new Thread(getInfo); //创建接收客户端消息的线程
      t.start();
    }
    catch (Exception e) {
      jTextArea1.append(e.toString() + "\n");
    }
  }

  void jButton1_actionPerformed(ActionEvent e) {
    printWriter.println(jTextField1.getText()); //读入jTextField1中的文本
    printWriter.flush();
    jTextArea1.append("服务器端信息:" + jTextField1.getText()); //将jTextField1中的文本信息显示在jTextArea1中
    jTextField1.setText("");
  }

  void jButton2_actionPerformed(ActionEvent e) { //退出
    try {
      jTextArea1.append("服务器退出!\n");
      printWriter.println("exit!");
      printWriter.flush();
    }
    catch (Exception err) {
      jTextArea1.append(err.toString() + "\n");
    }
    finally {
      System.exit(0);
    }
  }

  private class GetInfo
      implements Runnable { //定义一个内部类,接收消息
    public void run() {
      String str;
      try {
        str = bufferedReader.readLine(); //从bufferedReader读入一行
        while (str != "exit!") {
          jTextArea1.append("客户端信息:" + str + "\n");
          str = bufferedReader.readLine(); //继续读入客户端信息
        }
        bufferedReader.close(); //关闭缓冲区
        printWriter.close();
        socket.close(); //关闭socket
        serverSocket.close(); //关闭serverSocket
      }
      catch (Exception e) {
        jTextArea1.append(e.toString() + "\n");
      }
    }
  }

  void contentPane_keyPressed(KeyEvent e) {
    if (e.getKeyChar() == KeyEvent.VK_ENTER) {
      printWriter.println(jTextField1.getText()); //读入jTextField1中的文本
      printWriter.flush();
      jTextArea1.append("服务器端信息:" + jTextField1.getText()); //将jTextField1中的文本信息显示在jTextArea1中
      jTextField1.setText("");
    }
  }

  void jTextField1_keyPressed(KeyEvent e) {
    if (e.getKeyChar() == KeyEvent.VK_ENTER) {
      try {
        jTextArea1.append("服务器退出!\n");
        printWriter.println("exit!");
        printWriter.flush();
      }
      catch (Exception err) {
        jTextArea1.append(err.toString() + "\n");
      }
      finally {
        System.exit(0);
      }
    }
  }

}

class SocketServer_jButton1_actionAdapter
    implements java.awt.event.ActionListener {
  SocketServer adaptee;

  SocketServer_jButton1_actionAdapter(SocketServer adaptee) {
    this.adaptee = adaptee;
  }

  public void actionPerformed(ActionEvent e) {
    adaptee.jButton1_actionPerformed(e);
  }
}

class SocketServer_jButton2_actionAdapter
    implements java.awt.event.ActionListener {
  SocketServer adaptee;

  SocketServer_jButton2_actionAdapter(SocketServer adaptee) {
    this.adaptee = adaptee;
  }

  public void actionPerformed(ActionEvent e) {
    adaptee.jButton2_actionPerformed(e);
  }
}

class SocketServer_contentPane_keyAdapter
    extends java.awt.event.KeyAdapter {
  SocketServer adaptee;

  SocketServer_contentPane_keyAdapter(SocketServer adaptee) {
    this.adaptee = adaptee;
  }

  public void keyPressed(KeyEvent e) {
    adaptee.contentPane_keyPressed(e);
  }
}

class SocketServer_jTextField1_keyAdapter
    extends java.awt.event.KeyAdapter {
  SocketServer adaptee;

  SocketServer_jTextField1_keyAdapter(SocketServer adaptee) {
    this.adaptee = adaptee;
  }

  public void keyPressed(KeyEvent e) {
    adaptee.jTextField1_keyPressed(e);
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -