0

1台のサーバーと1台のクライアント間で簡単な転送を作成しようとしています。クライアントからサーバーにオブジェクトを送信しようとしています。私は自分のコードを何度もチェックしましたが、なぜtが機能しないのか本当にわかりません。また、NetBeansで2つの別々のプロジェクトを作成したことを付け加えたいと思います。1つはクライアント用、もう1つはサーバー用です。コードは次のとおりです。

クライアント:

package client;
import java.net.*;
import java.io.*;
import java.util.Scanner;
import java.io.Serializable;

class Object implements Serializable {  
    String one;
    String two;

    public Object(String one, String two){
        this.one = one;
        this.two = two;
    } 

    @Override
    public String toString(){
        return "\nOne: " + one +"\nTwo: " + two;
    }            

}


public class Client {  

    public static void main(String[] args){    

        try {
            Object obj= new Object ("Something", "Else");

            Socket sock = new Socket("127.0.0.1", 1111);

            ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());  
            System.out.println("Connecting to "+ sock.getInetAddress()+ " and port "+sock.getPort());

            System.out.println("Local Address :"+sock.getLocalAddress()+" Port:"+sock.getLocalPort());

            oos.writeObject(obj);
            oos.flush();
            oos.close();
            sock.close();
            System.out.println("Connection Closing...");

        } catch (Exception ex){
            System.out.println("No Conenction");
        } 
    } 
}

サーバ:

<!-- language: lang-java -->


package server;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.*;
import java.io.*;


class Object implements Serializable {  
    String one;
    String two;

    public Object(String one, String two){
        this.one = one;
        this.two = two;
    } 

    @Override
    public String toString(){
        return "\nOne: " + one +"\nTwo: " + two;
    }            

}

public class Server {
    public static void main(String[] args){
        try{
            ServerSocket server = new ServerSocket(1111,10);

            System.out.println("Waiting Incoming Connection...");

            System.out.println("Local Address :"+server.getInetAddress()+" Port:"+server.getLocalPort());

            Socket sock = server.accept();
            ObjectInputStream ois = new ObjectInputStream(sock.getInputStream());               

            Object ob=new Object ("Once", "Upon"); //for test
            Object obj2= null;
            try{
                obj2 = (Object )ois.readObject();
                System.out.println(obj2);

            }catch (Exception ex){
                 System.out.println("nothing...");
            }
            System.out.println(ob); 
            ois.close();

        }catch (Exception ex){
            System.out.println("Error during I/O");
            ex.getMessage();
            ex.printStackTrace();
        } 
    } 
} 

コードは機能しますが、オブジェクトが送信されることはありません=/。例外として「nothing..」というメッセージが表示されます。単純なメッセージBufferedReader()、BufferedWritter()ではメッセージを交換するため、接続は機能します。問題はオブジェクトにあります...。

4

2 に答える 2

6

1)「何らかの例外がスローされた」とだけ言ってはいけません。どの例外がスローされたか、どこでスローされたかを出力します ( e.printStackTrace())。

2) おそらく、サーバーとクライアントの両方で同じクラスを使用する必要があります。つまり、同じパッケージでも ( client.Object) は ( ) と同じではありませんserver.Object。おそらくあなたはClassCastException) を得ています。

3) API からのクラスの名前を使用してクラスに名前を付けないでくださいjava.langどんな名前よりも優れていObjectます。

更新: いくつかの実装のヒント

速くて汚い。server.Object名前を に変更しますserver.MyServer。インポートしclient.Objectます。変数obj2を aにしclient.Objectます。問題は、サーバーを実行するには、クラスパスにクライアント コードが必要になることです。

より精巧に。mytest.Bean送信するオブジェクトの定義を使用して、3 番目のクラス (たとえば ) を作成します。このようなクラスをクライアント コードとサーバー コードの両方で使用します (クラスパスに追加することを忘れないでください)。

最終的に、実際のアプリケーションができたら、共有データをライブラリにして、サーバー アプリケーションとクライアント アプリケーションの両方にインポートします。

于 2013-03-14T22:39:26.727 に答える
0

クラスごとにプロジェクトを作成するのではなく、すべてのクラスを同じプロジェクトに入れます。

実際、これを行う最も簡単な方法は、おそらく 1 つのクラスを使用することです。Objectクラスの名前をより意味のある名前に変更します(どうMyNetworkTypeですか?)。コマンドライン パラメータとして「client」または「server」を受け入れるメソッドがMyNetworkType必要です。main「クライアント」を取得clientした場合は、指定したコードを含むメソッドを実行しClient.main()ます。「サーバー」を取得した場合は、指定したコードを含むメソッドを実行しServer.main()ます。

クラスは次のようになります。

class MyNetworkType implements Serializable {

    //
    // Data here
    //

    public MyNetworkType() {
        // initialize your data
    }

    public static void runClient() {
        // Copy the code from Client.main() here
    }

    public static void runServer() {
        // Copy the code from Server.main() here
    }

    public static void main(String[] args) {
        if( args[0].equals("client") ) {
            MyNetworkType.runClient();
        }
        else if( args[0].equals("server") ){
            MyNetworkType.runServer();
        }
    }
}

私は Eclipse で (もちろんコマンドラインでも) コマンドライン パラメータを渡す方法を知っていますが、NetBeans でそれを理解するのはあなた自身です。

これは良い設計ではないことに注意してください。実際には、クライアントとサーバーを別々のクラスにする必要があることは間違いありません (ただし、必ずしもそれらを別々のプロジェクトに配置する必要はありません)。しかし、あなたが探しているのは非常に基本的な例であり、単一のクラスよりも単純なものは何でしょう?

これが役立つことを願っています。

于 2013-03-14T23:31:10.887 に答える