0

我想发送字符串消息以及图像。我正在设计允许用户共享图像和聊天(字符串)的 android 聊天应用程序,Java Server 位于后端,它监听和广播。我正在阅读几篇文章,但仍然感到困惑。1)我如何发送数据并且在接收服务器时可以知道它的字符串或图像?2)我应该有单独的套接字来监听然后分别广播图像和字符串吗 3)我可以有一个对象可以保存字符串以及字节数组中的图像并将其传递给java服务器吗?请帮助我也很困惑,我应该使用 objectoutputstream/dataoutputstream 来实现它。

4

3 回答 3

2
Keep Seperate Sockets that makes it simpler,or you need syncronisation

1)use objectoutputstream for image thats fastest method of image transfer

2)use dataoutputstream for string

Image Sending code

      File myFile = new File ("d:\\ab.jpg");
      byte [] mybytearray  = new byte [(int)myFile.length()];
      FileInputStream fis = new FileInputStream(myFile);
      BufferedInputStream bis = new BufferedInputStream(fis);
      bis.read(mybytearray,0,mybytearray.length);
      OutputStream os = sock.getOutputStream();
      System.out.println("Sending...");
      os.write(mybytearray,0,mybytearray.length);
      os.flush();
      os.close();

Image receiving code

    int filesize=6022386; // filesize temporary hardcoded
    long start = System.currentTimeMillis();
    int bytesRead;
    int current = 0;

    File f=new File("d:\\ab.jpg");
    f.createNewFile();
    // receive file
    byte [] mybytearray  = new byte [filesize];
    InputStream is = socket.getInputStream();
    FileOutputStream fos = new FileOutputStream(f);
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    bytesRead = is.read(mybytearray,0,mybytearray.length);
    current = bytesRead;
   do {
       bytesRead =
       is.read(mybytearray, current, (mybytearray.length-current));
       if(bytesRead >= 0) current += bytesRead;
    } while(bytesRead > -1);
    count=current;
    Copy=mybytearray.clone();
    bos.write(mybytearray, 0 , current);
    bos.flush();
    long end = System.currentTimeMillis();
    System.out.println(end-start);
    bos.close();
    fos.close();
    Status=true;
于 2013-03-29T18:04:40.053 回答
1

您已经发现了应用层协议的全部原因。套接字本身只是提供发送字节的方法,它们没有说明字节的含义。这就是应用层协议发挥作用的地方。

您可以设计一个协议,首先为图像或数据发送一个类型字节(0 或 1)。然后您可能还需要一个整数(4 个字节)作为长度(数据或图像的长度)。这将允许接收端首先读取这些字节并知道要接收多少字节以及这些字节是代表数据还是图像。

于 2013-03-29T17:30:09.957 回答
0

查看 JavaSerializable接口:http ://docs.oracle.com/javase/6/docs/api/java/io/Serializable.html

总而言之,如果一个类的Serializable所有字段也是Serializable. 所以:

public class Message<Img_Type> implements Serializable {
    protected String mText = null;
    protected <Img_Type> mImage = null;    // Img_Type must implement Serializable

    // ... constructor(s), get/set methods        
}

然后,您可以使用Sockets、ObjectInputStream和来写入和读取这些对象ObjectOutputStream。阅读(一)Message

    Socket socket;    // initialize your socket
    Message msg;
    try {
        InputStream is = socket.getInputStream();
        ObjectInputStream ois = new ObjectInputStream(is);
        Message msg = (Message) ois.readObject();
        ois.close();
    } catch (ClassNotFoundException e) {
        // handle exception
    }
    // handle message

Message可以使用类似的方式编写 a ObjectOutputStream。在此示例中,您可以检查Message字段null以查看其包含的内容。

需要注意的一件事是,for 的构造函数在从输入流中ObjectInputStream读取 a 的标头之前不会返回,例如 a已准备好被接收。此外,关闭服务器上的对象输入流将在客户端打开相应的输出流时引发异常,反之亦然。ObjectMessage

于 2013-03-29T17:57:34.910 回答