如何在同一个Java套接字上发送图像和文本?
问题描述:
我是java新手,有点卡在我的媒体控制项目上。我需要做的是将图像和文本发送到客户端应用程序。我找到了一些接收图像并显示它的示例代码(下面列出)。这工作得很好,但我需要有一种将图像和文本发送到相同套接字连接的方式。如何在同一个Java套接字上发送图像和文本?
它的存在决定它是什么类型的数据的一种方式?如果它是图像,我希望它可以显示它,如果是文本,则显示msgbox。
我应该有两个插槽,一个用于图像,另一个用于文本?
不幸的是在示例代码中的变量名是不是英语,这使得它有点难以遵循:
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Cliente extends JFrame {
JTextField tf;
Lienzo lienzo;
Socket con;
ObjectOutputStream salida;
ObectInputStream entrada;
public Cliente(){
super("Cliente");
Container c = getContentPane();
tf = new JTextField(10);
lienzo = new Lienzo();
c.add(lienzo);
pack();
setSize(100,100);
setVisible(true);
}
void ejecutar(){
try{
con = new Socket("127.0.0.1",5700);
salida = new ObjectOutputStream(con.getOutputStream());
salida.flush();
entrada = new ObjectInputStream(con.getInputStream());
procesar();
}
catch(IOException e){}
}
void procesar() throws IOException {
try{
while(true){
ImageIcon img = (ImageIcon) entrada.readObject();
escribir(img);
}
}catch(ClassNotFoundException e){}
}
void escribir(final ImageIcon img){
SwingUtilities.invokeLater(
new Runnable(){
public void run(){
lienzo.pinta(img);
}
}
);
}
public static void main(String args[]){
Cliente cl = new Cliente();
cl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
cl.ejecutar();
}
class Lienzo extends JPanel{
ImageIcon img = null ;
public Lienzo(){
}
public void pinta(ImageIcon img){
this.img = img;
repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
if(img!=null)
img.paintIcon(this,g,10,10);
}
}
}
答
你是在谈论跨越套接字发送多种类型的数据。此时,您可能不得不重新设计您的应用程序。相反,通过你可以发送不同的对象的套接字发送ImageIcon
对象(你必须创建自己的类象下面)
public class ImageAndText implements Serializable{
String text;
ImageIcon image;
// and so on...
}
- 该图像和文本对象可以有一个
String
属性,代表你的文字和ImageIcon
属性,represants您的图像。在客户端(在你的procesar()
方法,阅读ImageAndText
类型的对象并获取个人属性和显示。
答
如果你有服务器和客户端的控制,然后一个非常简单的方法是定义类你想不同的消息发送,然后使用对象输出/输入流做繁重,又名编组
下面有一些空泛的伪代码:
class Message<T extends Serializable> implements Serializable {
private T payload;
public Message() {
super();
}
public Message(T data) {
super();
setPayload(data);
}
public T getPayload() {
return payload;
}
public void setPayload(T aPayload) {
payload = aPayload;
}
}
在服务器:
ObjectOutputStream oos = new ObjectOutputStream(...);
oos.writeObject(new Message<String>("Hello World"));
在客户机:
ObjectInputStream ois = new ObjectInputStream(...);
Message<?> msg = (Message<?>) ois.readObject();
if(msg.getPayload() instanceof String) // do one thing
else if(msg.getPayload() instanceof Image) // do some other thing
答
您可以使用TLV(标签/长度/值)。标签的一个字节,长度的两个或多个字节,取决于文本或图像的最大尺寸等等。