如何在同一Java套接字上发送图像和文本?

时间:2011-09-08 16:49:22

标签: java eclipse sockets

我是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);
    }
  }
}

3 个答案:

答案 0 :(得分:3)

如果您同时控制服务器和客户端,那么一种非常简单的方法是为您要发送的不同消息定义类,然后使用对象输出/输入流来完成繁重的操作,即编组。

下面是一些多余的伪代码:

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

答案 1 :(得分:1)

您正在讨论通过套接字发送多种类型的数据。此时,您可能需要重新设计应用程序。您可以发送一个不同的对象(您必须创建自己的类,如下所示),而不是通过套接字发送ImageIcon对象。

public class ImageAndText implements Serializable{
        String text;
        ImageIcon image;
 // and so on...
}
  • 此图片和文字对象可以有一个String属性,代表您的文字和ImageIcon属性,可以替代您的图片。在客户端(使用procesar()方法,阅读ImageAndText类型的对象并获取各个属性并显示它们。

答案 2 :(得分:0)

您可以使用TLV(标签/长度/值)。标记的一个字节,长度的两个或多个字节,具体取决于文本或图像的最大大小,依此类推。