0

我编写了一个基本的 java 服务器端聊天应用程序。目前我正在使用DataInputStreamreadUTF()它只是传输文本。

任何人都知道将图像与(或不与)文本一起发送的最佳方法?

我对 java 还很陌生,它是包,所以任何建议都是好的:)

4

2 回答 2

2

要写入图像,请使用 ImageIO:

BufferedImage img = ImageIO.read(new File("c:\test\img.png"));
ImageIO.write(img,"png", <out writer variable>);

对于读取图像,使用 ImageIO:

BufferedImage img = ImageIO.read(ImageIO.createImageInputStream(<socket input stream variable>));

注意: readUTF不起作用,因为它用于读取 UTF 字节

于 2013-04-30T00:46:48.800 回答
1

我只做过几次,而且没有正式场合。话虽如此,这很可能不是通过任何套接字流执行图像传输的正确方法,因此如果有人对正确的方法有任何见解,请分享。

在您来回发送的所有数据中,留出 128 个字节作为标头,该标头将包含有关您发送的数据中内容的信息。

假设您有客户端 A,他们想向他们的朋友客户端 B 发送图像。客户端 A 发送一个包含消息的数据包:“FILE 45000 myimage.bmp”(您可能应该找到一种发送标头的更好方法,而不是从FILE,类似于发送图像的数字 2 和发送消息的数字 1)。发送文件大小、文件名,稍后您可以获得技术信息并发送校验和。

然后客户端 A 将开始流式传输所有标题信息相同的数据。然后客户端 B 将接收数据并在数据进入时开始对其进行组装。如果通过的消息不是以“文件”开头的,您可以确定如何处理该数据包(可能是文本消息或其他内容)。

我要放在这里的主要是伪代码,因为我真的不知道你的代码是什么样的,但它可能看起来像这样:

DataInputStream in = new DataInputStream(/*your sockets inputstream*/);
    FileOutputStream out = new FileOutputStream(new File("c:\\myfile"));

    int numRead = 0;
    byte[] bytes = new byte[1024];
    while((numRead = in.read(bytes)) != -1) {
        String header = new String(bytes, 0, 128);
        if(header.startsWith("TEXT")) {
            // send text to your chat box
            String content = new String(bytes, 128, bytes.length-128);
        } else if(header.startsWith("FILE")) {
            // write the remainder of the file to the harddrive
            out.write(bytes, 128, bytes.length-128);
        }
    }

这是所有可以玩弄的东西,可以犯错误和修复。刚接触 java 就是反复试验,如果您还有任何问题,请发布,或者如果有人有任何指向要发送的正确标题或要输入的分隔符的链接,请链接!

于 2013-04-30T00:53:37.500 回答