java解决多线程服务器网络编程问题

简介: java解决多线程服务器网络编程问题

一、案例:实现多客户端连接服务器


1.1 客户端代码

public class Client {
  public static void main(String[] args) throws Exception {
    Socket client = new Socket("localhost",8888);
    // 用户输入
    Scanner keyScan = new Scanner(System.in);
    // 接收服务器的信息
    Scanner netScan = new Scanner(client.getInputStream());
    netScan.useDelimiter("\n");
    PrintStream netOut = new PrintStream(client.getOutputStream());
    boolean flag = true;
    while(flag) {
      System.out.println("请输入要发送的信息:");
      String str= null;
      if(keyScan.hasNext()) {
        str = keyScan.next().trim();
        // 发送到服务器
        netOut.println(str);
        // 服务器端有回应
        if(netScan.hasNext()) {
          System.out.println(netScan.next());
        }
      }
      if("byebye".equals(str)) {
        flag = false;
        break;
      }
    }
    keyScan.close();
    netScan.close();
    client.close();
  }
}


1.2 单线程服务器端代码【仅支持一个客户端】

public class SingleThreadServer {
  public static void main(String[] args) throws IOException {
    ServerSocket server = new ServerSocket(8888);
    // 等待连接
    Socket client = server.accept();
    // 接受客户端的输入
    Scanner scan = new Scanner(client.getInputStream());
    scan.useDelimiter("\n");
    // 对客户端的回应
    PrintStream out = new PrintStream(client.getOutputStream());
    boolean flag = true;
    while(flag) {
      // pandaUN客户达UN是否是有数据
      if(scan.hasNext()) {
        // 防止有空格出现
        String str = scan.next().trim();
        if("byebye".equals(str)) {
          out.println("byebye!!!");
          // 退出循环
          flag = false;
          break;
        }
        // 做出回应
        out.println("Server:"+str);
      }
    }
    out.close();
    scan.close();
    server.close();
  }
}

1.3 多线程服务器端代码【支持多客户端】

public class MultiThreadServer {
  public static class MyThread implements Runnable{
    private Socket client;
    public MyThread(Socket client) {
      this.client = client;
    }
    @Override
    public void run() {
      try {
      // 接受客户端的输入
      Scanner scan = new Scanner(client.getInputStream());
      scan.useDelimiter("\n");
      // 对客户端的回应
      PrintStream out = new PrintStream(client.getOutputStream());
      boolean flag = true;
      while(flag) {
        // pandaUN客户达UN是否是有数据
        if(scan.hasNext()) {
          // 防止有空格出现
          String str = scan.next().trim();
          if("byebye".equals(str)) {
            out.println("byebye!!!");
            // 退出循环
            flag = false;
            break;
          }
          // 做出回应
          out.println("Server:"+str);
        }
      }
      out.close();
      scan.close();
      }catch(Exception e) {
        e.printStackTrace();
      }
    }
  }
  public static void main(String[] args) throws IOException {
    ServerSocket server = new ServerSocket(8888);
    // 无限的接受客户端的请求
    boolean flag = true;
    while(flag) {
      // 等待连接
      Socket client = server.accept();
      // 开启线程  多线程服务器
      new Thread(new MyThread(client)).start();
    }
    server.close();
  }
}


目录
相关文章
|
5月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
276 1
|
5月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
295 1
|
6月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
259 0
|
6月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
449 16
|
7月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
7月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
641 1
|
Java 大数据
如何在Java中进行网络编程:Socket与NIO
如何在Java中进行网络编程:Socket与NIO
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
223 1