客户端向服务发送数据。服务器收到数据后给客户端反馈。
可是程序运行之后并没有返回数据给客户端,而且程序也没有停下来。
class TcoClient{
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\abs.apk"));
Socket socket = new Socket(InetAddress.getLocalHost(), 10000);
OutputStream os = socket.getOutputStream();
byte[] buf = new byte[1024];
int len;
while ((len = bis.read(buf)) != -1) {
os.write(buf, 0, len);
}
InputStream is = socket.getInputStream();
int backLen = is.read(buf);
System.out.println(new String(buf, 0, backLen));
os.close();
}
}
class TcpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(10000);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\cde.apk"));
byte[] buf = new byte[1024*1024];
int len;
while ((len = is.read(buf)) != -1) {
bos.write(buf, 0, len);
}
OutputStream os = socket.getOutputStream();
os.write("文件传输完成".getBytes());
}
不评论代码的其他问题,仅回答为什么你的代码看上去像是死循环:因为服务端一直再接收客户端传送来的数据,一直读到-1个字节(或者说EOF)才会跳出那个while循环,但是除非你close客户端的socket.close(), 服务端是不会收到EOF的,所以你的服务端代码一直在等待客户端传数据过来。否则不会发送传输完毕的回答。
与此同时,因为服务端代码不发送传输完毕的回答,客户端也在苦等服务端的响应,直到双方某一方超时(你没设置任何一端超时)。
改进方案:
我认为你这是希望通过这一个socket做双向通信,因此你需要设置一套自己的协议,比如先发4个字节过去,告诉服务端我这个文件的长度是多少,接下来服务端接收了这么多字节就表示文件接收完毕,返回响应消息。
除非你是想学习socket通信,否则为了实现文件传输,建议使用成熟的协议和方案,比如ftp或者http之类的。
另外我很好奇 Socket socket = new Socket(InetAddress.getLocalHost(), 10000); 我怎么把服务端关闭了,它仍然可以连接成功?不抛connection refuse异常。。。