2013-04-30 70 views
0

我写了一个基本的java服务器端聊天应用程序。 目前我使用DataInputStreamreadUTF(),它只是传输文本。Java,通过输入/输出流发送数据

任何人都知道发送图像旁边(或不旁边)文字的最佳方式?

我是相当新的Java和它的软件包,任何建议都很好:)

回答

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字节

+0

这是完美的谢谢! – JamesB123 2013-04-30 08:47:59

1

我只做过几次而没有正式设置。据说这很可能是而不是通过任何套接字流执行图像传输的正确方法,所以如果任何人有任何洞察正确的方式做到这一点,请分享。

在所有发送来回的数据中,如果为一个标题指定了128个字节,则此标题将包含有关您发送的数据内容的信息。

假设您有客户端A,并且他们想要将图像发送给他们的朋友客户端B.客户端a通过发送包含消息的数据包:“FILE 45000 myimage.bmp”(您应该找到更好的方式发送头部比以FILE开头,类似于发送图像的数字2和发送消息的数字1)。发送文件大小,文件的名称,以后可以获得技术并发送校验和。

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

什么IM打算把这里大多是伪代码,因为我真的不知道你的代码是什么样子,但它可能是这个样子:

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新手全是关于试验和错误的,如果你有任何问题请发帖,或者如果有人有任何正确的标题发送或分隔符链接请链接!

+0

喜欢这个答案,搞砸了一下,不是工作太糟糕! – JamesB123 2013-04-30 08:48:55

+0

是的,我用这种方法从朋友的计算机发送一个10GB文件到不久以前。 Theres很多修补它,使事情运作良好。我很高兴你发现它有用= D – 2013-04-30 15:13:15