Как отправить изображения и текст в один и тот же сокет Java? - PullRequest
3 голосов
/ 08 сентября 2011

Я новичок в 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 ]

3 голосов
/ 08 сентября 2011

Если у вас есть контроль над сервером и клиентом, то очень простым способом было бы определить классы для различных сообщений, которые вы хотите отправить, и затем использовать потоки вывода / ввода объекта для выполнения тяжелой работы, или маршалинг.

Вот какой-то нехитрый псевдокод:

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 голос
/ 08 сентября 2011

Вы говорите об отправке нескольких типов данных через сокет. На этом этапе вам, возможно, придется перепроектировать ваше приложение. Вместо отправки ImageIcon объекта через сокет вы можете отправить другой объект (вам нужно будет создать свой собственный класс, как показано ниже)

public class ImageAndText implements Serializable{
        String text;
        ImageIcon image;
 // and so on...
}
  • Этот объект изображения и текста может иметь атрибут String, представляющий ваш текст, и атрибут ImageIcon, который представляет ваше изображение. На стороне клиента (в вашем методе procesar() прочитайте объект типа ImageAndText, получите отдельные атрибуты и отобразите их.
0 голосов
/ 08 сентября 2011

Вы можете использовать TLV (тег / длина / значение).Один байт для тега, два или более байта для длины, в зависимости от максимального размера текста или изображения и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...