2013-03-14 62 views
0

我試圖在一個服務器和一個客戶端之間創建一個簡單的傳輸。我正試圖從客戶端發送一個對象到服務器。我檢查了我的代碼很多次,真的不知道爲什麼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

回答

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),並定義要傳輸的對象。在客戶端和服務器代碼中使用這樣的類(不要忘記將其添加到類路徑中)。最後,當你有一個真正的應用程序時,你將使共享數據成爲一個庫,並將它們導入到服務器和客戶端應用程序中。

+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

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你是你自己的。

請注意,這是不好的設計。在實踐中,你一定會希望你的客戶端和服務器在不同的類中(但你不一定需要把它們放在單獨的項目中)。但是你正在尋找一個非常基本的例子,什麼可能比單個類更簡單?

我希望這會有所幫助。