最近练习网络编程,写了一个服务器和客户端,可以接收客户端上传的图片,然后通过服务器下载到指定目录下,功能大致完成。
但是服务器端向客户端返回消息时就出现问题了,我让服务器接收完图片后告诉客户端:服务器收到,然后客户端打印这句话,就这个小功能加入后,图片始终上传不完,客户端也结束不了进程,想请教一下是哪里出了问题,为什么加上很简单的一个数据传递就不能实现功能了。
服务器端
package com.zb.test5;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Socket1 {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8889);
while (true){
Socket socket = ss.accept();
new Thread(() -> {
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("e:\\11\\upload\\"+System.currentTimeMillis()+".jpg"));
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
int length;
while ((length=is.read(buffer))!=-1){
bos.write(buffer,0,length);
bos.flush();
}
OutputStream outputStream = socket.getOutputStream();
outputStream.write("服务器收到".getBytes());
outputStream.flush();
bos.close();
outputStream.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
}
客户端
package com.zb.test5;
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
//Socket socket = new Socket("169.254.77.174",8888);
Socket socket = new Socket("localhost",8889);
InputStream inputStream = socket.getInputStream();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("e:\\box.jpg"));
byte[] bytes = new byte[1024];
int length;
while ((length=bufferedInputStream.read(bytes))!=-1){
bufferedOutputStream.write(bytes,0,length);
bufferedOutputStream.flush();
}
int i = inputStream.read(bytes);
System.out.println(new String(bytes,0,i));
inputStream.close();
bufferedOutputStream.close();
bufferedInputStream.close();
socket.close();
}
}
这是服务器和客户端的控制台
指定目录中已经创建了文件,虽然选中之后左下角显示0字节,但是看属性96.4kb是已经下载完成的,左边是正常下载完成的样子
想请教到底是为什么啊,哪里搞错了
不知道你这个问题是否已经解决, 如果还没有解决的话:小编在GitHub上搭建了一个仓库(主要是收集了最新的一些互联网大厂的面试真题。
主要涵盖以下内容,贪多嚼不烂:JVM、并发编程、Spring源码、分布式架构、设计模式、算法、数据结构等。
根据提供的信息,问题出现在添加了数据传递后,无法实现接收客户端上传图片并下载到指定目录的功能。同时,服务器无法正确地向客户端发送接收成功信息。可能的原因包括服务器和/或客户端代码的逻辑问题,网络通信问题等。以下是可能的解决方案:
检查服务器和客户端代码,查找逻辑错误。特别关注处理网络通信的部分,确保数据传递和接收正确。
调试代码并记录日志,以确定程序的瓶颈所在。可以使用log4j或其他记录日志的库,也可以在程序中添加自定义日志记录方法。
使用调试工具,例如Wireshark或Tcpdump,捕获和分析进出服务器和客户端的数据包,检查网络通信是否存在问题。注意防火墙或网络配置可能会影响通信。
如果服务器和客户端在不同的计算机上,请检查是否存在网络配置问题,例如代理、端口、IP地址或网络拓扑等。
重新设计代码,使用多线程等方法,将不同的任务拆分成多个子任务并同时执行,减少程序的瓶颈和延迟。
如果还存在问题,可以向其他开发人员或技术支持团队寻求帮助,或者考虑使用更稳定和可靠的工具和方法来完成任务。如果情况比较紧急,可以联系供应商或出售方请求技术支持。