多线程(六)TCP文件上传和循环接收小练习

1.实现文件的上传

客户端:

 1 //客户端
 2 public class TCPClient {
 3     public static void main(String[] args) throws UnknownHostException, IOException {
 4         //创建客户端对象,明确要连接的服务器端ip和端口号
 5         Socket socket = new Socket("192.168.1.171",9000);
 6         //创建字节输入流,明确数据源
 7         FileInputStream fis = new FileInputStream("D:\io0429\a.png");
 8         //获取字节输出流,目的地是服务器
 9         OutputStream out = socket.getOutputStream();
10         //开始复制
11         byte[] bytes = new byte[1024];
12         int len = 0;
13         while((len = fis.read(bytes)) != -1){
14             out.write(bytes,0,len);
15         }
16         //告知服务器结束
17         socket.shutdownOutput();
18         //接受服务器端的回复
19         InputStream in = socket.getInputStream();
20         len = in.read(bytes);
21         System.out.println(new String(bytes,0,len));
22         //释放资源
23         socket.close();
24         fis.close();
25     }
26 }

服务器端:

 1 //服务器端
 2 public class TCPServer {
 3     public static void main(String[] args) throws IOException {
 4         //创建服务器端对象,明确端口号
 5         ServerSocket server = new ServerSocket(9000);
 6         //创建与客户端的链接,并获取与之连接的客户端对象
 7         Socket socket = server.accept();
 8         //明确目的地
 9         File file = new File("D:\upload");
10         //如果文件夹不存在
11         if(!file.exists()){
12             //则创建文件夹
13             file.mkdir();
14         }
15         String filename = "oralce"+System.currentTimeMillis()+new Random().nextInt(999999)+".png";
16         FileOutputStream fos = new FileOutputStream(file+File.separator+filename);
17         //明确数据源
18         InputStream in = socket.getInputStream();
19         byte[] bytes = new byte[1024];
20         //开始复制
21         int len = 0;
22         while((len = in.read(bytes)) != -1){
23             fos.write(bytes,0,len);
24         }
25         
26         //回复客户端
27         //获取目的地是客户端的字节输出流
28         OutputStream out = socket.getOutputStream();
29         out.write("上传成功".getBytes());
30         //释放资源
31         server.close();
32         fos.close();
33     }
34 }

2.循环接收文件

服务器端代码

 1 public class Upload implements Runnable {
 2     private Socket socket;
 3     public Upload(){}
 4     public Upload(Socket socket){
 5         this.socket = socket;
 6     }
 7     public void run() {
 8         try {
 9             //明确目的地
10             File file = new File("D:\upload");
11             //如果文件夹不存在
12             if(!file.exists()){
13                 //则创建文件夹
14                 file.mkdir();
15             }
16             String filename = "oralce"+System.currentTimeMillis()+new Random().nextInt(999999)+".png";
17             FileOutputStream fos = new FileOutputStream(file+File.separator+filename);
18             //明确数据源
19             InputStream in = socket.getInputStream();
20             byte[] bytes = new byte[1024];
21             //开始复制
22             int len = 0;
23             while((len = in.read(bytes)) != -1){
24                 fos.write(bytes,0,len);
25             }
26             
27             //回复客户端
28             //获取目的地是客户端的字节输出流
29             OutputStream out = socket.getOutputStream();
30             out.write("上传成功".getBytes());
31         } catch (IOException e) {
32             // TODO Auto-generated catch block
33             e.printStackTrace();
34         }
35     }
36 }

测试端

 1 public class demo01 {
 2     public static void main(String[] args) throws IOException {
 3         //创建服务器对象
 4         ServerSocket server = new ServerSocket(8000);
 5         while(true){
 6             //创建客户端链接,并获取与之连接 的客户端对象
 7             Socket socket = server.accept();
 8             //创建线程任务对象
 9             Upload u = new Upload(socket);
10             Thread t = new Thread(u);
11             t.start();
12         }
13     }
14     
15 }

客户端

 1 //客户端
 2 public class TCPClient {
 3     public static void main(String[] args) throws UnknownHostException, IOException {
 4         //创建客户端对象,明确要连接的服务器端ip和端口号
 5         Socket socket = new Socket("192.168.1.171",8000);
 6         //创建字节输入流,明确数据源
 7         FileInputStream fis = new FileInputStream("D:\io0429\a.png");
 8         //获取字节输出流,目的地是服务器
 9         OutputStream out = socket.getOutputStream();
10         //开始复制
11         byte[] bytes = new byte[1024];
12         int len = 0;
13         while((len = fis.read(bytes)) != -1){
14             out.write(bytes,0,len);
15         }
16         //告知服务器结束
17         socket.shutdownOutput();
18         //接受服务器端的回复
19         InputStream in = socket.getInputStream();
20         len = in.read(bytes);
21         System.out.println(new String(bytes,0,len));
22         //释放资源
23         socket.close();
24         fis.close();
25     }
26 }
原文地址:https://www.cnblogs.com/shenhx666/p/15083868.html