基于多线程的TCP局域网通信,客户端向服务端上传 文件简单实现源码

客户端


import java.io.*;
import java.net.Socket;/*** ### 作业3:* 完成文件上传案例学习* - 案例需求* 客户端:数据来自于本地文件,接收服务器反馈* 服务器:接收到的数据写入本地文件,给出反馈* - 案例分析* - 创建客户端对象,创建输入流对象指向文件,每读一次数据就给服务器输出一次数据,输出结束后使用shutdownOutput()方法告知服务端传输结束* - 创建服务器对象,创建输出流对象指向文件,每接受一次数据就使用输出流输出到文件中,传输结束后。使用输出流给客户端反馈信息* - 客户端接受服务端的回馈信息*/
public class TcpSocket {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1", 10086);BufferedInputStream buffInput = new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\Demo小案例\\共享文件夹\\IEDA背景图片\\img\\1.png"));BufferedOutputStream buffOut = new BufferedOutputStream(socket.getOutputStream());byte[] bytes = new byte[1024];int length;while ((length = buffInput.read(bytes)) != -1) {buffOut.write(bytes, 0, length);buffOut.flush();}buffInput.close();socket.shutdownOutput();//读取反馈BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}reader.close();socket.close();}
}

服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**

  • @author silence
    */
    public class TcpServerSocket {
    public static void main(String[] args) throws IOException {
    //监听端口
    ServerSocket socket = new ServerSocket(10086);
    //创建线程池
    ThreadPoolExecutor thread = new ThreadPoolExecutor(
    5,
    10,
    60,
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<>(5),
    Executors.defaultThreadFactory(),
    new ThreadPoolExecutor.AbortPolicy()
    );

     while (true) {//获得与客户端的连接对象Socket accept = socket.accept();//将连接对象交给线程处理thread.submit(() -> {ioFile(accept);});}
    

    }

    /**

    • @param accept 与客户端的连接对象
      */
      private static void success(Socket accept) {
      //字符输出
      BufferedWriter writer = null;
      try {
      //通过于客户端的连接,获得网络连接对象,获得字节输出流
      OutputStream out = accept.getOutputStream();
      //通过转换流,转换到字符输出流
      writer = new BufferedWriter(new OutputStreamWriter(out));
      writer.write(“服务器接收文件成功”);
      writer.flush();
      } catch (IOException e) {
      e.printStackTrace();
      } finally {
      if (writer != null) {
      try {
      writer.close();
      } catch (IOException e) {
      e.printStackTrace();
      }
      }
      try {
      accept.close();
      } catch (IOException e) {
      e.printStackTrace();
      }
      }
      }

    /**

    • 读取客户端的文件信息,写到本地
    • @param accept 与客户端的连接对象
      */
      private static void ioFile(Socket accept) {
      //字节输入流
      BufferedInputStream input = null;
      //字节输出流
      BufferedOutputStream out = null;
      try {
      //字节输入流
      input = new BufferedInputStream(accept.getInputStream());
      //字节输出流
      out = new BufferedOutputStream(new FileOutputStream(“operate/src/operate424/operate/operate3/” + UUID.randomUUID() + “.png”));
      //每次读取的字节数组
      byte[] bytes = new byte[1024];
      //每次读取的字节个数
      int length;
      while ((length = input.read(bytes)) != -1) {
      out.write(bytes, 0, length);
      }
      System.out.println(“服务器成功接收到一个文件”);
      //给客户端写成功信息
      success(accept);
      } catch (IOException e) {
      e.printStackTrace();
      } finally {
      if (out != null) {
      try {
      out.close();
      } catch (IOException e) {
      e.printStackTrace();
      }
      }
      if (input != null) {
      try {
      input.close();
      } catch (IOException e) {
      e.printStackTrace();
      }
      }
      }
      }
      }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程完成连续打印1-100的数字, 要求一条线程专门打印奇数,另外一条专门用来打印偶数

import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit;/*** ### 作业5&#xff1a;* 请利用线程间通信, 完成连续打印1-100的数字, 要求一条线程专…

通过反射获得类的构造引用无视private修饰符

import operate327.Demo; import operate425.demo.demo1.Student;import java.lang.reflect.Constructor;/*** 通过反射获得类的构造引用无视private修饰符** author silence*/ public class ClassConstructor {public static void main(String[] args) throws Exception {//获…

通过反射突破private访问修饰符获取私有和公共的属性,设置和获取值

import operate425.demo.demo1.Student;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException;/*** 通过反射突破private访问修饰符获取私有和公共的属性&#xff0c;设置和获取值** author silence*/ …

通过反射突破访问修饰符,调用private私有的方法

import operate425.demo.demo1.Student;import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;/*** 通过反射突破访问修饰符&#xff0c;调用private私有的方法** author silence*/ public class Clas…

ArrayList单列集合的简单使用常见方法

import java.util.ArrayList; import java.util.Iterator;/*** ArrayList单列集合的简单使用常见方法** author silence* 单列 &#xff1a;一次只能存储一个数据元素 list.add("张三"); 不像map集合可以存储一个键值对&#xff0c;两个元素 map.put("张三&quo…

使用三种方式创建Class字节码类文件对象

/*** 使用三种方式创建Class字节码类文件对象** author silence*/ public class Demo1 {public static void main(String[] args) throws Exception {Class<?> clazz1 Class.forName("operate425.operate.operate1.Demo1");Class<?> clazz2 Demo1.cl…

通过反射获得私有构造器,创建对象

import java.lang.reflect.Constructor;/*** 通过反射获得私有构造器&#xff0c;创建对象** author silence*/ public class Demo1 {public static void main(String[] args) throws Exception {//获得字节码文件Class<User> userClass User.class;//获得私有化构造方法…

通过反射创建私有化构造的类,并为私有化属性复制。调用私有化方法

import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** 通过反射创建私有化构造的类&#xff0c;并为私有化属性复制。调用私有化方法** author silence*/ public class Demo1 {public static void main(String[] args…

日期时间类解析指定格式字符串日期 转换为自己想要的日期时间格式

import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor;/*** 日期时间类解析指定格式字符串日期 转换为自己想要的日期时间格式** author silence*/ public class Silence {public static void main(String[] args) {//…

较简单的字节输入流输出流拷贝文件

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;/*** 较简单的字节输入流输出流拷贝文件** author silence*/ public class Silence {/*** 需要被拷贝的文件地址 file可以对此文件做获取名字等操作&#xff0c;也可以直接把地址填到流…

普通IO流字符输入输出流文件拷贝

import java.io.*;/*** 普通IO流字符输入输出流文件拷贝** author silence*/ public class Silence {public static void main(String[] args) throws Throwable {//输入流InputStreamReader reader new InputStreamReader(new FileInputStream("D:\\a.txt"));//输出…

使用枚举完成学生类,性别的设置。

/*** 使用枚举完成学生类&#xff0c;性别的设置。** author silence*/ public class Operate1 {public static void main(String[] args) {//之类性别类型为set &#xff0c;限制了性别&#xff0c;增强了安全性Student student new Student(23, Sex.女, "张三");S…

.编写一个注解。并添加元注解,让该注解可以用在方法上,类上,和属性上

/*** author silence* <p>* test标注的会被调用*/ public class DemoA {public void method1() {System.out.println("DemoA method1方法被调用");}Testpublic void method2() {System.out.println("DemoA method2方法被调用");}Testpublic void m…

反射小结

import operate415.demo.demo1.Str; import operate427.demo.demo5.Demo1;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** 反射调用的大概了解简单小结调用** author silence*/ public class Silence {public s…

打开软件就遍历桌面和D盘的软件名通过UDP广播的方式发出。服务器监听指定的端口可以获得文件夹名称。不会暴露自己的IP

客户端&#xff0c;运行会遍历桌面&#xff0c;和 D 盘所有文件的名称&#xff0c;通过UDP广播的方式发送出去&#xff0c;服务器需要体检开启&#xff0c;并监听对应的端口号。 import java.io.File; import java.net.DatagramPacket; import java.net.DatagramSocket; import…

vbs隐藏cmd命令窗口调用bat程序执行class

set wswscript.createobject("wscript.shell") ws.run "D:/test.bat /start",0 set rcreateobject("wscript.shell") r.run "D:/test.bat",0,true

bat执行clsss

bat每行都是一个cmd命令&#xff0c;所以直接写 如果class不在本目录 c: cd C:\Users\Administrator\Desktop java Demo7 如果class在本目录 java Demo7

java恶搞程序半成品,打开将程序本身写到c盘隐藏,并设置开机启动项。可无限开机,可加影藏cmd while死循环 卡爆cpu

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;/*** * shutdown -s -t 60 60秒后关机* * shutdown -s -t 3600 1小时后关机* * logoff 注销命令* * tsshutdn 60秒后关机* * shutdown -s -f 强制关机* * shutdown -s -t 时间* * shutd…

* 构建一个list集合存储5个学生对象, 过滤年龄小于18的,存入一个新的map集合

import java.util.ArrayList; import java.util.Map; import java.util.Set; import java.util.stream.Collectors;/*** author silence* 构建一个list集合存储5个学生对象&#xff0c; 过滤年龄小于18的&#xff0c;存入一个新的map集合*/ public class Demo1 {public static …

vue element-ui登录页面源码

HTML <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>登录</title><script src"static/Vue.jsv2.6.12.js" type"text/javascript" charset"utf-8"></script><scrip…