Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 使用ObjectInputStream实现套接字-can';不可读取对象_Sockets_Objectinputstream_Objectoutputstream - Fatal编程技术网

Sockets 使用ObjectInputStream实现套接字-can';不可读取对象

Sockets 使用ObjectInputStream实现套接字-can';不可读取对象,sockets,objectinputstream,objectoutputstream,Sockets,Objectinputstream,Objectoutputstream,对于我正在学习的Java类,我需要使用套接字在客户机和服务器之间来回传递数据。虽然我可以通过示例来传递字符串数据,但我需要能够来回传递自定义类对象(即产品)和这些对象的列表。我无法使服务器部件成功读取输入。我试图创建一个简单的代码示例,看看是否有人能找出问题所在。我知道我没有完整的代码,但我甚至无法让服务器读取类正在写入流的对象(在本例中,我编写字符串只是为了让它工作,但需要读/写对象)。这是我的密码。我花了好几个小时来尝试这个,研究别人的问题和答案,但仍然无法让它发挥作用 下面是示例代码: 简

对于我正在学习的Java类,我需要使用套接字在客户机和服务器之间来回传递数据。虽然我可以通过示例来传递字符串数据,但我需要能够来回传递自定义类对象(即产品)和这些对象的列表。我无法使服务器部件成功读取输入。我试图创建一个简单的代码示例,看看是否有人能找出问题所在。我知道我没有完整的代码,但我甚至无法让服务器读取类正在写入流的对象(在本例中,我编写字符串只是为了让它工作,但需要读/写对象)。这是我的密码。我花了好几个小时来尝试这个,研究别人的问题和答案,但仍然无法让它发挥作用

下面是示例代码:

简单服务器:

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

public class simpleServer {

    public static final int PORT_NO = 8888;
    static ObjectInputStream serverReader = null;


    public static void main(String[] args) throws IOException, InterruptedException {

        ServerSocket serverSocket = new ServerSocket(PORT_NO);
        System.out.println("... server is accepting request");
        Object myObject = null;
        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("creating reader");
            ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream());
            serverReader = new ObjectInputStream(socket.getInputStream());
            System.out.println("created reader");
            try {
                System.out.println("try to read");
                myObject = serverReader.readObject();
                System.out.println("read it");
                System.out.println(myObject);
                if (myObject != null) objOut.writeUTF("Got something");
                else objOut.writeUTF("got nothing");
                if ("quit".equals(myObject.toString())) serverSocket.close(); 
            } catch (ClassNotFoundException e1) {
                // TODO Auto-generated catch block
                System.out.println("cath for readobject");
            }
            catch (Exception e) {

                System.out.println("other error");
                System.out.println(e.getMessage());
            }
        }

    }
}
简单客户端:

public static void main(String[] args) {
    Socket socket;
    try {
        socket = new Socket("localhost", ProductDBServer.PORT_NO);
        ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream()); 
        ObjectInputStream  objIn  = new ObjectInputStream(socket.getInputStream()); 

        objOut.writeUTF("loadProductsFromDisk");
        objOut.flush();
        String myString = objIn.toString();
        //System.out.println(myString);
        if (!"quit".equals(objIn.toString().trim())) {
            //System.out.println("reading line 1");
            String line;
            try {
                line = (String)objIn.readObject();
                //System.out.println("line is " + line);
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            objIn.close();
            //System.out.println("result: " + line);
        }

        System.out.println("closing socket");
        socket.close();

    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        System.out.println("Unknownhostexception");
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        System.out.println("ioexception");
        e.printStackTrace();
    } 


}

代码似乎运行到服务器端的某个点,尝试读取我发送的对象,然后消失。有人能看出我做错了什么吗?这似乎是一件很简单的事情,但我似乎无法让它发挥作用。谢谢你的帮助

要将对象写入ObjectOutputStream,需要调用writeObject()

不是writeUTF()

要从ObjectInputStream读取对象,需要调用readObject()

非toString()。

请参见代码中的:

// Simple Client 
objOut.writeUTF("loadProductsFromDisk");           // Line 8
您正在向服务器端发送UTF-8格式的字符串“loadProductsFromDisk”。 因此,为了接收并通过服务器端读取它,您需要以下内容:

String clientReq = serverReader.readUTF();  
其中,
serverReader
是您的
ObjectInputStream
对象

否则,如果希望发送和接收对象,则必须使用
writeObject()
&
readObject()
方法。首先,我想知道为什么在发送字符串的时候,服务器和客户机之间的通信使用ObjectStream!其次,当您发送UTF时,您需要读取UTF,没有对象,只需将服务器中的“myObject=serverReader.readObject();”行更改为“myObject=serverReader.readUTF();”,就是这样。非常感谢。我发送一个字符串部分是为了证明概念,但也因为我必须同时发送字符串和对象。所以这是我第一次发布一个问题。我想证明你回答了我的问题,但我找不到StackOverflow help所说的我应该拥有的选项。可能是你的评论而不是回答-我不确定,但我想表明你确实回答了我的问题。非常感谢。不需要,伙计,我只是很高兴我能帮上忙,不管评论、回答、抽烟。,谢谢你:D,有一个好的应用程序,顺便说一句,你为什么不为每个到服务器的请求运行一个单独的线程,目前的方法是单线程的方式,如果两个客户端尝试连接,第二个客户端必须等到第一个完成谢谢。上面的user251414让我知道如果我执行writeUTF,我需要读取utf(而不是readObject)。我需要能够同时编写字符串和对象,所以我从字符串开始,但无法让它工作。我感谢你的意见!