TCP聊天文件上传

如果上传的文件不知道什么格式,我们需要用字节流来实现,既可以上传文本又可以上传其他格式文件。

上传客户端:

[java]   view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.xiaozhi.jingtian.tcp;    
  2.   
  3. import java.io.FileInputStream;    
  4. import java.io.IOException;    
  5. import java.io.OutputStream;    
  6. import java.net.Socket;    
  7.   
  8. public class UploadClient {    
  9.   
  10.     public static void main(String[] args) throws Exception, IOException {    
  11.         //创建客户端的Socket服务,指定目的主机和端口号    
  12.         Socket socket=new Socket("121.251.158.251",10000);    
  13.             
  14.         FileInputStream fileInputStream=new FileInputStream("c://1.bmp");    
  15.         OutputStream outputStream=socket.getOutputStream();    
  16.             
  17.         byte[]buffer=new byte[1024];    
  18.         int lang = 0;    
  19.         while((lang=fileInputStream.read(buffer))!=-1){    
  20.             outputStream.write(buffer, 0, lang);    
  21.         }    
  22.           
  23.         fileInputStream.close();    
  24.         outputStream.close();    
  25.         socket.close();    
  26.     }    
  27. }    

上传服务器(单线程:只能一个客户端实现上传):
[java]   view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.xiaozhi.jingtian.tcp;  
  2.   
  3. import java.io.FileOutputStream;  
  4. import java.io.InputStream;  
  5. import java.net.ServerSocket;  
  6. import java.net.Socket;  
  7.   
  8. public class UploadServer {  
  9.   
  10.     public static void main(String[] args) throws Exception {  
  11.         //创建服务端的Socket服务,指定端口号  
  12.         ServerSocket serverSocket=new ServerSocket(10000);  
  13.           
  14.         while(true){  
  15.             //通过accept方法获取连接过来的Socket对象  
  16.             Socket socket=serverSocket.accept();  
  17.               
  18.             FileOutputStream fileOutputStream=new FileOutputStream("c://2.bmp");  
  19.             InputStream inputStream=socket.getInputStream();  
  20.               
  21.             byte[]buffer=new byte[1024];  
  22.             int lang = 0;  
  23.             while((lang=inputStream.read(buffer))!=-1){  
  24.                 fileOutputStream.write(buffer, 0, lang);  
  25.             }  
  26.               
  27.             fileOutputStream.close();  
  28.             inputStream.close();  
  29.             socket.close();  
  30.         }  
  31.           
  32.     }  
  33. }  

代码修改

使用多线程修改服务器端代码实现并发上传:

[java]   view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.xiaozhi.jingtian.tcp;  
  2.   
  3. import java.io.FileNotFoundException;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.net.ServerSocket;  
  8. import java.net.Socket;  
  9.   
  10. import javax.xml.crypto.Data;  
  11.   
  12. public class UploadServer {  
  13.   
  14.     public static void main(String[] args) throws Exception {  
  15.         //创建服务端的Socket服务,指定端口号  
  16.         ServerSocket serverSocket=new ServerSocket(10000);  
  17.           
  18.         while(true){  
  19.             //通过accept方法获取连接过来的Socket对象  
  20.             Socket socket=serverSocket.accept();  
  21.             new MyThread(socket).start();  
  22.         }  
  23.           
  24.     }  
  25. }  
  26.   
  27. class MyThread extends Thread{  
  28.     private Socket socket;  
  29.       
  30.     public MyThread(Socket socket) {  
  31.         this.socket = socket;  
  32.     }  
  33.   
  34.     @Override  
  35.     public void run() {  
  36.         try {  
  37.             System.out.println(socket.getInetAddress().getHostAddress()+"上传文件");  
  38.             FileOutputStream fileOutputStream=new FileOutputStream("c://"+System.currentTimeMillis()+".bmp");  
  39.             InputStream inputStream=socket.getInputStream();  
  40.               
  41.             byte[]buffer=new byte[1024];  
  42.             int lang = 0;  
  43.             while((lang=inputStream.read(buffer))!=-1){  
  44.                 fileOutputStream.write(buffer, 0, lang);  
  45.             }  
  46.               
  47.             fileOutputStream.close();  
  48.             inputStream.close();  
  49.             socket.close();  
  50.         } catch (FileNotFoundException e) {  
  51.             e.printStackTrace();  
  52.         } catch (IOException e) {  
  53.             e.printStackTrace();  
  54.         }  
  55.     }  
  56. }  
——————————————————————————————————————————————————————————————————————

如果上传的文件是文本文件,可以使用缓冲流来上传,提高效率,下面是上传客户端和上传服务器。需要注意的是,BufferedReader的readLine方法是阻塞式方法,需要判断每一行是否有换行符。(\r\n)


UpLoadClient

[java]   view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.xiaozhi.jingtian.tcp;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.BufferedWriter;  
  5. import java.io.FileInputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStreamReader;  
  8. import java.io.OutputStreamWriter;  
  9. import java.net.Socket;  
  10.   
  11. public class UploadClient {  
  12.   
  13.     public static void main(String[] args) throws Exception, IOException {  
  14.         //创建客户端的Socket服务,指定目的主机和端口号  
  15.         Socket socket=new Socket("121.251.158.251",10000);  
  16.           
  17.         BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream("c://1.txt")));   
  18.         BufferedWriter bufferedWriter= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));  
  19.           
  20.         String line=null;  
  21.         while((line=bufferedReader.readLine())!=null){  
  22.             bufferedWriter.write(line);  
  23.             bufferedWriter.newLine();  
  24.             bufferedWriter.flush();  
  25.         }  
  26.       
  27.         bufferedReader.close();  
  28.         bufferedWriter.close();  
  29.         socket.close();  
  30.     }  
  31. }  


UpLoadServer

[java]   view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.xiaozhi.jingtian.tcp;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.BufferedWriter;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.io.InputStreamReader;  
  10. import java.io.OutputStreamWriter;  
  11. import java.net.ServerSocket;  
  12. import java.net.Socket;  
  13.   
  14. import javax.xml.crypto.Data;  
  15.   
  16. public class UploadServer {  
  17.   
  18.     public static void main(String[] args) throws Exception {  
  19.         //创建服务端的Socket服务,指定端口号  
  20.         ServerSocket serverSocket=new ServerSocket(10000);  
  21.           
  22.         while(true){  
  23.             //通过accept方法获取连接过来的Socket对象  
  24.             Socket socket=serverSocket.accept();  
  25.             new MyThread(socket).start();  
  26.         }  
  27.           
  28.     }  
  29. }  
  30.   
  31. class MyThread extends Thread{  
  32.     private Socket socket;  
  33.       
  34.     public MyThread(Socket socket) {  
  35.         this.socket = socket;  
  36.     }  
  37.   
  38.     @Override  
  39.     public void run() {  
  40.         try {  
  41.             System.out.println(socket.getInetAddress().getHostAddress()+"上传文件");  
  42.             BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  43.             BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c://"+System.currentTimeMillis()+".txt")));  
  44.               
  45.             String line=null;  
  46.             while((line=bufferedReader.readLine())!=null){  
  47.                 bufferedWriter.write(line);  
  48.                 bufferedWriter.newLine();  
  49.                 bufferedWriter.flush();  
  50.             }  
  51.               
  52.             bufferedReader.close();  
  53.             bufferedWriter.close();  
  54.             socket.close();  
  55.         } catch (FileNotFoundException e) {  
  56.             e.printStackTrace();  
  57.         } catch (IOException e) {  
  58.             e.printStackTrace();  
  59.         }  
  60.     }  
  61. }  

代码修改:

使用PrintWriter替换BufferedWriter,因为println方法自带换行,PrintWriter还可以设置autoFlush的参数,自动刷新。

客户端

[java]   view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.xiaozhi.jingtian.tcp;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.BufferedWriter;  
  5. import java.io.FileInputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStreamReader;  
  8. import java.io.OutputStreamWriter;  
  9. import java.io.PrintWriter;  
  10. import java.net.Socket;  
  11.   
  12. public class UploadClient {  
  13.   
  14.     public static void main(String[] args) throws Exception, IOException {  
  15.         //创建客户端的Socket服务,指定目的主机和端口号  
  16.         Socket socket=new Socket("121.251.158.251",10000);  
  17.           
  18.         BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream("c://1.txt")));   
  19.         PrintWriter printWriter =new PrintWriter(socket.getOutputStream(),true);  
  20.           
  21.         String line=null;  
  22.         while((line=bufferedReader.readLine())!=null){  
  23.             printWriter.println(line);  
  24.         }  
  25.         bufferedReader.close();  
  26.         printWriter.close();  
  27.         socket.close();  
  28.     }  
  29. }  

服务端

[java]   view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.xiaozhi.jingtian.tcp;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.BufferedWriter;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.io.InputStreamReader;  
  10. import java.io.OutputStreamWriter;  
  11. import java.io.PrintWriter;  
  12. import java.net.ServerSocket;  
  13. import java.net.Socket;  
  14.   
  15. import javax.xml.crypto.Data;  
  16.   
  17. public class UploadServer {  
  18.   
  19.     public static void main(String[] args) throws Exception {  
  20.         //创建服务端的Socket服务,指定端口号  
  21.         ServerSocket serverSocket=new ServerSocket(10000);  
  22.           
  23.         while(true){  
  24.             //通过accept方法获取连接过来的Socket对象  
  25.             Socket socket=serverSocket.accept();  
  26.             new MyThread(socket).start();  
  27.         }  
  28.           
  29.     }  
  30. }  
  31.   
  32. class MyThread extends Thread{  
  33.     private Socket socket;  
  34.       
  35.     public MyThread(Socket socket) {  
  36.         this.socket = socket;  
  37.     }  
  38.   
  39.     @Override  
  40.     public void run() {  
  41.         try {  
  42.             System.out.println(socket.getInetAddress().getHostAddress()+"上传文件");  
  43.             BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  44.             PrintWriter printWriter =new PrintWriter(new FileOutputStream("c://"+System.currentTimeMillis()+".txt"),true);  
  45.               
  46.             String line=null;  
  47.             while((line=bufferedReader.readLine())!=null){  
  48.                 printWriter.println(line);  
  49.             }  
  50.               
  51.             bufferedReader.close();  
  52.             printWriter.close();  
  53.             socket.close();  
  54.         } catch (FileNotFoundException e) {  
  55.             e.printStackTrace();  
  56.         } catch (IOException e) {  
  57.             e.printStackTrace();  
  58.         }  
  59.     }  
  60. }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值