Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > передать сообщение не строку по сокетам


Автор: марина 12.8.2006, 10:30
 Я хочу создать класс, допустим Message в нем будут несколько полей.(строки, цифры, еще классы)
Как мне его передать и получить по тсп сокетам?
везде примеры только для строк
это класс
Код

public class Message implements IMessage {
   public int gamesituation;//0- проиграл или сдался , 1 - все по прежнему, игра идет
   public Panel panel; //состояние вражеской панельки
}

это открытые входящие и выходящие потоки с сокета
Код

outgoing = new PrintWriter(connection.getOutputStream());
incomming = new InputStreamReader(connection.getInputStream());


Автор: powerOn 12.8.2006, 11:08
Класс который нужно передать должен быть сериализуемым, например:

Код

import java.io.Serializable;

public class TestClass implements Serializable {
    private int i = 0;
    private String str = "";
    
    /** Creates a new instance of TestClass */
    public TestClass() {
    }

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }
}


Код простого Сервера для приема TestClass:
Код

import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public Server() {
    }
    public static void main(String[] args) {
        try {
            int port = 1234;
            ServerSocket srv = new ServerSocket(port);
            
            // Wait for connection from client.
            Socket socket = srv.accept();
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            
            TestClass testClass = (TestClass) ois.readObject();
            System.out.println("i = " + testClass.getI());
            System.out.println("str = " + testClass.getStr());
            ois.close();
        } catch (Exception e) {
        }
    }
}


Код простого клиента, который объект TestClass отправлет серверу:
Код

import java.io.ObjectOutputStream;
import java.net.Socket;

public class Client {
    public Client() {
    }
    public static void main(String[] args) {
        
        try {
            // Create socket
            Socket sock = new Socket("localhost", 1234);
            ObjectOutputStream ous = new ObjectOutputStream(sock.getOutputStream());
            
            TestClass testClass = new TestClass();
            testClass.setI(123);
            testClass.setStr("hello");
            
            ous.writeObject(testClass);
            ous.flush();
            sock.close();
        } catch (Exception e) {
        } 
    }
}


Автор: марина 12.8.2006, 19:02
 А если я пишу игру, и хочу посылать ходы, то мне надо выделить отдельный поток для сети?
как это сделать?можно пример

Автор: LSD 12.8.2006, 19:40
Цитата(марина @  12.8.2006,  20:02 Найти цитируемый пост)
А если я пишу игру, и хочу посылать ходы, то мне надо выделить отдельный поток для сети?

На сервере, да. На клиенте, можно обойтись и основным потоком игрушки, но лучше выделить отдельный поток.
Код
public class TestClass implements Serializable
{
  private int i = 0;
  private String str = "";

  public int getI()
  {
    return i;
  }

  public void setI(int i)
  {
    this.i = i;
  }

  public String getStr()
  {
    return str;
  }

  public void setStr(String str)
  {
    this.str = str;
  }
}

Код
public class NetThread extends Thread
{
  private Socket socket;

  public NetThread(Socket socket)
  {
    this.socket = socket;
  }

  @Override
  public void run()
  {
    try
    {
      ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
      while(true)
      {
        TestClass testClass = (TestClass) ois.readObject();
        System.out.println("i = " + testClass.getI());
        System.out.println("str = " + testClass.getStr());
      }
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
}

Код
public class Server extends Thread
{
  private int port;

  public Server(int port)
  {
    this.port = port;
  }

  public void run()
  {
    try
    {
      ServerSocket srv = new ServerSocket(port);

      while(true)
      {
        Socket socket = srv.accept();
        new NetThread(socket).start();
      }
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }

  public static void main(String[] args)
  {
    new Server(1234).start();
  }
}

Код
public class Client
{
  public static void main(String[] args)
  {
    try
    {
      Socket sock = new Socket("localhost", 1234);
      ObjectOutputStream ous = new ObjectOutputStream(sock.getOutputStream());

      for(int i = 0; i < 10; i++)
      {
        TestClass testClass = new TestClass();
        testClass.setI(123 * i);
        testClass.setStr("Hello!");
        ous.writeObject(testClass);
        ous.flush();
        Thread.sleep(1000);
      }
      sock.close();
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)