模仿客户端与服务器端进行文件传输
1 传了两首歌曲
2 字节流和字符流还是有不一样的地方,不能乱用,也不能盲目的转化,
3 遇到的问题是传过来的文件变大了...,仔细看是调用的API需要处理字节流,换成
OutputStream就不行....
代码如下:
服务器端:
package TCP; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class tcpServer { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(9997); System.out.println("服务端在监听...."); Socket socket = serverSocket.accept();; //下载文件名 BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream()); byte[] buff = new byte[1024]; int len = 0; String s = null ; if((len=bufferedInputStream.read(buff,0, buff.length))!=-1){ s = new String(buff,0, len); System.out.println("客户端希望下载文件名:"+ s); }; String filepath = null; if("高山流水".equals(s)){ filepath = "src\\高山流水.mp3"; }else { filepath = "src\\无名.mp3"; } //查找目录文件 BufferedInputStream bufferedInputStream1 = new BufferedInputStream( new FileInputStream(filepath)); byte[] buf = StreamUtils.streamToByteArray(bufferedInputStream1); //将字符数组送到数据通道 BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream()); bufferedOutputStream.write(buf); socket.shutdownOutput(); bufferedOutputStream.close(); bufferedInputStream1.close(); bufferedInputStream.close(); socket.close(); serverSocket.close(); System.out.println("服务端退出...."); } }
客户端:
package TCP; import java.io.*; import java.net.InetAddress; import java.net.Socket; import java.util.Scanner; @SuppressWarnings({"all"}) public class tcpClient { public static void main(String[] args) throws Exception { Socket socket = new Socket(InetAddress.getLocalHost(),9997); //文件名 System.out.println("请输入文件名:"); Scanner scanner = new Scanner(System.in); String s = scanner.next(); //传到数据通道 OutputStream outputStream = socket.getOutputStream(); outputStream.write(s.getBytes()); socket.shutdownOutput(); //接受文件字符数组 BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream()); byte[] buf = StreamUtils.streamToByteArray(bufferedInputStream); if(buf!=null){ System.out.println("客户端已接收到信息..."); } //写入磁盘 String fiph = "D:\\java\\" + s + ".mp3"; BufferedOutputStream bufferedOutputStream = new BufferedOutputStream( new FileOutputStream(fiph)); bufferedOutputStream.write(buf); bufferedOutputStream.close(); bufferedInputStream.close(); outputStream.close(); socket.close(); System.out.println("客户端下载完毕,正确退出...."); } }
调用的API:
package TCP; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.InputStreamReader; /** * 此类用于演示关于流的读写方法 * */ public class StreamUtils { /** * 功能:将输入流转换成byte[], 即可以把文件的内容读入到byte[] * @param is * @return * @throws Exception */ public static byte[] streamToByteArray(InputStream is) throws Exception{ ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象 byte[] b = new byte[1024];//字节数组 int len; while((len=is.read(b))!=-1){//循环读取 bos.write(b, 0, len);//把读取到的数据,写入bos } byte[] array = bos.toByteArray();//然后将bos 转成字节数组 bos.close(); return array; } /** * 功能:将InputStream转换成String * @param is * @return * @throws Exception */ public static String streamToString(InputStream is) throws Exception{ BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder builder= new StringBuilder(); String line; while((line=reader.readLine())!=null){ builder.append(line+"\r\n"); } return builder.toString(); } }