Java之-----------TCP编程(小练习大用处)

之前对socket编程有了很多的介绍与代码演示,现在学习如何将一个文件从客户端存储到服务器端,以及图片的存储等;(若之前没有看到介绍,请点击这里点击打开链接

上传一个本地文件:

读取一个本地文本文件,将数据发送到服务端,服务器端对数据进行存储。 存储完毕后,给客户端一个提示。

是首先客户端代码,总体来说和之前的差不多,同样采用socket,只是传送的不是简单的字符串,而是从本地文件读取,然后PrintWriter写到服务器去。 

/**
 * 
 */
package SampleDemo.UpTextTCP.TWO;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @author xinxin
 *
 */
public class Climnt {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			//socket连接
			Socket s=new Socket("127.0.0.1", 1888);
			
			//用io流读取文件,通过网路写(打印流最适合)
			BufferedReader br =new BufferedReader(new FileReader("E:\\ex\\updown2.txt"));
			PrintWriter pw =new PrintWriter(s.getOutputStream(),true);//自动刷新功能
			String line ="";
			while((line=br.readLine())!=null){
				pw.println(line);//写到socket中去
			}
			s.shutdownOutput();//传一个结束符,服务器端好处理,因为这边会传一个null,服务器那边照样接收字符null
		
			
			BufferedReader br1 =new BufferedReader(new InputStreamReader(s.getInputStream()));
			String str1=br1.readLine();
			System.out.println(str1);//读取返回的   服务器存储成功
			
			
			s.close();
			br.close();
			pw.close();
			br1.close();
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

服务器端的程序,同样也是写到某个存储的区域

/**
 * 
 */
package SampleDemo.UpTextTCP.TWO;

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

/**
 * @author xinxin
 *
 */
public class TextService {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	//服务器端需要监听,随时准备接收很多的客服端访问
		try {
			ServerSocket ss =new ServerSocket(1888);
			//进行监听
			Socket s=ss.accept();//监听可能会出现多线程,所以需要用多线程
			//网络中传输都是字节传输,所以接收后需要转换
			BufferedReader br =new BufferedReader( new InputStreamReader(s.getInputStream()));
			/*
			 * PrintWriter(OutputStream out, boolean autoFlush) 
          		通过现有的 OutputStream 创建新的 PrintWriter。
			 */
			PrintWriter pw =new PrintWriter(new FileWriter("text\\a1.txt"),true);//写到指定文件,带自动刷新功能
			String str =null;
			while((str=br.readLine())!=null){//采用缓冲流除了速度很快外,还可以读一行,这是重点
				pw.println(str);
			}
			//传说完毕之后,向客户端发送一个传送结束
		PrintWriter pr =new PrintWriter(s.getOutputStream(), true);
		String ip=s.getInetAddress().getHostAddress();
		String str1 =ip+",服务器端接收完毕!";
		pr.println(str1);
			pr.close();
			pw.close();
			ss.close();
			

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

	}

}
这就是简单的 本地文件上传服务器的程序

下面这是图片上传的客户端和服务器端(带上多线程)

/**
 * 
 */
package SampleDemo.picture;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @author xinxin
 *
 */
public class PictrueClient {

	/**
	 * @param args
	 */
	//图片客服端和之前的一样,同样是socket,接收的是字节流
	public static void main(String[] args) {
//		//卫条件判断是否满足要求
//		if(args.length!=1){
//			System.out.println("请指定有户名!");
//			return;
//		}
//		File file =new File(args[0]);
//		if(!(file.exists()&&file.isFile())){
//			System.out.println("文件不存在。");
//			return ;
//		}
//		if(!(file.getName().endsWith(".jpg")&&file.getName().endsWith("gif"))){
//			System.out.println("文件不是指定格式");
//			return;
//		}
//		if(file.length()>=1024*2048){
//			System.out.println("文件格式过大");
//			return;
//		}
		
		try {
			Socket s=new Socket("127.0.0.1", 10290);//链接
			FileInputStream fs =new FileInputStream(new File("E:\\ex\\pictrue\\2.jpg"));//读文件
			OutputStream out =s.getOutputStream();//写到网络
			
			int len=0;
			byte[] b=new byte[1024];
			while((len=fs.read(b))!=-1){
				out.write(b, 0, len);
			}
			s.shutdownOutput();//结束 标记,同样需要一个结束符
			
			
			InputStream is =s.getInputStream();
			byte[] bb=new byte[1024];
			int len1 =is.read(bb);
			String str =new String(bb,0,len1);
			System.out.println(str);
			
			
			fs.close();
			out.close();
			s.close();
			
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		

	}

}


服务器

/**
 * 
 */
package SampleDemo.picture;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author xinxin
 *
 */
public class PictrueService {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			ServerSocket ss =new ServerSocket(10290);//端口号一定要一致,不然不能通信
			Socket s =ss.accept();//服务器随时进行监听
			new Thread(	new Recive(s) ).start();//启动线程,因为不只是只有一个能够访文服务器,也许很多个
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
class  Recive implements Runnable{
	Socket s=null;

	public Recive(Socket s) {
		this.s = s;
	}
	@Override
	public void run() {
		try {
			FileOutputStream out =new FileOutputStream("E:\\ex\\aa.jpg");//这里可以写成活的,也就是说定义一个count计数,每次加1
			InputStream in =s.getInputStream();
			byte[] b =new byte[1024];
			int len=0;
			
			while((len=in.read(b))!=-1){
				out.write(b, 0, len);
			}
			
			OutputStream out1 =s.getOutputStream();
			String id =s.getInetAddress().getHostAddress();
			String str =id+",上传成功。";
			out1.write(str.getBytes());
			
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值