慕粉Coder
2016-06-29 17:36
import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { /** * 服务端:实现接收客户端发送的文件 * * @throws IOException */ public static void main(String[] args) throws IOException { String filename = null; String filesize = null; File file=null; // 1.创建ServerSocket实例,指定绑定的端口号,并监听次端口 ServerSocket serverSocket = new ServerSocket(8235); // 2.调用accept()方法开始监听,等待客户端的连接 Socket socket = serverSocket.accept(); System.out.println("***启动服务器,等待连接…………………………"); // 3.读取客户端发送的请求信息 InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String info=br.readLine() ; // 4.解析客户端发送的文件信息,正确的,保存文件名以及文件的大小,为下面接收文件内容做准备 int index = info.indexOf("/#");// 查找/#在字符串中的索引位置 String daima = info.substring(0, index);// 获取字符串从0位置-index(不包括)之间的字符串内容 if (!daima.equals("111")) { System.out.println("服务器收到的文件的协议代码和客户端的文件协议代码不匹配!!"); } else { System.out.println("文件的协议代码一致!!!"); String infoChild = info.substring(index + 2); // 获得info字符串的子字符串,该子字符串从指定索引处的字符开始,直到此字符串末尾部分的内容 int indexC = infoChild.indexOf("/#"); filename = infoChild.substring(0, index).trim();// trim忽略前导空白和尾部空白 filesize = infoChild.substring(index + 2).trim(); } // 将接收到的文件保存在本地 file = new File(filename); if (!file.exists()) { file.createNewFile(); } else { System.out.println("本路径已存在相同文件,进行覆盖"); } // 5.服务器接收文件内容,并将内容保存到本地文件中 InputStream is1 = socket.getInputStream();// 获取传送文件的字节流 ObjectInputStream ois = new ObjectInputStream(is1); // long fileSize = Long.parseLong(filesize);//将文件大小转换成有符号的十进制形式 /** 将文件包装到文件输出流对象中 */ FileOutputStream fos = new FileOutputStream(file); byte[] data = new byte[ois.available()]; // ObjectInputStream的available()方法,读取字节数 int len; while ((len = ois.read()) != -1) {// ObjectInputStream的read()方法,读取数据字节;如果读取的字节已到达流的末尾,则返回 // -1。 fos.write(data, 0, len); fos.flush(); } serverSocket.close(); socket.close(); is.close(); isr.close(); br.close(); is1.close(); ois.close(); fos.close(); } } 客户端******************************* import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class Client { /** * 客户端:向服务端发送文件 * 1、建立与服务器端的连接, * 2、将文件的名字和大小通过自定义的文件传输协议,发送到服务器 * 3、循环读取本地文件,将文件打包发送到数据输出流中 * 4、关闭文件,结束传输 * */ public static void main(String[] args) throws UnknownHostException, IOException { String filename=null; int filesize; //1.指定要发送的文件,并确保文件存在 File sendfile = new File("C:\\Users\\Lbb\\Desktop\\API.CHM"); if(!sendfile.exists()){ System.out.println("客户端:要发送的文件不存在"); } //2.创建Socket实例,指定服务器的IP地址和端口号 Socket socket=new Socket("localhost",8235); //3.向服务器发送文件的协议编码(/#),文件名(/#)和文件大小的信息 FileInputStream fis=new FileInputStream(sendfile); ObjectInputStream ois=new ObjectInputStream(fis); filename=sendfile.getName();//获取文件名 filesize=ois.available();//获取文件的字节数(文件大小) OutputStream os=socket.getOutputStream(); PrintWriter pw=new PrintWriter(os); pw.write("111/#"+filename+"/#"+filesize); pw.flush(); socket.shutdownOutput(); //4.向服务器传送文件的内容 byte[]data=new byte[ois.available()]; int len; while((len=ois.read())!=-1){ os.write(data, 0, len); os.flush(); } socket.close(); fis.close(); ois.close(); os.close(); pw.close(); } }
感觉你的好复杂,只是我的http://www.imooc.com/article/11793
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("111/#"+filename+"/#"+filesize);
pw.flush();
socket.shutdownOutput();
服务端代码为什么,一会是index 一会是indexc
Java Socket应用---通信是这样练成的
125013 学习 · 590 问题
相似问题