3

私の目標は、ObjectInputStream から Message オブジェクトを受け取り、その Message オブジェクトを ObjectOutputStream にエコーするサーバーを作成することです。

メッセージを書き込むと、クライアントは Message タイプ オブジェクトをサーバーに送信し、受信した Message タイプ オブジェクト (およびサーバーに接続されている他のクライアントからの Message タイプ オブジェクト) を受信し、クライアントの GUI にデコードします。

Message オブジェクトには String とその他のフォント情報があります。

私の問題は、サーバーが Message タイプのオブジェクトをエコーバックしないことです。キャスティングが下手な気がしますが、今は色々試しながら釣ってます。

アイデアは、サーバーをクライアントから透過的にすることです-これは可能ですか、つまり、サーバーは TestObject クラスについて何も知りませんか? これを回避する方法はありますか?

サーバーコード:

import java.net.*;
import java.io.*;

public class Server
{
    public SimpleServer() throws IOException, ClassNotFoundException
    {
        ServerSocket ss = new ServerSocket(4000);
        Socket s = ss.accept();

        ObjectInputStream ois = new ObjectInputStream(s.getInputStream());

        ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());

        // the 'echo' functionality of the server
               Object to = null;
        try 
        {
            to = ois.readObject();
        } 
        catch (ClassNotFoundException e)
        {
            System.out.println("broke");
            e.printStackTrace();
        }

        oos.writeObject(to);
        oos.flush();

        // close the connections
        ois.close();
        oos.close();

        s.close();
        ss.close();
    }

    public static void main(String args[]) throws IOException, ClassNotFoundException {
        new SimpleServer();
    }
}

クライアントコード:

import java.net.*;
import java.io.*;

public class Client
{
    public SimpleClient() throws IOException, ClassNotFoundException
    {
        Socket s = new Socket( "localhost", 4000 );

        ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
        ObjectInputStream  ois = new ObjectInputStream( s.getInputStream());

        TestObject to = new TestObject( 1, "object from client" );

        // print object contents
        System.out.println( to );

        oos.writeObject(to);
        oos.flush();
        Object received = ois.readObject();

        // should match original object contents
        System.out.println(received);

        oos.close();
        ois.close();
    }

    public static void main(String args[]) throws IOException, ClassNotFoundException
    {
        new SimpleClient();
    }
}

class TestObject implements Serializable
{
    int value ;
    String id;

    public  TestObject( int v, String s )
    {
        this.value=v;
        this.id=s;
    }

    @Override
    public String toString()
    {
        return  "value=" + value +
                ", id='" + id;
    }
}

お時間をいただきありがとうございます!

編集:これは作成された出力です:

クライアントがサーバーに接続すると、次のメッセージが表示されます: Exception in thread "main" java.lang.ClassNotFoundException: TestObject

そして、これはクライアントを実行したときのクライアント出力です: value=1, id='object from client Exception in thread "main" java.net.SocketException: Connection reset

4

2 に答える 2

0

oosサーバーとクライアントの両方でストリームに書き込んだ後、ストリームをフラッシュする必要があることを除いて、コードに問題はありません。

oos.flush();

また、サーバーをクライアントに対して透過的にするために、サーバーでのキャストを避けることができます(これはすでに行っています)。エンドポイントは、クライアントがどれであるかを心配する必要TestObjectがあります。

于 2013-10-29T05:53:23.183 に答える