服务器端程序
package receive;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Receive {
public static void main(String args[])throws Exception{
//监听1050端口,将对象绑定到该端口上
ServerSocket serverSocket=new ServerSocket(1050);
while(true){
//获得与客户端对应的Socket对象
Socket s=serverSocket.accept();
new Thread(new ServerThread(s)).start();
serverSocket.close();
}
}
}
/*1.大体的流程通过套接字接收数据,存入缓冲区
*2.创建一个文件准备存储数据
*3.执行从缓冲区写入文件的操作
*PS:数据流与非自身进行数据的写入与读出,InputStream就是从另一目标读入
*OutputStream就是写出到另一目标
*/
class ServerThread implements Runnable{
private Socket socket;
//构造方法,没有返回值的都是构造方法,创建新类时用于初始化
public ServerThread(Socket socket){
this.socket=socket;
}
//
public void run(){
//返回客户端的IP地址,getInetAddress()获得远程IP地址,getHostAddress()后面那个转换成字符串的格式
//String ip=socket.getInetAddress().getHostAddress();
int count=1;
try{
//用于读取客户端的发送数据
InputStream in=socket.getInputStream();
//创建存储文件的空间
File parentFile=new File("F:\\eclipse-jee-mars-1-win32-x86_64\\workspace\\receive");
if(!parentFile.exists()){
parentFile.mkdir();
}
//把客户端的IP地址作为上传文件的文件名
File file=new File(parentFile,"My"+count+".jpg");
//如果文件已存在,避免原文件被覆盖,新建一个不重名的文件
while(file.exists()){
file=new File(parentFile,"My"+count+++".jpg");
}
//准备将缓冲区中的数据写入文件
FileOutputStream fos=new FileOutputStream(file);
byte []buf=new byte[1024];
int len=0;
//向文件中写内容
while((len=in.read(buf))!=-1){
fos.write(buf,0,len);
}
//向客户端端发送的数据
OutputStream out=socket.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
socket.close();
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
服务器端程序
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/*
* 1.确定发送的目的地址,
* 2.定义向客户端发送数据的数据流,定义即将发送数据的存储位置
* 3.将即将发送的数据写入缓冲区,然后写到输出流
*
*/
public class Upload {
public static void main(String args[])throws Exception{
//准备发送的目的地址
Socket socket =new Socket("127.0.0.1",1050);
//用于向服务器发送数据的输出流
OutputStream out=socket.getOutputStream();
//向缓冲区里面写数据,将数据写到输出流
FileInputStream fis=new FileInputStream("D:\\微信图片_20180814120031.jpg");
byte[]buf=new byte[2048];
int len;
while((len=fis.read(buf))!=-1){
out.write(buf,0,len);
}
socket.shutdownOutput();
//读取服务器端发送的数据
InputStream in=socket.getInputStream();
byte[] bufMsg =new byte[2048];
//并写到缓冲区然后输出到控制台
int num=in.read(bufMsg);
String Msg=new String(bufMsg,0,num);
System.out.println(Msg);
in.close();
fis.close();
socket.close();
}
}