0

私が取っている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();
    } 


}

コードは、送信したオブジェクトを読み取ろうとするサーバー側のポイントまで実行され、その後終了するように見えます。誰かが私が間違っていることを見ることができますか? これはとても簡単なことのように思えますが、それでもうまくいかないようです。助けてくれてありがとう!

4

2 に答える 2

0

オブジェクトを ObjectOutputStream に書き込むには、writeObject() を呼び出す必要があります。

writeUTF() ではありません。

ObjectInputStream からオブジェクトを読み取るには、readObject() を呼び出す必要があります。

toString() ではありません。

于 2013-06-30T00:46:23.760 に答える
0

あなたのコードで見てください:

// Simple Client 
objOut.writeUTF("loadProductsFromDisk");           // Line 8

文字列"loadProductsFromDisk"を UTF-8 形式でサーバー側に送信しています。したがって、それを受信して​​サーバー側で読み取るには、次のようなものが必要です。

String clientReq = serverReader.readUTF();  

あなたのオブジェクトはどこにserverReaderありますか。ObjectInputStream

それ以外の場合、オブジェクトを送受信する場合は、 それぞれwriteObject()&readObject()メソッドを使用する必要があります。

于 2021-04-07T06:04:16.347 に答える