java TCP服务器接受图像以及来自android客户端的字符串

时间:2013-03-29 17:24:23

标签: java android sockets tcp

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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

查看Java Serializable界面: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        
}

然后,您可以使用SocketObjectInputStreamObjectOutputStream来编写和阅读这些对象。阅读(一)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以类似的方式编写ObjectOutputStream。在此示例中,您可以针对Message检查null字段,以查看其中包含的内容。

要注意的一件事是ObjectInputStream的构造函数在从输入流中读取Object的标题之前不会返回,例如a Message已准备好接收。此外,关闭服务器上的对象输入流将在客户端上抛出异常,如果它们打开了相应的输出流,反之亦然。