main函数:

@MapperScan("com.naughty.userlogin02.dao")
@SpringBootApplication
public class Userlogin02Application  {private final static int AVALIABLE_PROCESSORS = Runtime.getRuntime().availableProcessors();private final static ThreadPoolExecutor POOL_EXECUTOR = new ThreadPoolExecutor(AVALIABLE_PROCESSORS, AVALIABLE_PROCESSORS * 2,1, TimeUnit.MINUTES, new LinkedBlockingQueue<>(5),new ThreadPoolExecutor.CallerRunsPolicy());//extends SpringBootServletInitializerpublic static void main(String[] args) throws IOException, ExecutionException, InterruptedException {//      ServerSocket socket = new ServerSocket(8800);SpringApplication.run(Userlogin02Application.class, args);TCPserver tcPserver =SpringUtils.getBean(TCPserver.class);FutureTask<Integer> future = new FutureTask<Integer>(tcPserver);new Thread(future).start();Myselect myselect =SpringUtils.getBean(Myselect.class);FutureTask<Integer> future2 = new FutureTask<Integer>(myselect);new Thread(future2).start();//Thread thread = new Thread();// System.out.println("future get"+future.get());
// new Myselect().getSelector();
}}

BIO服务端:

@Component
public class TCPserver implements Callable {private AtomicInteger pic = new AtomicInteger(0);public TCPserver() throws IOException {}
//@Async@Overridepublic Object call() throws Exception {ServerSocket server = new ServerSocket(8003);while(true){//(2)开始在这里暂停等待接收客户端的连接,得到一个端到端的Socket管道Socket socket = server.accept();new ServerReadThread(socket).start();System.out.println(socket.getRemoteSocketAddress()+"上线了!");}// 使用accept()阻塞当前线程,等待客户端请求// Socket socket = server.accept();}class ServerReadThread extends Thread {private Socket socket;public ServerReadThread(Socket socket) {this.socket = socket;}@Overridepublic void run(){try ( // 创建一个ServerSocket监听8080端口的客户端请求// 由Socket获得输入流,并创建缓冲输入流BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
// 由文件输出流创建缓冲输出流//   System.getProperty("user.dir");FileOutputStream out = new FileOutputStream("C:\\Users\\14172\\Desktop\\myback\\resources\\static\\"+String.valueOf(pic)+".png")) {pic.addAndGet(1);
// 准备一个缓冲区byte[] buffer = new byte[1024];
// 首次从Socket读取数据int sum = 0;int len = in.read(buffer);while (len != -1) {// 写入数据到文件out.write(buffer, 0, len);
// 再次从Socket读取数据len = in.read(buffer);sum+=len;}System.out.println("sum"+sum);System.out.println("接收完成!");System.out.println(Thread.currentThread().getName());// return 1;} catch (IOException e) {e.printStackTrace();//  return 0;}finally {try {socket.close();System.out.println("closed");}catch (Exception e){e.printStackTrace();}}}}}

NIO服务端:

package com.naughty.userlogin02.bean;import com.alibaba.druid.sql.ast.statement.SQLIfStatement;
import com.naughty.userlogin02.service.WashService;
import com.naughty.userlogin02.service.WashServiceImpl;
import com.naughty.userlogin02.util.SpringUtils;
import com.naughty.userlogin02.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Callable;/*** @Author* @Description* @Date**/
@RestController("Myselect")
public class Myselect implements Callable {//@Autowiredprivate WashService washService;@GetMapping("/washbase")public List<Wash> getwash(){washService.allWash().stream().forEach(System.out::println);return washService.allWash();}//@GetMapping("/select")
//    @Bean
//    @Qualifier("select")public void getSelector() throws IOException {//创建 SelectorSelector selector = Selector.open();//用open方法创建ServerSocketChannel channel = ServerSocketChannel.open();//获取通道channel.configureBlocking(false);//切换为非阻塞模式channel.bind(new InetSocketAddress(8004));channel.register(selector, SelectionKey.OP_ACCEPT);//注册通道到选择器上,第二个参数为指定的事件为”监听接收事件“
//
//        * 读 : SelectionKey.OP_READ (1)
//* 写 : SelectionKey.OP_WRITE (4)
//* 连接 : SelectionKey.OP_CONNECT (8)
//* 接收 : SelectionKey.OP_ACCEPT (16)
//* 若注册时不止监听一个事件,则可以使用“位或”操作符连接。//轮询式的获取选择器上已经“准备就绪”的事件while (selector.select() > 0){//7. 获取当前选择器中所有注册的“选择键(已就绪的监听事件)”Iterator<SelectionKey> it = selector.selectedKeys().iterator();while (it.hasNext()){//8. 获取准备“就绪”的是事件SelectionKey sk = it.next();//9. 判断具体是什么事件准备就绪if (sk.isAcceptable()) {//10. 若“接收就绪”,获取客户端连接SocketChannel sChannel = channel.accept();//11. 切换非阻塞模式sChannel.configureBlocking(false);//12. 将该通道注册到选择器上sChannel.register(selector, SelectionKey.OP_READ);} else if (sk.isReadable()) {//13. 获取当前选择器上“读就绪”状态的通道SocketChannel sChannel = (SocketChannel) sk.channel();//14. 读取数据ByteBuffer buf = ByteBuffer.allocate(5000);int len = 0;FileOutputStream out = new FileOutputStream("C:\\Users\\14172\\Desktop\\myback\\resources\\static\\0.jpg");//  FileOutputStream in = new FileOutputStream("C:\\Users\\14172\\Desktop\\myback\\mydiary.txt");FileChannel fileChannel = out.getChannel();int length=0;if(sChannel.socket().getPort() == 8000){try{// 暂时没有成功,无法接受到图片//FileChannel的read方法 ,从通道读取数据并放到缓冲区中while ((len = sChannel.read(buf)) > 0) {//把channel的东西读到bufbuf.flip();//out.write(buf.array(),0,len);while (buf.hasRemaining())length += fileChannel.write(buf);//buf的数据写到filechannelbuf.clear();out.flush();System.out.println("长度" + length);}}finally {fileChannel.close();out.close();}byte[] buffer = new byte[1024];
// 首次从Socket读取数据//    System.out.println("文件读写完毕");}else  if(sChannel.socket().getPort() == 8002){try {while ((len = sChannel.read(buf)) > 0) {int alltime = 10;buf.flip();//  out.write(buf.array(),0,len);String readfrompython = new String(buf.array(), 0, len);//  fileChannel.write(buf);String[] arr = readfrompython.trim().split(",");System.out.println("数据"+readfrompython+"长度"+readfrompython.length());Arrays.stream(arr).forEach(System.out::print);int[] time = new int[arr.length];for (int i = 0; i < arr.length; i++) {if(!StringUtils.isEmpty(arr[i])) {time[i] = Integer.parseInt(arr[i]);alltime += time[i];}}System.out.println("total:" + alltime);//wash.setTime(new Date());Wash  wash2 = new Wash();wash2.setLastTime(alltime);//   WashService washService = SpringUtils.getBean("washservice");washService.allWash().stream().forEach(System.out::println);wash2.setTimes(washService.getWahNums()+1);wash2.setAllTime(washService.gettotal()+alltime);//总共清洗时间wash2.setWater(1.2);wash2.setId(100);wash2.setTime(new Date());if(washService.save(wash2)) System.out.println("插入数据成功!");else{System.out.println("插入失败");}System.out.println(new String(buf.array(), 0, len));buf.clear();}} finally {//    if(sChannel.read(buf)<0)fileChannel.close();out.flush();out.close();}}}//15. 取消选择键 SelectionKeyit.remove();}}}@Overridepublic Object call() {System.out.println(Thread.currentThread().getName());try {getSelector();}catch (IOException e){e.printStackTrace();}return 0;}
}

客户端1(接收图片数据)

import os
import sys
import struct# import win32uiimport sockethost = 'localhost'
port = 8003
bufsize = 1024
addr = (host, port)
mydaar = ('localhost',8012)
filepath = 'C:\\Users\\14172\\PycharmProjects\\pythonProject1\\0.png'def socket_client():try:optval = struct.pack("ii", 1, 0)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind(mydaar)# s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, optval)s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# level:选项定义的层次。支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。## optname:需设置的选项。## value:设置选项的值。s.connect((host, port))except socket.error as msg:print(msg)sys.exit(1)# print(s.recv(1024).decode("utf-8"))while 1:fp = open(filepath, 'rb')while 1:data = fp.read(1024)if not data:print('{0} file send over...'.format(filepath))breaks.send(data)# print(s.recv(1024).decode("utf-8"))breaks.close()# HTTP断开连接需要经过四次挥手,第四次挥手后为了保证发送的ACK被对方接受需要等待2MSL时间 MSL:报文的最长生存时间if __name__ == '__main__':socket_client()

客户端2(字符数据)


import os
import sys
import struct
# import win32uiimport sockethost = 'localhost'
port = 8004
bufsize = 1024
addr = (host, port)
mydaar = ('localhost',8002)
filepath = 'C:\\Users\\14172\\PycharmProjects\\pythonProject1\\time.txt'def socket_client():try:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind(mydaar)s.connect((host, port))except socket.error as msg:print(msg)sys.exit(1)# print(s.recv(1024).decode("utf-8"))while 1:fp = open(filepath, 'rb')while 1:data = fp.read(1024)if not data:print('{0} file send over...'.format(filepath))breaks.send(data)# print(s.recv(1024).decode("utf-8"))breakif __name__ == '__main__':socket_client()

java多线程启动BIO和NIO服务端同时启动接受图片和字符数据相关推荐

  1. 二、Netty服务端/客户端启动整体流程

    一.综述 Netty 的整体流程相对来说还是比较复杂的,初学者往往会被绕晕.所以这里总结了一下整体的流程,从而对 Netty 的整体服务流程有一个大致的了解.从功能上,流程可以分为服务启动.建立连接. ...

  2. java nio非阻塞式网络通信入门案例 (nio服务端与bio多线程客户端(java/python)

    nio服务端: 改进服务端 java客户端 python版本客户端: python客户端改进版(多线程执行) 注意:如果想把服务端程序放在自己的服务器上,要记得开放相应的端口,否则客户端会显示连接超时 ...

  3. java开发的微信公众号服务端生产环境中的两个大坑

    摘要: 我们开发的公众号,由于将功能开发完毕后,未对服务进行压力测试,因此用到的组件中的参数值全是默认的,服务上线后一段时间运行得倒没什么问题,随着服务得访问量增加,一些多线程并发的问题就逐步暴露出来 ...

  4. Java的中BIO、NIO、AIO-1

    Java的中BIO.NIO.AIO-1 java  最近在项目中用到TCP通信来完成命令和运行结果的交互,用的是典型的TCP通信中的C/S架构,原因很简单:在业务需求低的环境下,这种架构简单.稳定还容 ...

  5. Java 微信支付之APP支付服务端 (一)

    Java 微信支付之APP支付服务端 (一) 如图所示,这是服务端要集成的所有微信接口.至于在开放平台申请就不做赘述了.主要流程,1.下单,2.异步通知,3.查询. 一.微信统一下单请求交易 /*** ...

  6. 侠义道服务器修改,[侠义道1]1.85虚拟机镜像一键启动服务端+客户端+启动教程+元宝修改...

    [侠义道1]1.85虚拟机镜像一键启动服务端+客户端+启动教程+元宝修改 资源说明: 1.本资源为侠义道Online1.85版本,默认IP为192.168.200.175,虚拟机架设,默认使用NAT模 ...

  7. java计算机毕业设计教育辅导班信息网服务端源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计教育辅导班信息网服务端源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计教育辅导班信息网服务端源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目 ...

  8. 蓝牙上层协议,服务端的启动,获取以及蓝牙设备的连接

    1,蓝牙协议/服务端的启动 上一篇文章中,分析了Bluetooth.apk启动过程,启动Bluetooth.apk时,一般启动了AdapterService这一对应的服务.查看package/app/ ...

  9. java计算机毕业设计教育辅导班信息网服务端MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计教育辅导班信息网服务端MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计教育辅导班信息网服务端MyBatis+系统+LW文档+源码+调试部署 本源码技术栈: ...

最新文章

  1. 多分类任务的混淆矩阵
  2. window.location.Reload()和window.location.href 区别
  3. 给Java初学者福利——Java语法基础
  4. [SQL Server]树形结构的创建
  5. 服务中心Eureka
  6. DBGridEh导出Excel等格式文件
  7. [Java]jvm参数选项中文文档
  8. linux入门和简单应用举例
  9. mysql count 条件_MySQL的COUNT语句,竟然都能被面试官虐的这么惨?
  10. mysql数据排序问题
  11. 重心(质量对位置的加权平均)与转动惯量(使物体甩动的难易程度与质量m和到轴的距离r的平方有关)
  12. 服务器 虚拟软驱,virtual floppy(虚拟软驱)命令行版本
  13. Python面向对象加强4.iter与next的用法,枚举器enumerate
  14. HTTP状态码:415
  15. java堆的特点_java栈的特点是什么?java的堆和栈的优缺点介绍
  16. 计算机英语听力,每日英语听力pc版
  17. 电子计算机断层扫描简称,计算机断层扫描技术(简称PET)
  18. [Klipper从入门到放弃]香橙派zero2设置2.4g无线热点
  19. 如果说这个世界不是真实存在的,只是一段代码,迄今为止你发现了哪些bug?
  20. STM32F4应用-GPIO

热门文章

  1. oracle材料差异科目,ORACLE分科目统计每科前三名的学生的语句
  2. 戴尔服务器装新硬盘模式,DELL服务器配置RAID及安装ESXI
  3. php旋转数组找出最小的,LeetCode 153 寻找旋转排序数组中的最小值
  4. matlab读取pdb文件,使用BioPython读取.pdb文件的整个目录
  5. 设置代理_如何防止用户更改Windows 10上的代理设置
  6. html点击子元素隐藏div,jq 点击div,显示当前div内容,隐藏其他div的子元素
  7. const 作用 c语言,在C语言中const 作用的的全面总结.doc
  8. 从4篇最新论文详解NLP新范式——Continuous Prompt
  9. CVPR 2020 Oral | 无域标签下高清场景时移变换
  10. 基于对偶学习的跨领域图片描述生成