通过套接字传输Java对象,字节[]

通过套接字传输Java对象,字节[],java,sockets,byte,Java,Sockets,Byte,你能看一下这个吗 这是我的客户: try { Socket socket = new Socket("127.0.0.1", 3000); OutputStream out = socket.getOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStr

你能看一下这个吗

这是我的客户:

try {
        Socket socket = new Socket("127.0.0.1", 3000);
        OutputStream out = socket.getOutputStream();

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(mp3data);
        oos.close();

        byte[] bytes = baos.toByteArray();
        out.write(bytes);
        } 
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
这是我的服务器:

int port = 3000;
        try {
        ServerSocket clientConnect = new ServerSocket(port);
        System.out.println("SimpleServer running on port" + port);
        Socket clientSock = clientConnect.accept();
        InputStream is = clientSock.getInputStream();


    byte[] buffer = new byte[1024];
    int read = is.read(buffer);

    ObjectInputStream ois = new ObjectInputStream(is);
    MP3[] songs = (MP3[])ois.readObject();  

    clientSock.close();

    // HTML erzeugen
    Website site = new Website("index2.html",songs);

    } catch (Exception e) {
    System.out.println (e);
    }

这不管用。我没有得到任何异常,但是没有调用网站构造函数。

您假设整个字节数组只在一次调用
read()
中读取,长度正好为1024字节。事实并非如此(除非你非常幸运)。此外,ObjectInputStream正在包装您已经从中读取构成消息的字节(或部分字节)的InputStream。而且,发送方写入的字节也不会刷新

不要忽略调用is.read()的结果:它告诉您实际读取了多少字节。直到它不是-1,你应该继续阅读,在一个循环中

阅读上的Java教程

也就是说,你让事情变得困难了。为什么不直接将对象写入套接字输出流,并直接从另一端的套接字输入流读取对象?

int-port=3000;
int port = 3000;
        try {
        ServerSocket clientConnect = new ServerSocket(port);
        System.out.println("SimpleServer running on port" + port);
        Socket clientSock = clientConnect.accept();
        InputStream is = clientSock.getInputStream();

        byte[] buffer = new byte[1024];

        for (int i = 0; i < buffer.length; i++) {
          int b = is.read();
          if (b  ==-1) break;
          buffer[i] = (byte) b;
        }

        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(buffer));
        MP3[] songs = (MP3[])ois.readObject();;
        ois.close();

        clientSock.close();
试一试{ ServerSocket客户端连接=新的ServerSocket(端口); System.out.println(“在端口上运行的SimpleServer”+端口); Socket clientSock=clientConnect.accept(); InputStream is=clientSock.getInputStream(); 字节[]缓冲区=新字节[1024]; for(int i=0;i
您可能应该在
out.write()之后执行
out.flush()
在客户端。另外,在服务器端,您定义了一个大小为1024字节的缓冲区,我怀疑它是否能够接收您希望它接收的内容,除非我弄错了……这是一个更好的提问方式,而不是通过tearrayoutputstream向
写入,直接向您的输出写入但是这是不必要的,可能会导致内存问题。请删除
int read=is.read(buffer);
,因为这将读取并丢弃对象的开头。我明天会修复它。谢谢你的回答,也许我还有另一个问题。好的,我已经这样做了,但我认为某个地方有另一个语法错误。