java多线程启动BIO和NIO服务端同时启动接受图片和字符数据
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服务端同时启动接受图片和字符数据相关推荐
- 二、Netty服务端/客户端启动整体流程
一.综述 Netty 的整体流程相对来说还是比较复杂的,初学者往往会被绕晕.所以这里总结了一下整体的流程,从而对 Netty 的整体服务流程有一个大致的了解.从功能上,流程可以分为服务启动.建立连接. ...
- java nio非阻塞式网络通信入门案例 (nio服务端与bio多线程客户端(java/python)
nio服务端: 改进服务端 java客户端 python版本客户端: python客户端改进版(多线程执行) 注意:如果想把服务端程序放在自己的服务器上,要记得开放相应的端口,否则客户端会显示连接超时 ...
- java开发的微信公众号服务端生产环境中的两个大坑
摘要: 我们开发的公众号,由于将功能开发完毕后,未对服务进行压力测试,因此用到的组件中的参数值全是默认的,服务上线后一段时间运行得倒没什么问题,随着服务得访问量增加,一些多线程并发的问题就逐步暴露出来 ...
- Java的中BIO、NIO、AIO-1
Java的中BIO.NIO.AIO-1 java 最近在项目中用到TCP通信来完成命令和运行结果的交互,用的是典型的TCP通信中的C/S架构,原因很简单:在业务需求低的环境下,这种架构简单.稳定还容 ...
- Java 微信支付之APP支付服务端 (一)
Java 微信支付之APP支付服务端 (一) 如图所示,这是服务端要集成的所有微信接口.至于在开放平台申请就不做赘述了.主要流程,1.下单,2.异步通知,3.查询. 一.微信统一下单请求交易 /*** ...
- 侠义道服务器修改,[侠义道1]1.85虚拟机镜像一键启动服务端+客户端+启动教程+元宝修改...
[侠义道1]1.85虚拟机镜像一键启动服务端+客户端+启动教程+元宝修改 资源说明: 1.本资源为侠义道Online1.85版本,默认IP为192.168.200.175,虚拟机架设,默认使用NAT模 ...
- java计算机毕业设计教育辅导班信息网服务端源码+mysql数据库+系统+lw文档+部署
java计算机毕业设计教育辅导班信息网服务端源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计教育辅导班信息网服务端源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目 ...
- 蓝牙上层协议,服务端的启动,获取以及蓝牙设备的连接
1,蓝牙协议/服务端的启动 上一篇文章中,分析了Bluetooth.apk启动过程,启动Bluetooth.apk时,一般启动了AdapterService这一对应的服务.查看package/app/ ...
- java计算机毕业设计教育辅导班信息网服务端MyBatis+系统+LW文档+源码+调试部署
java计算机毕业设计教育辅导班信息网服务端MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计教育辅导班信息网服务端MyBatis+系统+LW文档+源码+调试部署 本源码技术栈: ...
最新文章
- 多分类任务的混淆矩阵
- window.location.Reload()和window.location.href 区别
- 给Java初学者福利——Java语法基础
- [SQL Server]树形结构的创建
- 服务中心Eureka
- DBGridEh导出Excel等格式文件
- [Java]jvm参数选项中文文档
- linux入门和简单应用举例
- mysql count 条件_MySQL的COUNT语句,竟然都能被面试官虐的这么惨?
- mysql数据排序问题
- 重心(质量对位置的加权平均)与转动惯量(使物体甩动的难易程度与质量m和到轴的距离r的平方有关)
- 服务器 虚拟软驱,virtual floppy(虚拟软驱)命令行版本
- Python面向对象加强4.iter与next的用法,枚举器enumerate
- HTTP状态码:415
- java堆的特点_java栈的特点是什么?java的堆和栈的优缺点介绍
- 计算机英语听力,每日英语听力pc版
- 电子计算机断层扫描简称,计算机断层扫描技术(简称PET)
- [Klipper从入门到放弃]香橙派zero2设置2.4g无线热点
- 如果说这个世界不是真实存在的,只是一段代码,迄今为止你发现了哪些bug?
- STM32F4应用-GPIO
热门文章
- oracle材料差异科目,ORACLE分科目统计每科前三名的学生的语句
- 戴尔服务器装新硬盘模式,DELL服务器配置RAID及安装ESXI
- php旋转数组找出最小的,LeetCode 153 寻找旋转排序数组中的最小值
- matlab读取pdb文件,使用BioPython读取.pdb文件的整个目录
- 设置代理_如何防止用户更改Windows 10上的代理设置
- html点击子元素隐藏div,jq 点击div,显示当前div内容,隐藏其他div的子元素
- const 作用 c语言,在C语言中const 作用的的全面总结.doc
- 从4篇最新论文详解NLP新范式——Continuous Prompt
- CVPR 2020 Oral | 无域标签下高清场景时移变换
- 基于对偶学习的跨领域图片描述生成