我想发送字符串消息以及图像。我正在设计允许用户共享图像和聊天(字符串)的 android 聊天应用程序,Java Server 位于后端,它监听和广播。我正在阅读几篇文章,但仍然感到困惑。1)我如何发送数据并且在接收服务器时可以知道它的字符串或图像?2)我应该有单独的套接字来监听然后分别广播图像和字符串吗 3)我可以有一个对象可以保存字符串以及字节数组中的图像并将其传递给java服务器吗?请帮助我也很困惑,我应该使用 objectoutputstream/dataoutputstream 来实现它。
3 回答
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 或 1)。然后您可能还需要一个整数(4 个字节)作为长度(数据或图像的长度)。这将允许接收端首先读取这些字节并知道要接收多少字节以及这些字节是代表数据还是图像。
查看 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
}
然后,您可以使用Socket
s、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已准备好被接收。此外,关闭服务器上的对象输入流将在客户端打开相应的输出流时引发异常,反之亦然。Object
Message