我想发送字符串消息以及images.i设计Android聊天应用程序允许用户共享图像和聊天(字符串) Java服务器是在后台监听和广播。 我正在阅读几篇文章,但仍然困惑。 1)我如何发送数据,而在接收服务器可以知道它的字符串或图像? 2)我应该有单独的套接字用于侦听,然后分别播放图像和字符串 3)我可以有一个对象,它可以保存字符串以及字节数组中的图像并传递给java服务器? 请帮忙 我也很困惑,应该使用objectoutputstream/dataoutputstream来实现它。java TCP服务器接受图像以及来自android客户端的字符串
回答
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;
Hey.thanks的片段和建议,但由于我的广播服务器,处理两个插座会很容易吗?例如客户端只是交换消息(字符串),并且他没有打开图像套接字。突然如果其他人想分享图像,他发送到服务器和服务器已广播all.in在这种情况下,服务器将不知道abt前面只交换测试消息的家伙 –
hey.can我使用JSON? –
这就是你的知识,JSON,KSOAP等。 –
您已经发现了应用层协议的全部原因。套接字本身只是提供发送字节的方式,他们对字节的含义没有任何说明。这就是应用层协议发挥作用的地方。
您可以设计一个首先为图像或数据发送类型字节(0或1)的协议。那么你可能还需要一个整数(4字节)的长度(数据或图像的长度)。这将允许接收方首先读取那些字节,并知道要接收多少字节以及这些字节是表示数据还是图像。
退房了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,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
的标头之前不会返回。准备好接收Message
。此外,关闭服务器上的对象输入流将在客户端上打开相应的输出流时抛出异常,反之亦然。
感谢您的答复和解释。我知道可序列化的类,但我对
我没有太多的使用图像的经验,所以我把它作为一个通用类型。如果你想的话,你可以删除所有
- 1. TCP - Android客户端+ Java服务器
- 2. JAVA TCP客户端 - 服务器连接
- 3. 服务器只接收来自客户端的空字符串?
- 4. TCP Java服务器,Python客户端字符串不等于
- 5. 来自客户端的Android tcp连接
- 6. WCF服务接受来自Java客户端的POST问题
- 7. java的TCP客户端和服务器
- 8. Android的TCP套接字客户端/服务器实现
- 9. Android tcp客户端服务不连接
- 10. 接受客户端的Java服务器套接字
- 11. Android的TCP服务器/客户端
- 12. 带有PHP客户端的Java TCP套接字服务器?
- 13. Java TCP客户端服务器挂起?
- 14. 客户端服务器 - (TCP)
- 15. TCP客户端服务器
- 16. TCP服务器不接受来自()
- 17. C#套接字TCP客户端/服务
- 18. android客户端服务器UDP或TCP?
- 19. Android TCP客户端/服务器崩溃
- 20. Android TCP服务器客户端
- 21. TCP客户端未能发送字符串到服务器
- 22. PHP - C#TCP客户端/服务器如何发送字符串?
- 23. Java TCP服务器无法接收来自多个客户端的消息
- 24. 套接字java客户端服务器
- 25. Java套接字客户端/服务器
- 26. 无声字符串的秘密(服务器接收来自Android客户端的空字符串)
- 27. Java服务器将只接受来自我的客户端的一个条目
- 28. 服务器接受许多客户端
- 29. Java多客户端服务器不接收来自客户端的消息?
- 30. Python服务器只接收来自Java客户端的一个字符?
我终于设法做到这一点,通过发送每个消息作为一个Java对象,每个对象都有一个字段,说明是否其文本或图像或任何。并将图像转换为数组并将其作为我的消息对象的一部分发送出去 –