2013-03-29 12 views
0

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

+0

我终于设法做到这一点,通过发送每个消息作为一个Java对象,每个对象都有一个字段,说明是否其文本或图像或任何。并将图像转换为数组并将其作为我的消息对象的一部分发送出去 –

回答

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; 
+0

Hey.thanks的片段和建议,但由于我的广播服务器,处理两个插座会很容易吗?例如客户端只是交换消息(字符串),并且他没有打开图像套接字。突然如果其他人想分享图像,他发送到服务器和服务器已广播all.in在这种情况下,服务器将不知道abt前面只交换测试消息的家伙 –

+0

hey.can我使用JSON? –

+0

这就是你的知识,JSON,KSOAP等。 –

1

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

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

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   
} 

然后,您可以编写和使用Socket S,ObjectInputStreamObjectOutputStream读取这些对象。读取(一个)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的标头之前不会返回。准备好接收Message。此外,关闭服务器上的对象输入流将在客户端上打开相应的输出流时抛出异常,反之亦然。

+0

感谢您的答复和解释。我知道可序列化的类,但我对感到困惑。我应该有另一类img_type?如果是的话我应该怎么说。我很抱歉,因为这方面不清楚。再次感谢您的时间 –

+0

我没有太多的使用图像的经验,所以我把它作为一个通用类型。如果你想的话,你可以删除所有,并使该字段类似于位图。看看http://developer.android.com/reference/android/graphics/Bitmap.html它看起来不像Bitmap实现可序列化。也许你可以存储'getPixels()'返回的数组? – croyd