Java客户端/服务器聊天室发送消息作为对象

3
我的目标是创建一个服务器,接收来自ObjectInputStream的Message对象,然后将该Message对象回显到ObjectOutputStream。
客户端写入消息时,会将Message类型对象发送到服务器,然后接收并解码连接到服务器的其他客户端的Message类型对象,将其发送到客户端的GUI中。
Message对象包含字符串和其他字体信息。
我的问题是服务器没有回显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='来自客户端的对象 Exception in thread "main" java.net.SocketException: 连接被重置


你得到了什么输出? - Vimal Bera
当客户端连接到服务器时,我收到以下消息:主线程中的异常:"main" java.lang.ClassNotFoundException: TestObject当我运行客户端时,这是客户端的输出:value=1, id='来自客户端的对象 异常在主线程中:"main" java.net.SocketException: 连接重置 - mmm_robots
2个回答

1

第一件事: TestObject类在您的服务器代码中不可见。这就是为什么它会抛出ClassNotFoundException的原因。

解决方案:将您的TestObject类放入单独的文件中,然后使用import语句导入该类。

第二:尝试在服务器端打印接收到的对象的值。并按照以下方式更改您的客户端代码。

Object received = null;
while(received==null)
{
    received = ois.readObject();
}
System.out.println(received);

我想避免服务器了解TestObject的任何信息。使用Object IO是否可能实现这一点? - mmm_robots
如果不是这样,那么保持服务器尽可能简洁的解决方案是使用一些字节流库吗? - mmm_robots
您可以使用Bytestream lib的read方法。请参考此链接 - Vimal Bera
1
感谢您的时间。 - mmm_robots

0

除了你需要在服务器和客户端中写入后刷新oos流之外,我没有看到任何问题。

oos.flush();

另外,为了使服务器对客户端透明,您可以避免在服务器上进行强制转换(这是您已经在做的),终点应该关注您的客户端中的TestObject


当客户端连接到服务器时,我会收到以下消息: 异常线程中的“main”:java.lang.ClassNotFoundException: TestObject - mmm_robots
抱歉,无法理解您的意思。 - me_digvijay
当我运行客户端时,这是客户端的输出: value=1, id='来自客户端的对象' 主线程中的异常:"java.net.SocketException: 连接重置" - mmm_robots
哦,我错了,你可能需要在从客户端发送消息之前将消息转换为对象。 客户端上的错误“连接重置”是由服务器在读取消息后立即关闭连接造成的。 - me_digvijay
oos.writeObject((Object)to); 像这样吗?我一直尝试着这样做,但没有成功,我的编译器告诉我这是多余的。 - mmm_robots

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接