【问题标题】:Sending picture over a socket (Java PC - Android)通过套接字发送图片(Java PC - Android)
【发布时间】:2013-02-01 16:31:54
【问题描述】:

我是 Java 新手,所以我需要帮助。我正在编写一个应用程序,它将 onClick 向服务器发送一个字符串,服务器需要使用套接字返回一个图像。所以我的客户端是Android,服务器端是PC - java。 我认为我的服务器端没问题(因为他打印出了所有 system.out.print 命令)但我的客户端不好。请告诉我我的错误在哪里?谢谢!

这是我的服务器(PC)端的代码(套接字通过函数参数传递):

    try {
        dataInputStream = new DataInputStream(socket.getInputStream());
        poruka = "" + dataInputStream.readUTF();
        System.out.print(poruka);

        int bytecount = 2048;
        byte[] buf = new byte[bytecount];

        OutputStream OUT = socket.getOutputStream();
        BufferedOutputStream BuffOUT = new BufferedOutputStream(OUT, bytecount);
        FileInputStream in = new FileInputStream("screenShot.jpg");

        int i = 0;
        while ((i = in.read(buf, 0, bytecount)) != -1) {
            BuffOUT.write(buf, 0, i);
            System.out.print("check" + buf[0]);
            BuffOUT.flush();
        }


        in.close();
        BuffOUT.close();
        System.out.print("over");

    } catch (IOException e) {
        e.printStackTrace();
    }finally{
        try {
            socket.close();
            dataInputStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

这是我的客户端(Android)端:

            Socket socket = null;
            DataOutputStream dataOutputStream = null;

            try {
                socket = new Socket(IPadresa, 8888);
                dataOutputStream = new DataOutputStream(socket.getOutputStream());
                slanje = "hy string";
                dataOutputStream.writeUTF(slanje);

                FileOutputStream outToFile = new FileOutputStream("slika.jpg");

                int bytecount = 2048;
                byte[] buf = new byte[bytecount];


                InputStream IN = socket.getInputStream();
                BufferedInputStream BuffIN = new BufferedInputStream(IN, bytecount)

                int i = 0;
                int filelength = 0;       
                while((i = BuffIN.read(buf, 0, bytecount)) != -1) {
                    filelength += i;
                    outToFile.write(buf, 0, i);
                    outToFile.flush();
                }


                IN.close();
                BuffIN.close();




                dataOutputStream.close();
                socket.close();

            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

更多信息: 在服务器端,我可以看到从客户端发送的字符串。我有那个 System.out.print("over");每次我将字符串发送到服务器时都会打印命令。我也有 System.out.print("check" + buf[0]);多次从服务器打印出来。所以这就是为什么我认为客户端有问题。

而且我的客户端没有抛出任何异常......但我注意到客户端从未通过 while 循环。它卡在那里。

【问题讨论】:

  • 请告诉我们是什么让您认为客户端存在问题。发生什么了?有什么例外吗?客户端和服务器端的输出是什么?
  • 我编辑了我的问题,以便您阅读是什么让我认为客户端存在问题。感谢您的帮助!

标签: java android image sockets


【解决方案1】:

我不知道您所说的“我的客户端不好”是什么意思,而且我看不出有任何明显的错误会导致它完全停止工作。如果您能告诉我们发生了什么,那将有所帮助。

同时,您提供的代码存在一些问题:

  1. 您使用“BuffIn”、“IN”、“IPaddresa”等名称违反了行业公认的编码标准。 Java 中的所有变量名都必须以小写字母开头。

    如果您在私人代码中执行此操作,那是您的业务。但是如果你要向其他人展示你的 Java 代码,你应该遵守标准。 (并且在 SO 上发布您的代码正在向其他人展示它......)

  2. 由于您总是试图读取整个缓冲区的数据,请将in.read(buf, 0, bytecount) 替换为in.read(buf)

  3. 如果您只想对它进行 large readwrite 调用,则使用 BufferedInputStreamBufferedOutputStream 没有任何价值。如果您告诉流使用与您正在读取/写入的byte[] 相同大小的缓冲区,则更是如此。

  4. 您的客户端和服务器端代码都可能泄漏文件描述符。在服务器端它可能会泄漏in。在客户端,任何或所有流的文件描述符都可能泄漏。

【讨论】:

  • 我编辑了我的问题,以便您阅读是什么让我认为客户端存在问题。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2015-03-26
  • 2013-05-12
  • 2013-12-31
  • 2020-07-17
相关资源
最近更新 更多