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");
    }
  }
}




相关文章
|
4月前
|
安全 Java 开发者
Swing 的线程安全分析
【8月更文挑战第22天】
72 4
|
4月前
|
安全 Java API
|
4月前
|
设计模式 安全 前端开发
Swing 是线程安全的吗?
【8月更文挑战第21天】
51 0
|
7月前
|
数据处理
Swing通过后台线程实现页面更新
Swing通过后台线程实现页面更新
91 2
|
7月前
|
XML Linux 数据格式
swing编写client端及多线程server端之client端
swing编写client端及多线程server端之client端
|
Java 开发工具 计算机视觉
java swing 人脸签到系统 ----- 调用 opencv 多线程
java swing 人脸签到系统 ----- 调用 opencv 多线程
95 0
|
安全 API 调度
Swing 的任务线程与 EDT 事件分发队列模型(下)
Swing 的任务线程与 EDT 事件分发队列模型(下)
207 0
Swing 的任务线程与 EDT 事件分发队列模型(下)
|
1天前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
12 1
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
58 1
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
31 3