Java中的套接字和对象非常基本的例子

时间:2013-03-14 22:35:26

标签: java sockets object

我正在尝试在一个服务器和一个客户端之间创建一个简单的传输。我正在尝试从客户端向服务器发送一个Object。我已经多次检查了我的代码,我真的不知道为什么不起作用。此外,id喜欢添加我已经在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()可以交换消息。问题在于对象....

2 个答案:

答案 0 :(得分:6)

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

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

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

更新:一些实施提示

快速而肮脏。将您的server.Object重命名为server.MyServer。导入client.Object。将obj2变量设为client.Object。麻烦的是,要运行服务器,您需要在类路径中使用客户端代码。

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

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

答案 1 :(得分:0)

不是为每个类创建项目,而是将所有类放入同一个项目中。

事实上,最简单的方法是使用一个类。将您的Object课程重命名为更有意义的内容(MyNetworkType怎么样?)。 MyNetworkType应该有一个main方法,它接受'client'或'server'作为命令行参数。如果您获得“客户”,请运行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来解决这个问题,你可以自己动手。

请注意,这不是好设计。在实践中,您肯定希望您的客户端和服务器位于不同的类中(但您不一定需要将它们放在单独的项目中)。但是你正在寻找一个非常基本的例子,什么可能比单个类更简单?

我希望这会有所帮助。