如果上传的文件不知道什么格式,我们需要用字节流来实现,既可以上传文本又可以上传其他格式文件。
上传客户端:
- package com.xiaozhi.jingtian.tcp;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.net.Socket;
- public class UploadClient {
- public static void main(String[] args) throws Exception, IOException {
- //创建客户端的Socket服务,指定目的主机和端口号
- Socket socket=new Socket("121.251.158.251",10000);
- FileInputStream fileInputStream=new FileInputStream("c://1.bmp");
- OutputStream outputStream=socket.getOutputStream();
- byte[]buffer=new byte[1024];
- int lang = 0;
- while((lang=fileInputStream.read(buffer))!=-1){
- outputStream.write(buffer, 0, lang);
- }
- fileInputStream.close();
- outputStream.close();
- socket.close();
- }
- }
上传服务器(单线程:只能一个客户端实现上传):
- package com.xiaozhi.jingtian.tcp;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class UploadServer {
- public static void main(String[] args) throws Exception {
- //创建服务端的Socket服务,指定端口号
- ServerSocket serverSocket=new ServerSocket(10000);
- while(true){
- //通过accept方法获取连接过来的Socket对象
- Socket socket=serverSocket.accept();
- FileOutputStream fileOutputStream=new FileOutputStream("c://2.bmp");
- InputStream inputStream=socket.getInputStream();
- byte[]buffer=new byte[1024];
- int lang = 0;
- while((lang=inputStream.read(buffer))!=-1){
- fileOutputStream.write(buffer, 0, lang);
- }
- fileOutputStream.close();
- inputStream.close();
- socket.close();
- }
- }
- }
代码修改
使用多线程修改服务器端代码实现并发上传:
- package com.xiaozhi.jingtian.tcp;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- import javax.xml.crypto.Data;
- public class UploadServer {
- public static void main(String[] args) throws Exception {
- //创建服务端的Socket服务,指定端口号
- ServerSocket serverSocket=new ServerSocket(10000);
- while(true){
- //通过accept方法获取连接过来的Socket对象
- Socket socket=serverSocket.accept();
- new MyThread(socket).start();
- }
- }
- }
- class MyThread extends Thread{
- private Socket socket;
- public MyThread(Socket socket) {
- this.socket = socket;
- }
- @Override
- public void run() {
- try {
- System.out.println(socket.getInetAddress().getHostAddress()+"上传文件");
- FileOutputStream fileOutputStream=new FileOutputStream("c://"+System.currentTimeMillis()+".bmp");
- InputStream inputStream=socket.getInputStream();
- byte[]buffer=new byte[1024];
- int lang = 0;
- while((lang=inputStream.read(buffer))!=-1){
- fileOutputStream.write(buffer, 0, lang);
- }
- fileOutputStream.close();
- inputStream.close();
- socket.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
如果上传的文件是文本文件,可以使用缓冲流来上传,提高效率,下面是上传客户端和上传服务器。需要注意的是,BufferedReader的readLine方法是阻塞式方法,需要判断每一行是否有换行符。(\r\n)
UpLoadClient
- package com.xiaozhi.jingtian.tcp;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- import java.net.Socket;
- public class UploadClient {
- public static void main(String[] args) throws Exception, IOException {
- //创建客户端的Socket服务,指定目的主机和端口号
- Socket socket=new Socket("121.251.158.251",10000);
- BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream("c://1.txt")));
- BufferedWriter bufferedWriter= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
- String line=null;
- while((line=bufferedReader.readLine())!=null){
- bufferedWriter.write(line);
- bufferedWriter.newLine();
- bufferedWriter.flush();
- }
- bufferedReader.close();
- bufferedWriter.close();
- socket.close();
- }
- }
UpLoadServer
- package com.xiaozhi.jingtian.tcp;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- import java.net.ServerSocket;
- import java.net.Socket;
- import javax.xml.crypto.Data;
- public class UploadServer {
- public static void main(String[] args) throws Exception {
- //创建服务端的Socket服务,指定端口号
- ServerSocket serverSocket=new ServerSocket(10000);
- while(true){
- //通过accept方法获取连接过来的Socket对象
- Socket socket=serverSocket.accept();
- new MyThread(socket).start();
- }
- }
- }
- class MyThread extends Thread{
- private Socket socket;
- public MyThread(Socket socket) {
- this.socket = socket;
- }
- @Override
- public void run() {
- try {
- System.out.println(socket.getInetAddress().getHostAddress()+"上传文件");
- BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
- BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("c://"+System.currentTimeMillis()+".txt")));
- String line=null;
- while((line=bufferedReader.readLine())!=null){
- bufferedWriter.write(line);
- bufferedWriter.newLine();
- bufferedWriter.flush();
- }
- bufferedReader.close();
- bufferedWriter.close();
- socket.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
代码修改:
使用PrintWriter替换BufferedWriter,因为println方法自带换行,PrintWriter还可以设置autoFlush的参数,自动刷新。
客户端
- package com.xiaozhi.jingtian.tcp;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- import java.io.PrintWriter;
- import java.net.Socket;
- public class UploadClient {
- public static void main(String[] args) throws Exception, IOException {
- //创建客户端的Socket服务,指定目的主机和端口号
- Socket socket=new Socket("121.251.158.251",10000);
- BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream("c://1.txt")));
- PrintWriter printWriter =new PrintWriter(socket.getOutputStream(),true);
- String line=null;
- while((line=bufferedReader.readLine())!=null){
- printWriter.println(line);
- }
- bufferedReader.close();
- printWriter.close();
- socket.close();
- }
- }
服务端
- package com.xiaozhi.jingtian.tcp;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- import java.io.PrintWriter;
- import java.net.ServerSocket;
- import java.net.Socket;
- import javax.xml.crypto.Data;
- public class UploadServer {
- public static void main(String[] args) throws Exception {
- //创建服务端的Socket服务,指定端口号
- ServerSocket serverSocket=new ServerSocket(10000);
- while(true){
- //通过accept方法获取连接过来的Socket对象
- Socket socket=serverSocket.accept();
- new MyThread(socket).start();
- }
- }
- }
- class MyThread extends Thread{
- private Socket socket;
- public MyThread(Socket socket) {
- this.socket = socket;
- }
- @Override
- public void run() {
- try {
- System.out.println(socket.getInetAddress().getHostAddress()+"上传文件");
- BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
- PrintWriter printWriter =new PrintWriter(new FileOutputStream("c://"+System.currentTimeMillis()+".txt"),true);
- String line=null;
- while((line=bufferedReader.readLine())!=null){
- printWriter.println(line);
- }
- bufferedReader.close();
- printWriter.close();
- socket.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }