Java中的套接字和对象是一个非常基本的示例

Java中的套接字和对象是一个非常基本的示例,java,sockets,object,Java,Sockets,Object,我试图在一台服务器和一台客户机之间创建一个简单的传输。我正在尝试将对象从客户端发送到服务器。我已经检查我的代码很多次了,真的不知道为什么t不工作。另外,我想补充一点,我在netbeans中创建了两个独立的项目,一个用于客户端,一个用于服务器。代码如下: 客户: package client; import java.net.*; import java.io.*; import java.util.Scanner; import java.io.Serializable; class Obje

我试图在一台服务器和一台客户机之间创建一个简单的传输。我正在尝试将对象从客户端发送到服务器。我已经检查我的代码很多次了,真的不知道为什么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();
        } 
    } 
} 

包服务器;
导入java.io.ObjectInputStream;
导入java.io.ObjectOutputStream;
导入java.io.Serializable;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.net。*;
导入java.io.*;
类对象实现可序列化的{
第一串;
弦二;
公共对象(字符串1、字符串2){
这个1=1;
这个2=2;
} 
@凌驾
公共字符串toString(){
返回“\nOne:+one+”\nTwo:+two;
}            
}
公共类服务器{
公共静态void main(字符串[]args){
试一试{
ServerSocket服务器=新的ServerSocket(1111,10);
System.out.println(“等待传入连接…”);
System.out.println(“本地地址:+server.getInetAddress()+”端口:+server.getLocalPort());
Socket sock=server.accept();
ObjectInputStream ois=新的ObjectInputStream(sock.getInputStream());
Object ob=新对象(“一次”、“一次”);//用于测试
对象obj2=null;
试一试{
obj2=(Object)ois.readObject();
系统输出打印项次(obj2);
}捕获(例外情况除外){
System.out.println(“无…”);
}
系统输出打印项次(ob);
ois.close();
}捕获(例外情况除外){
System.out.println(“I/O期间的错误”);
例如getMessage();
例如printStackTrace();
} 
} 
} 
代码可以工作,但从未发送对象=/。我得到的信息是“没什么…”这是例外。该连接之所以有效,是因为它们与简单消息BufferedReader()、BufferedWriter()交换消息。问题在于对象…

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

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

3) 请不要使用API中的类名命名类,而不要使用
java.lang
中的类名任何名称都优于
对象

更新:一些实现技巧

又快又脏。将
server.Object
重命名为
server.MyServer
。导入
client.Object
。将
obj2
变量设为
client.Object
。问题在于,要运行服务器,需要在类路径中包含客户端代码

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

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

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

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

3) 请不要使用API中的类名命名类,而不要使用
java.lang
中的类名任何名称都优于
对象

更新:一些实现技巧

又快又脏。将
server.Object
重命名为
server.MyServer
。导入
client.Object
。将
obj2
变量设为
client.Object
。问题在于,要运行服务器,需要在类路径中包含客户端代码

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


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

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

事实上,最简单的方法可能是使用一个类。将
对象
类重命名为更有意义的类(如何
MyNetworkType
?)
MyNetworkType
应该有一个
main
方法,该方法接受“client”或“server”作为命令行参数。如果获得“client”,请运行一个
client
方法,该方法包含给定的
client.main()
中的代码。如果获得“server”,请运行一个方法,该方法包含给定的
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来解决这个问题,就得靠自己了

请注意,这不是一个好的设计。实际上,您肯定希望客户机和服务器在不同的类中(但不一定需要将它们放在不同的项目中)。但是您正在寻找一个非常基本的示例,还有什么比单个类更简单呢


我希望这会有所帮助。

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

事实上