0

我正在尝试在一台服务器和一台客户端之间创建一个简单的传输。我正在尝试将对象从客户端发送到服务器。我已经检查了我的代码很多次了,我真的不知道为什么 t 不起作用。另外,我想补充一点,我在 netbeans 中创建了两个独立的项目,一个用于客户端,一个用于服务器。代码如下:

客户:

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();
        } 
    } 
} 

代码有效,但从未发送对象 =/ 。我收到异常消息“什么都没有。”。该连接有效,因为它们使用简单的消息 BufferedReader() 、 BufferedWritter() 交换消息。问题在于对象....

4

2 回答 2

6

1)不要只说“抛出了一些异常”。打印抛出了哪个异常,以及在哪里 ( e.printStackTrace())。

2)很可能,您必须在服务器和客户端中使用相同的类。这意味着相同的包,(client.Object)也与(server.Object)不同。可能你得到一个ClassCastException)。

3) 请不要使用 API 中的类名称来命名您的类,并且不要使用java.lang. 任何名字都比Object.

更新:一些实施技巧

又快又脏。将您的重命名server.Objectserver.MyServer. 导入client.Object. 使obj2变量 a client.Object。问题在于,要运行您的服务器,您需要在类路径中使用您的客户端代码。

更详细。mytest.Bean使用您要传输的对象的定义创建第三个类(例如)。在客户端和服务器代码中都使用这样的类(不要忘记将它添加到类路径中)。

最后,当你有一个真正的应用程序时,你会将共享数据做成一个库,并在服务器和客户端应用程序中都导入它。

于 2013-03-14T22:39:26.727 回答
0

与其为每个类创建一个项目,不如将所有类放到同一个项目中。

事实上,最简单的方法可能是使用一个类。将您的Object课程重命名为更有意义的名称(怎么样MyNetworkType?)。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 回答