JavaSE练习-多线程、Socket(TCP协议)、IO流模拟实现服务端多线程接收客户端上传图片
来源:互联网 发布:碑文 软件 编辑:程序博客网 时间:2024/05/22 15:31
前言:对多线程、Socket(TCP协议)、字节流(高效字节流)回顾练习,实现一个模拟多个客户端向服务端发送数据服务端开多线程来接受客户端发送数据。
一、客户端实现
package cn.itcast.javaeevideoday01;import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;/** * * @author 大家都说名字长不会被发现 * 客户端 */public class TcpClient { public static void main(String[] args) { uploadFile(); } /* * 上传文件到服务端 * */ private static void uploadFile() { // TODO Auto-generated method stub Socket socket = null; OutputStream outputStream = null; BufferedInputStream inputStream = null; try { //创建客户端Socket对象 socket = new Socket(InetAddress.getByName("127.0.0.1"), 8880); //获取Sokect对象中的输出流 outputStream = socket.getOutputStream(); //定义字节输入流,读取文件 inputStream = new BufferedInputStream(new FileInputStream("D:\\电脑壁纸\\QQ图片20151026225122.jpg")); byte[] buf = new byte[1024*1024]; int len; //循环读取 while((len = inputStream.read(buf)) != -1) { //写入数据 outputStream.write(buf,0,len); } socket.shutdownOutput(); //获取服务端反馈信息 receiveServerUploadFeedBack(socket); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { outputStream.close(); inputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /* * 接收服务端回传消息 */ private static void receiveServerUploadFeedBack(Socket socket) { // TODO Auto-generated method stub InputStream inputStream = null; try { //获取Socket对象中的输入流 inputStream = socket.getInputStream(); byte[] buf = new byte[1024*1024]; //读取数据到缓存区 int len = inputStream.read(buf); System.out.println(new String(buf,0,len)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { inputStream.close(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
二、多线程实现
package cn.itcast.javaeevideoday01;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;/** * ·1 * @author 大家都说名字长不会被发现 * 线程 */public class FileReceiveThread implements Runnable{ //定义接收服务端Socket private Socket socket; //满参构造 public FileReceiveThread(Socket socket) { super(); this.socket = socket; } //空参构造 public FileReceiveThread() { super(); // TODO Auto-generated constructor stub } @Override public void run() { // TODO Auto-generated method stub //读写数据 readWriteFile(); } /* * 反馈是否上传成功消息消息 */ private void serverFeelBackMessage(StringBuilder stringBuilder) { // TODO Auto-generated method stub File file = new File(stringBuilder.toString()); OutputStream outputStream = null; try { //获取客户端输出流 outputStream = socket.getOutputStream(); //判断上传文件是否存在 if (file.exists()) { //返回成功消息 outputStream.write("图片上传成功".getBytes()); }else { //返回失败消息 outputStream.write("图片上传失败".getBytes()); } } catch (IOException e) { // TODO: handle exception }finally { try { outputStream.close(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /* * 读写客户端发送数据 */ private void readWriteFile() { // TODO Auto-generated method stub //获取客户端输入流 InputStream inputStream = null; //定义字节输出流 BufferedOutputStream outputStream = null; try { inputStream = socket.getInputStream(); //定义字符串拼接对象 StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("D:\\test\\").append(System.currentTimeMillis()).append(socket.getPort()).append(".jpg"); outputStream = new BufferedOutputStream(new FileOutputStream(stringBuilder.toString())); //定义缓存区 byte[] buf = new byte[1024*1024]; //循环读取数据 int len; while((len = inputStream.read(buf)) != -1) { //写入数据 outputStream.write(buf,0,len); } //给客服端发送反馈消息 serverFeelBackMessage(stringBuilder); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { //关闭资源 try { outputStream.close(); inputStream.close(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
三、服务端实现
package cn.itcast.javaeevideoday01;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/** * * @author 大家都说名字长不会被发现 * 服务端 */public class TcpServer { public static void main(String[] args) throws Exception { //创建服务端Socket,并指定端口号 ServerSocket serverSocket = new ServerSocket(8880); //死循环开启服务端 while(true) { //获取客户端Socket Socket socket = serverSocket.accept(); //开启线程 new Thread(new FileReceiveThread(socket)).start(); } }}
阅读全文
0 0
- JavaSE练习-多线程、Socket(TCP协议)、IO流模拟实现服务端多线程接收客户端上传图片
- TCP--通过多线程实现客户端并发上传图片
- 【java基础:net】基于多线程的TCP图片上传客户端与服务端Demonstration
- Java IO——Socket:通过多线程实现多客户端与一个服务端通信
- Java IO——Socket:通过多线程实现多客户端与一个服务端通信
- Java Socket多线程服务端、客户端
- Java Socket多线程服务端、客户端
- Socket TCP 协议实现服务端和客户端的简单通信
- c/s练习——多个客户端上传图片到服务端(tcp)
- 黑马程序员 Java练习-模拟TCP客户端并发上传图片
- socket编程(TCP多线程客户端服务器)
- 基于tcp协议模拟多客户端并发的图片上传
- TCP Socket简单模拟多线程
- Android-使用TCP/IP协议实现断点上传(客户端-服务端代码)(+0)
- TCP-客户端多线程并发登陆服务端
- socket ( java ) 简单多个客户端、服务端通信(多线程)
- socket ( java ) 简单多个客户端、服务端通信(多线程)
- java socket编程,多线程,客户端服务端
- 还纠结用哪个套餐呢?收好这几张图50元让你用9个G
- (转载)在后台运行Python脚本服务
- 【TensorFlow】官方MNIST数据集神经网络实例详解(六)
- 717. 1-bit and 2-bit Characters 1、2位字符
- 【CIO早班车】快来!不一样的知识管理体系只给不一般的企业用
- JavaSE练习-多线程、Socket(TCP协议)、IO流模拟实现服务端多线程接收客户端上传图片
- linux基本目录处理命令
- android linker 执行流程
- Vmware WorkStation Pro 12 安装记录
- 将SQL Server的任意记录转换为JSON格式(JQGRID) -- 支持SQL 2005
- tensorflow_add_layer
- 成为一名机器学习算法工程师,你需要这些必备技能
- matlab矩阵中的逗号和分号
- 编写代码模拟手机与SIM卡的组合关系