关于#java#的问题:写了一个服务器和客户端,可以接收客户端上传的图片,然后通过服务器下载到指定目录下,但是加上一个数据传递后功能实现不了了

最近练习网络编程,写了一个服务器和客户端,可以接收客户端上传的图片,然后通过服务器下载到指定目录下,功能大致完成。

但是服务器端向客户端返回消息时就出现问题了,我让服务器接收完图片后告诉客户端:服务器收到,然后客户端打印这句话,就这个小功能加入后,图片始终上传不完,客户端也结束不了进程,想请教一下是哪里出了问题,为什么加上很简单的一个数据传递就不能实现功能了。

服务器端

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();
    }
}

这是服务器和客户端的控制台

img

img

指定目录中已经创建了文件,虽然选中之后左下角显示0字节,但是看属性96.4kb是已经下载完成的,左边是正常下载完成的样子

img

想请教到底是为什么啊,哪里搞错了

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7680453
  • 除此之外, 这篇博客: 2020年总结:Java999道高频真题面试宝典+一个月Java核心技术突击,稳步大厂中的 金秋七月,转眼间20年已过半,你是否还在感叹时间的流逝,这半年你是否达到了你年初定的目标。虽年初疫情肆虐,打乱了最初制定的目标,但这并不能代表什么,原定招聘旺季金三银四硬生生拖后了一个月,而今年企业招聘要求也是更加的严格,对于低学历,以及技术实力不过关的更是雪上加霜。也是由于种种缘由,从三月开始就一直有粉丝私信要博主整理一些干货来帮助他们提升下自己,为了响应粉丝要求,特地花了三个月时间进行收集整理,搭好了一个全新的知识圈。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    小编在GitHub上搭建了一个仓库(主要是收集了最新的一些互联网大厂的面试真题。

    主要涵盖以下内容,贪多嚼不烂:JVM、并发编程、Spring源码、分布式架构、设计模式、算法、数据结构等。

  • 以下回答来自chatgpt:

    根据提供的信息,问题出现在添加了数据传递后,无法实现接收客户端上传图片并下载到指定目录的功能。同时,服务器无法正确地向客户端发送接收成功信息。可能的原因包括服务器和/或客户端代码的逻辑问题,网络通信问题等。以下是可能的解决方案:

    1. 检查服务器和客户端代码,查找逻辑错误。特别关注处理网络通信的部分,确保数据传递和接收正确。

    2. 调试代码并记录日志,以确定程序的瓶颈所在。可以使用log4j或其他记录日志的库,也可以在程序中添加自定义日志记录方法。

    3. 使用调试工具,例如Wireshark或Tcpdump,捕获和分析进出服务器和客户端的数据包,检查网络通信是否存在问题。注意防火墙或网络配置可能会影响通信。

    4. 如果服务器和客户端在不同的计算机上,请检查是否存在网络配置问题,例如代理、端口、IP地址或网络拓扑等。

    5. 重新设计代码,使用多线程等方法,将不同的任务拆分成多个子任务并同时执行,减少程序的瓶颈和延迟。

    6. 如果还存在问题,可以向其他开发人员或技术支持团队寻求帮助,或者考虑使用更稳定和可靠的工具和方法来完成任务。如果情况比较紧急,可以联系供应商或出售方请求技术支持。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^