心得15--网络编程6-图片等二进制文件的上传与输出
1. 先说一个简单的案例
客户端:
package com.TcpJpg;
importjava.io.FileInputStream;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.Socket;
publicclass JpgClient {
/**
* 客户端:图片上传
* @param args
*/
publicstaticvoid main(String[]args) {
Socket s = null;
FileInputStream fi = null; //文件输入流从外面读文件数据
try {
s = new Socket("192.168.49.200",8000);
fi = new FileInputStream("d:\\1.jpg");
OutputStream out =s.getOutputStream(); // 通过socket获取输出流,进行信息通信
byte[] buf =newbyte[1024];
int len = 0;
while((len=fi.read(buf))!=-1) {
out.write(buf,0,len);
}
s.shutdownOutput();
InputStream in = s.getInputStream();
byte[] b =newbyte[1024];
System.out.println(new String(b,0,in.read(b)));
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
s.close();
fi.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
服务器端:
packagecom.TcpJpg;
importjava.io.FileOutputStream;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclass JpgServer {
/**
* 服务器端:下载图片
*@param args
*/
public static void main(String[] args) {
ServerSocket ss = null;
Socket s = null;
FileOutputStream fo = null;
try {
ss = new ServerSocket(8000);
s = ss.accept();
InputStream in = s.getInputStream();
System.out.println(s.getInetAddress().getHostAddress()+"已连接");
fo = newFileOutputStream("d:\\girl.jpg");
byte[] buf = new byte[1024];
int len = 0;
while((len=in.read(buf))!=-1) {
fo.write(buf,0,len);
}
OutputStream out = s.getOutputStream();
out.write("上传成功!".getBytes()); // 将传进来的字符串转换成二进制保存
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
fo.close();
s.close();
ss.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
2. 一个可以键盘输入、无限上传的案例
客户端:
packagecom.TcpJpg;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.Socket;
publicclass JpgClient1 {
/**
* 客户端:图片上传
*@param args
*/
public static void main(String[] args) {
try {
if(args.length==0) { //如果参数恒等于0则表示没有传入参数即没有指定文件
System.out.println("请指定一个jpg文件");
return;
}
File f = new File(args[0]);
Socket s = newSocket("192.168.49.200",8000);
FileInputStream fi = newFileInputStream(f); //文件输入流从外面读文件数据
OutputStream out = s.getOutputStream(); // 通过socket获取输出流,进行信息通信
byte[] buf = new byte[1024];
int len = 0;
while((len=fi.read(buf))!=-1) {
out.write(buf,0,len);
}
s.shutdownOutput();
InputStream in = s.getInputStream();
byte[] b = new byte[1024];
System.out.println(newString(b,0,in.read(b)));
s.close();
fi.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务器端:
packagecom.TcpJpg;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclass JpgServer1 {
/**
* 服务器端:下载图片
*@param args
*@throws IOException
*/
public static void main(String[] args) throwsIOException {
ServerSocket ss = new ServerSocket(8000);
while (true) {
Socket s = ss.accept();
new Thread(new JpgThread(s)).start();
}
}
}
classJpgThread implements Runnable {
private Socket s;
public JpgThread(Socket s) {
this.s = s;
}
public void run() {
int count = 1; // 设置一个计数器,使同一个客户端即IP能传多个文件
try {
String ip =s.getInetAddress().getHostAddress();
System.out.println(ip+"已连接");
InputStream in = s.getInputStream();
File dir = newFile("D:\\image"); //指定的客户端上传后的文件保存在该文件夹下
File f = new File(dir, ip +"(" + count + ").vbs");
while (f.exists()) { //判断一种条件:如果文件不存在则加一返回保存新文件
f = new File(dir, ip + "(" + (count++)+ ").vbs");
}
FileOutputStream fo = newFileOutputStream(f);
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
fo.write(buf, 0, len);
}
OutputStream out = s.getOutputStream();
out.write("上传成功!".getBytes());// 将传进来的字符串转换成二进制保存
fo.close();
s.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}