注意点
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();
}
}