关于网络编程的问题

蓝色深海20 2021-03-30 04:18:04
我跟着教程写了一个简单的文件上传程序,文件上传成功了,可是客户端就是读取不到服务器的回写数据,求大佬帮看看是什么问题。代码如下:
客户端代码:
package com.java.gy.day20.upload;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClient {

public static void main(String[] args) throws UnknownHostException, IOException {
// TODO 自动生成的方法存根
//1.创建本地字节输入流FileInputStream对象
FileInputStream fis = new FileInputStream("D:\\Resources\\123\\1.jpg");
//2.创建客户端Socket对象
Socket socket = new Socket("127.0.0.1",8888);
//3.使用Socket对象的getOutputStream方法,创建网络输出流OutputStream对象
OutputStream os = socket.getOutputStream();
//4.使用本地字节输入流FileInputStream对象的read方法,读取本地文件
//5.使用网络输出流OutputStream对象的write方法,向服务器发送数据
int len = 0;
byte[] bytes = new byte[1024];
while((len = fis.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
//6.使用Socket对象的getInputStream方法,创建网络输入流InputStream对象
System.out.println("测试1");
InputStream is = socket.getInputStream();
//7.使用网络输入流InputStream对象的read方法,读取服务器的回写数据
while((len = is.read(bytes))!=-1) {
System.out.println(new String(bytes,0,len));
}
System.out.println("测试3");
//8.释放资源
fis.close();
socket.close();
}


服务器端代码:
package com.java.gy.day20.upload;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {

public static void main(String[] args) throws IOException {
// TODO 自动生成的方法存根
//1.创建服务器端ServerSocket对象,并绑定指定的端口号
ServerSocket server = new ServerSocket(8888);
//2.使用ServerSocket对象的accept方法,获取请求的Socket对象
Socket socket = server.accept();
//3.创建FileOutputStream对象,并指定文件在服务器上存储的位置
FileOutputStream fos = new FileOutputStream("D:\\Resources\\新建文件夹\\1.jpg");
//4.使用Socket对象的getInputStream方法,获取网络输入流InputStream对象
InputStream is = socket.getInputStream();
//5.使用网络输入流InputStream对象的read方法,读取客户端传送的数据
//6.使用FileOutputStream对象的write方法,将文件写入服务器的指定位置
int len = 0;
byte[] bytes = new byte[1024];
while((len=is.read(bytes))!=-1) {
//System.out.println(len);
fos.write(bytes, 0, len);
}
System.out.println("测试2");
//7.使用Socket对象的getOutputStream方法,获取网络输出流OutputStream对象
OutputStream os = socket.getOutputStream();
//8.使用网络输出流OutputStream对象的write方法向客户端回写数据"上传成功"
os.write("上传成功".getBytes());
//9.释放资源
fos.close();
socket.close();
server.close();
}


}
...全文
354 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2021-04-01
  • 打赏
  • 举报
回复
引用 4 楼 蓝色深海20 的回复:
谢谢,测试成功了,不过我对其中原理还是有点不太懂,能帮我详细说一下吗?
只要客户端不关闭输出流,服务器一直处于等待状态。服务器循环中的-1是取不到的
蓝色深海20 2021-04-01
  • 打赏
  • 举报
回复
谢谢,测试成功了,不过我对其中原理还是有点不太懂,能帮我详细说一下吗?
冰思雨 2021-04-01
  • 打赏
  • 举报
回复
引用 4 楼 蓝色深海20 的回复:
谢谢,测试成功了,不过我对其中原理还是有点不太懂,能帮我详细说一下吗?
客户端和服务端之间的通信,缺少通信协议。 客户端只知道发送二进制的文件数据,但是,数据发完了之后,服务端无法感知客户端是否发送完毕。 服务端只知道接收数据,或者说,接收数据的过程是个死循环,无法判断什么时候文件数据接收完毕。 再看一下服务端的while条件,读取数据的值是-1时结束循环,这个条件要想满足,必须是输入流被关闭,或者说,数据流读到了尽头,读完了。 而,服务端的数据流,对应的就是客户端的输出流,客户端的输出流,并没有进行close函数的调用,所以,服务端无法感知输入流的关闭。 #3楼的 socket.shutdownOutput(); 在客户端调用这个方法,就是关闭客户端的输出流,服务端就可以读取到-1的数据了,服务端while循环结束,就可以发送回写数据了。 当然,已经关闭的流(输入/输出)是不能再次打开的。 所以,一般情况下,客户端和服务端之间是需要定制通信协议的,除了发送数据之外,还要交互一些控制信息,比如:开始传输,结束传输,传输数据的总量,文件名,等等信息,都是可以进行交互的。
蓝色深海20 2021-03-31
  • 打赏
  • 举报
回复
这个结束标志应该怎么写,大佬能不能帮忙把代码给改一下,万分感谢!
qq_39936465 2021-03-31
  • 打赏
  • 举报
回复
引用 楼主 蓝色深海20 的回复:
我跟着教程写了一个简单的文件上传程序,文件上传成功了,可是客户端就是读取不到服务器的回写数据,求大佬帮看看是什么问题。代码如下:
因为你默认的结束标志是文件结束,所以上传文件可以成功,但是上传对话时,服务器一直没有等到结束标志,还在等待中,需要建立对话结束的检测标志
fai_jai 2021-03-31
  • 打赏
  • 举报
回复
打印“测试1”之前加一句 socket.shutdownOutput();

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧