接收TCP数据的时候可以对socket的输入流进行封装,
只可以把socket的getInputStream方法封装为BufferedInputStream
但是使用socket发送数据的时候是不能对socket的getOutputStream进行封装的
客户端实现的操作
1.读取本地图片文件 使用BufferedInputStream
2.使用socket的getOutputStream方法数据发送给服务器
注意这里不要对这个socke的输出流进行封装,不然会出BUG 可能会导致只上传了一部分文件
3.接收服务器端的反馈,接收socket的数据是可以进行封装的
我们可以使用BufferedInputStream对socket的getInputStream进行封装
服务器端实现的操作
1.接收客户端的数据,接收socket发送的数据是可以进行封装的
我们可以将socket的getInputStream方法封装为BufferedInputStream()
2.写入文件,我们创建了一个文件的输出流输出到文件,
但是这里不能对数据进行封装 我也不知道为什么,
难道是吧socket的数据写入文件也是错的
3服务器给出反馈,这里有用到了socket的输出流我们是可以对socket的
getOutputStream进行封装的可以封装为BufferedOutputStream
客户端的代码
public static void main(String[] args) throws IOException {
//创建客户端的socket对象
Socket socket = new Socket("192.168.0.109",10086);
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\IdeaProjects\\Day08_thread" +
"\\MyInternet\\src\\TCPdemo5Plus2\\baidu.PNG");
//包装一下
BufferedInputStream bis = new BufferedInputStream(fis);
//创建socket的输出流 用于发送数据给客户端
OutputStream socket_outstream = socket.getOutputStream();
//封装为字节缓冲输入流 这种会导致文件传输不完整
BufferedOutputStream bos = new BufferedOutputStream(socket_outstream);
//我试一下使用 使用OutPutstream
//发送给服务器
//开始读取数据 一次读取一个字节
byte by[] = new byte[1024];
int len ;
while ( (len = bis.read(by)) != -1){
//写数据
//bos.write(by,0,len); socket发送数据的时候不能使用封装流BufferedOutputStream
//要使用自己的流
socket_outstream.write(by,0,len);
}
System.out.println(11111);
//我在这个里给服务器说一声我上传完毕了
socket.shutdownOutput();
//接收客户端的反馈
//socket的InputStreanm
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
//封装为字节缓冲流
BufferedReader br = new BufferedReader(inputStreamReader);
System.out.println(br.readLine());
//释放资源
fis.close();
//fos.close();
// bos.close(); 因为这里用到的是输出流 前面我们已经关闭输出流了 所以不用关闭关了反而报错
socket.close();
//这里我们要把socket放在bos后面 不然就会报错
// 更加奇怪的就是 如果你把bos给删除了,不释放这个资源文件就没有复制过去
}
**
服务器端的代码
**
public static void main(String[] args) throws IOException {
//创建服务端的socket对象
ServerSocket ss = new ServerSocket(10086);
//监听客户端的连接
Socket socket = ss.accept();
//创建socket的字节输入流 并封装
InputStream is = socket.getInputStream();
//封装为字节缓冲流
BufferedInputStream bis = new BufferedInputStream(is);
//创建字节输出流 用于把数据写入文件 OutputStream 是抽象类用它的子类FileOutputStream
FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\IdeaProjects\\Day08_thread" +
"\\MyInternet\\src\\TCPdemo5Plus2\\copybaidu.PNG");
//封装输出流 为字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(fos);
//开始读取数据 一次读取一个字节数组
byte by[] = new byte[1024];
int len ;
while ((len = bis.read(by)) != -1){
//开始向文件写入数据
fos.write(by,0,len);
}
System.out.println(2222222);
//给客户端一个反馈
//socket输出流
OutputStream socket_out = socket.getOutputStream();
socket_out.write("上传完毕".getBytes());
//释放资源
//bis.close();
fos.close();
socket.close();
ss.close();
System.out.println(888888);
}