swing编写client端及多线程server端之server端

简介: swing编写client端及多线程server端之server端

server端是实现日志功能,使用了多线程原理,可以同时接收多个客户端传过来的数据进行操作,这样同样使用到了beautyeye样式,大家可以去搜索下载。

具体的加载方式这里就不多讲了,如有不明白,可以参照本人的《swing编写client端及多线程server端之client端》,里面有介绍。

本程序界面截图:


布局的话我也不多说了,一个label显示端口,一个文本框输入端口,两个按钮控制运行、停止,一个JTextarea显示客户端传入的信息,一个JScrollPane实现滚动效果;

界面实现可以参照《swing编写client端及多线程server端之client端》里面的介绍。

需要注意的是,JTextArea加到JScrollPane是这样:scroll = new JScrollPane(context);或者scroll = new JScrollPane();scroll.setViewportView(context);都可以实现。

JScrollPane自动滚动效果实现

context.setCaretPosition(context.getDocument().getLength());//JScrollPane自动滚动效果,把光标设置到最后一行

网上还有其他几张方式,用起来不是很好用,有闪屏,这个比较简单推荐给大家


多线程实现代码,网上借鉴的,大家可以参考一下

public void service() {
  if (serverSocket == null) {
    try {
      if (!portText.getText().equals(""))
        port = Integer.parseInt(portText.getText());//从端口设置文本框得到值,如果没有使用默认值
      serverSocket = new ServerSocket(port);//如果端口被占用,会抛出异常
      context.append("服务器启动\n");//往JTextArea写数据
    } catch (IOException e) {
      portText.setEditable(true);
      context.append("服务器关闭,原因:端口已被其他程序占用,请更换!\n");//结尾加'\n'达到换行的效果
    }
  }
  //线程池  CPU个数*POOL_SIZE
  executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()* POOL_SIZE);
  Socket socket = null;
  while (flag) {//控制开始、停止,flag为全局变量,初始值为false,点击开始时赋值为true
    try {
      // 接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
      socket = serverSocket.accept();
      executorService.execute(new Handler(socket));
    } catch (Exception e) {
      exceptionHandler();//异常处理
    }
  }
}
class Handler implements Runnable {
  private Socket socket;
  public Handler(Socket socket) {
    this.socket = socket;
  }
  public void run() {
    try {
      context.append("New connection accepted " + socket.getRemoteSocketAddress()+"\n");
      // 输出流
      pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"), true);
      // 输入流
      br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
      String msg = null;
      while (flag) {//控制开始、停止,flag为全局变量,初始值为false,点击开始时赋值为true
        if ((msg=br.readLine())!=null) {
          pw.println("OK");//往客户端发生“OK”,客户端接到之后才会再次发送数据,否者网络阻塞
          context.append(socket.getRemoteSocketAddress()+":"+msg+"\n");
          context.setCaretPosition(context.getDocument().getLength());//JScrollPane自动滚动效果,把光标设置到最后一行
        }
      }
    } catch (IOException e) {
      context.append(socket.getRemoteSocketAddress()+"连接已断开!\n");
    }
  }
}




相关文章
|
11月前
|
安全 Java 开发者
Swing 的线程安全分析
【8月更文挑战第22天】
163 4
|
11月前
|
安全 Java API
|
11月前
|
设计模式 安全 前端开发
Swing 是线程安全的吗?
【8月更文挑战第21天】
106 0
|
数据处理
Swing通过后台线程实现页面更新
Swing通过后台线程实现页面更新
198 2
|
XML Linux 数据格式
swing编写client端及多线程server端之client端
swing编写client端及多线程server端之client端
|
Java 开发工具 计算机视觉
java swing 人脸签到系统 ----- 调用 opencv 多线程
java swing 人脸签到系统 ----- 调用 opencv 多线程
147 0
|
安全 API 调度
Swing 的任务线程与 EDT 事件分发队列模型(下)
Swing 的任务线程与 EDT 事件分发队列模型(下)
264 0
Swing 的任务线程与 EDT 事件分发队列模型(下)
|
2月前
|
机器学习/深度学习 消息中间件 存储
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
111 0
|
5月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
104 26
|
5月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
107 17