JAVA网络编程11---TCPdemo1客户端上传图片文件,服务器接收这个文件,并且给出反馈(完结)

接收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);


}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值