TCP 上传文本/图片文件 java

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class UpLoadTextServer {
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(6886);
		Socket s = ss.accept();

		// 读取客户端上传的文件且存储到本地---io
		// 获取源和目的:源:InputStream in=s.getInPutSream;
		// 目的:FileWriter w=new FileWrite();

		// 源: InputStream in = s.getInputStream();
		// 目的: FileWriter

		// 是否需要其它功能
		// FileWriter <-- InputStreamReader(in) <--BufferedReader
		// FileWriter<-- PrintWriter(... )
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class UpLoadTextClient {
	public static void main(String[] args) throws IOException {
		Socket s = new Socket("127.0.0.1", 6886);

		// 读取本地文本文件,向服务器端发送---io

		// 获得源和目的 文本文件 源:Reader r=new Reader()
		// 目的:OutputStream out=s.getOutputSream();

		BufferedReader br = new BufferedReader(new FileReader("files\\text.txt"));
		PrintWriter pw = new PrintWriter(s.getOutputStream(), true);

		// 向服务器端上传文件内容(流对拷)
		String str = null;
		while ((str = br.readLine()) != null) {
			pw.println(str);
		}

		// 发送结束标记
		// out.println("over!");//自定义方式
		s.shutdownOutput();//用Socket中做的结束标记
		
		
		//接收服务器端发来的上传成功的提示信息
		InputStream in=s.getInputStream();
		BufferedReader brr=new BufferedReader(new InputStreamReader(in));
		String echo=brr.readLine();
		System.out.println(echo);

		s.close();

	}
}

// 接收数据(流对拷)BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));PrintWriter pw = new PrintWriter(new FileWriter("files\\server.txt"));String str = null;while ((str = br.readLine()) != null) {pw.print(str);pw.flush();}//给客户端一个接收完毕的提示OutputStream out=s.getOutputStream();PrintWriter pw2=new PrintWriter(out,true);pw2.println("上传成功!");s.close();ss.close();}}
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class UpLoadTextClient {
	public static void main(String[] args) throws IOException {
		Socket s = new Socket("127.0.0.1", 6886);

		// 读取本地文本文件,向服务器端发送---io

		// 获得源和目的 文本文件 源:Reader r=new Reader()
		// 目的:OutputStream out=s.getOutputSream();

		BufferedReader br = new BufferedReader(new FileReader("files\\text.txt"));
		PrintWriter pw = new PrintWriter(s.getOutputStream(), true);

		// 向服务器端上传文件内容(流对拷)
		String str = null;
		while ((str = br.readLine()) != null) {
			pw.println(str);
		}

		// 发送结束标记
		// out.println("over!");//自定义方式
		s.shutdownOutput();//用Socket中做的结束标记
		
		
		//接收服务器端发来的上传成功的提示信息
		InputStream in=s.getInputStream();
		BufferedReader brr=new BufferedReader(new InputStreamReader(in));
		String echo=brr.readLine();
		System.out.println(echo);

		s.close();

	}
}

下面是上传图片文件。

import java.io.BufferedInputStream;
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.io.PrintStream;
//import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadPhotoServer {
	/*支持多用户并发的思想:
	 *  main线程只负责不停地进行响应客户端的连接请求(握手),
	 *  每成功新建一个连接就另开一个线程去负责跟这个用户通讯。
	 */
	public static void main(String[] args) {
		// 创建serverSocket,指定端口接收数据,这里的端口一定要与用户端发送数据的端口相等
		// 等待握手
		ServerSocket ss;
		try {
			ss = new ServerSocket(8668);
		
			while(true){//无限循环,若握手成功,则另开一个线程
			Socket s = ss.accept();// 阻塞方法
			// 程序能运行到这里,说明握手成功,否则等待抛异常
            new Thread(new UpLoadServerThread(s)).start();//开线程接待
            }
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

class UpLoadServerThread implements Runnable {
	private Socket s=null;

	public UpLoadServerThread(Socket s) {
		this.s = s;
	}

	@Override
	public void run() {

		try {
             //先获取对方的IP
			String ip=s.getInetAddress().getHostAddress();
			
			// 读取客户端上传的图片文件且存储到本地---io
			/*
			 * 获取源和目的 源:inputstream in= s.getInputStream(); 
			 * 目的:FileOutputStream out=new FileOutputStream(file);
			 */

			/*
			 * 是否需要其它功能 FileOutputSream<--BufferedOutputSream
			 * )
			 */
			//文件存放位置处理
			File dir=new File("file");
			if(!dir.exists()){
				dir.mkdirs();
			}
			
			
			//先接收传送过来的文件名
			InputStream in = s.getInputStream();
		    BufferedInputStream bis = new BufferedInputStream(in);
			//这里要注意,读取内容的大小要与上传时定义的文件头大小要相等。
		    byte bb[]=new byte[1024];
		    bis.read(bb);
		    int i=0;
		    for(;i<bb.length;i++){
		    	if(bb[i]==10){
		    		break;
		    	}
		    }
		    
		    //获取文件名
		    String imagFileName=new String(bb,0,i,"UTF-8");
		    //---文件名设计: IP(1).jpg, IP(2).jpg ....指定传送过来的文件名
			//文件对象处理(最主要是考虑文件名的生成)
		  
			int count=1;
			File file=new File(dir,(count++)+imagFileName);
			System.out.println(ip);
			while(file.exists()){
				file=new File(dir,(count++)+imagFileName);
			}
		    file.createNewFile();
			
		    // 接收数据(流对拷)
			
			OutputStream out = new FileOutputStream(file);
			//PrintStream ps = new PrintStream(out);
            BufferedOutputStream bos=new BufferedOutputStream(out);
			byte b[] = new byte[1024];
			int len = 0;
			while ((len = bis.read(b)) != -1) {
				bos.write(b, 0, len);
				bos.flush();
			}

			// 给客户端一个接收完毕的提示
			OutputStream out2 = s.getOutputStream();
			//PrintWriter pw2 = new PrintWriter(out2, true);
			//pw2.println("上传成功!");
            out2.write("文件上传成功!".getBytes());
			
            s.close();
            bos.close();
		} catch (IOException e) {

			e.printStackTrace();
		}

	}

}
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
//import java.io.PrintStream;
import java.net.Socket;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

/**
 * 
 * @author <a href=875183520@qq.com/>张涛森 把一个图片文件发送到服务端并读取回馈信息。
 *         要求判断文件是否存在及格式是否为jpg或gif并要求文件小于2M version 1.0 2018-5-11 上午11:09:05
 */
public class UpLoadPhotoClient {
	public static void main(String[] args) throws IOException{
		
			// 建立socket连接(ip+port)
			Socket s = new Socket("127.0.0.1", 8668);
			// 能到这里 说明 已经建立连接,可以进行图片上传
			/*
			 * 要读取本地图片文件,先看符不符合要求 1.文件是否存在 2.判断后缀名是那种形式(.jpg或者.gif) 3.文件大小不超过2M
			 */
			JFileChooser jfc = new JFileChooser();
			int sel = jfc.showOpenDialog(null);
			File imageFile = null;
			if (sel == JFileChooser.APPROVE_OPTION) {
				imageFile = jfc.getSelectedFile();
			}
			if (imageFile == null) {
				JOptionPane.showMessageDialog(null, "选择文件不能为空!");
				s.close();
				return;
			}
			// 1.如果文件不存在,就结束
			if (!imageFile.exists()) {
				JOptionPane.showMessageDialog(null, "文件不存在!");
				s.close();
				return;
			}
			// 2.判断后缀名是那种形式(.jpg或者.gif)
			// 能到这里说明文件存在,接下来进行格式校验
			// 如果不是 jpg或gif 就结束
			if (!(imageFile.getName().endsWith(".jpg") || (imageFile.getName()
					.endsWith("gif")))) {
				JOptionPane.showMessageDialog(null, "文件格式格式只能为jpg或gif格式!");
				s.close();
				return;
			}

			// 能到这里说明文件名符合要求,进行最后的校验
			// 3.文件大小不超过2M,
			if (imageFile.length() > 4* 1024 * 1024) {
				JOptionPane.showMessageDialog(null, "出错啦,文件大小不能超过4M!");
				s.close();
				return;
			}

			// 程序能到这里说明可以进行上传了
			// 向服务器端发送---io
			// 因为文件是 图片 类型 为了不失真 采用字节流
           
			//PrintStream ps = new PrintStream(s.getOutputStream(), true);
            BufferedOutputStream bs=new BufferedOutputStream(s.getOutputStream());
			//相当于协议,先把文件名发送到另一端
            byte fileName[]=new byte[1024];
            byte buf[]=(imageFile.getName()+"\n").getBytes();
            System.arraycopy(buf,0,fileName,0,buf.length);
            bs.write(fileName);
           
            //读取图片数据
            BufferedInputStream bis = new BufferedInputStream(
					new FileInputStream(imageFile));
            // 向服务器端上传文件内容,进行流对拷
			byte b[] = new byte[1024];
			int len = 0;
			while ((len = bis.read(b)) != -1) {
				bs.write(b, 0, len);
				bs.flush();//※※注意: 所有字符流都要刷缓存, 字节流的缓存流也要刷缓存
			}

			// 关闭输入流
			bis.close();
			
			// 用Socket中做的结束标记
			s.shutdownOutput();//发送结束标记(表示输出的结束标记)
			
			//接收服务器的反馈信息
			BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream(),"utf-8"));
			String echo=br.readLine();
			System.out.println(echo);
		    
			//关闭socket
			s.close();
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值