之前对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();
}
}
}