我想发送字符串消息以及images.i正在设计安卓聊天应用程序,允许用户共享图像和聊天(字符串) Java Server位于后端,用于侦听和广播。 我正在阅读几篇文章,但仍然感到困惑。 1)我如何发送数据,而在接收服务器时可以知道它的字符串或图像? 2)我应该有单独的插座用于收听,然后分别广播图像和字符串 3)我可以拥有一个对象,它可以保存字符串以及字节数组中的图像并传递给java服务器吗? 请帮忙 我也很困惑,我应该使用objectoutputstream / dataoutputstream来实现它。
答案 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
}
然后,您可以使用Socket
,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
以类似的方式编写ObjectOutputStream
。在此示例中,您可以针对Message
检查null
字段,以查看其中包含的内容。
要注意的一件事是ObjectInputStream
的构造函数在从输入流中读取Object
的标题之前不会返回,例如a Message
已准备好接收。此外,关闭服务器上的对象输入流将在客户端上抛出异常,如果它们打开了相应的输出流,反之亦然。