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

问题描述:

我试图在一个服务器和一个客户端之间创建一个简单的传输。我正试图从客户端发送一个对象到服务器。我检查了我的代码很多次,真的不知道为什么t不起作用。此外,编号喜欢补充说,我已经在netbeans中创建了两个单独的项目,一个用于客户端,另一个用于服务器。代码如下:Java中的套接字和对象非常基本的示例

客户:

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()交换消息。问题是与对象....

+0

请考虑清理您的代码示例。 – millimoose 2013-03-14 22:42:16

+0

当你发生异常时,不要只是打印'没有',或者什么都不打印。 ***从来没有***做到这一点。打印*例外。*然后你会知道发生了什么问题。如果你已经适当注意了这个问题,你甚至不必提出这个问题。 – EJP 2013-03-15 01:43:29

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),并定义要传输的对象。在客户端和服务器代码中使用这样的类(不要忘记将其添加到类路径中)。最后,当你有一个真正的应用程序时,你将使共享数据成为一个库,并将它们导入到服务器和客户端应用程序中。

+2

+1。 OP需要3个项目:1个用于客户端,1个用于服务器,1个用于两者共享的类,其实例通过网络交换 – 2013-03-14 22:41:41

+0

@JBNizet请你解释一下如何做到这一点?我在这里浪费了2天,我是否应该为班级“对象”创建一个新项目?我怎样才能将它链接到其他两个项目?谢谢 ! – 2013-03-14 22:57:58

+0

是的,这个类应该真的被重命名。创建一个新项目,从其编译的类生成一个jar,并将此jar添加到客户端和服务器项目的类路径中。 – 2013-03-14 22:59:31

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

事实上,最简单的方法是使用一个类。将你的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你是你自己的。

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

我希望这会有所帮助。