注意点
1、accept
2、socket.getInputStream
会立即得到一个输入流,随着写入数据会不断进入输入流,也就是说这个输入流是可变的,在读取这个输入流的时候,读到结束字符再结束读取。
而这个结束字符发送端需要调用socket.shutdownOutput()往数据流中写入;
代码
package com.ChuanWenJian;import java.io.*;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;/*** @author: mxl* @description: TODO TCP传文件* @date: 2021/2/4 18:34* null* @return*/public class TcpClientDemo01 {//public static void main(String[] args) throws IOException, InterruptedException {// 1、Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 8089);// 2、创建一个输出流OutputStream os=socket.getOutputStream();// 3\文件流FileInputStream fileInputStream = new FileInputStream(new File("earth.jpg"));// 4、写出文件byte[] buffer=new byte[1024];int len;while ((len=fileInputStream.read(buffer))!=-1){os.write(buffer,0,len);Thread.sleep(100);System.out.println(1);}//告诉服务器传输完了socket.shutdownOutput();//告诉结束了输出,让服务端继续经行//确定服务器接收完毕才可以断开链接InputStream inputStream = socket.getInputStream();//传进来的为Stirng byte[]ByteArrayOutputStream baos=new ByteArrayOutputStream();byte[] bufer2=new byte[2024];int len2;while ((len2=inputStream.read(bufer2))!=-1){baos.write(bufer2,0,len2);System.out.println(baos.toString());}//// 关闭流操作}}
package com.ChuanWenJian;import java.io.*;import java.net.ServerSocket;import java.net.Socket;public class TcpServerDemo01 {public static void main(String[] args) throws IOException, InterruptedException {// 1、创建服务ServerSocket serverSocket=new ServerSocket(8089);// 2、监听连接,阻塞式监听Socket socket =serverSocket.accept();// 3、获取输入流InputStream in=socket.getInputStream();System.out.println("接收完了");// 4、文件输出FileOutputStream fos=new FileOutputStream(new File("cz2.jpg"));byte[] buffer=new byte[1024];int len;while ((len=in.read(buffer))!=-1){fos.write(buffer,0,len);}//不加shoudown会卡在这一步,一直在while循环中//通知客户端接收完毕了System.out.println("读取完了");OutputStream os=socket.getOutputStream();os.write("我接收完毕了,你断开zcxc吧".getBytes());System.out.println("@2");// 关闭流操作 TODO 这边传完不关闭socket的话会造成那边发生异常// fos.close();// in.close();socket.close();// serverSocket.close();}}
