2015-10-25 311 views
0

爲什麼要獲取NullPointerException?當我從服務器發送數據到客戶端時,它一切正常。Java套接字從客戶端發送數據到服務器

Error java.lang.NullPointerException 
at NetworkClient.Klient.wyslijDane(Klient.java:35) 

編輯代碼 我添加了完整的服務器類和客戶端類 在其他類我創建了一個新的對象客戶端和服務器

klient =新Klient(); ,然後調用WyslijDane方法。服務器沒問題,客戶端拋出異常。

客戶端類

public class Klient { 

    public static final int PORT=50007; 
    public static Socket sock; 
    public static int msg=10; 



public Klient() throws UnknownHostException, IOException 
{ 
    Socket sock=new Socket("localhost", PORT); 
} 



public static void wyslijDane(int GraczK) throws IOException 
{ 

     DataInputStream in=new DataInputStream(sock.getInputStream()); 
     DataOutputStream out=new DataOutputStream(sock.getOutputStream()); 

     // BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 



      out.writeInt(GraczK); 
     //out.writeBoolean(flaga); 
      out.flush(); 
     System.out.println("Wyslano dane "+ GraczK); 
} 
} 

服務器類

public class Server 
    { 
    public static final int PORT=50007; 
    public static MainWarSever main=new MainWarSever(); 
    static Socket sock; 
      public Server() throws IOException 
{ 
    //tworzenie gniazda serwerowego           
    ServerSocket serv = null;              
    if (serv==null) 
    serv=new ServerSocket(PORT); 
    else 
    { 
     System.out.println("SErver już zajety brrrr"); 
     serv.close(); 
    } 




                    sock=serv.accept();              
    System.out.println("Jest polaczenie: "+sock); 

} 


public static void wyslijDane(int GraczK) throws IOException 
{ 
     DataInputStream in=new DataInputStream(sock.getInputStream()); 
     DataOutputStream out=new DataOutputStream(sock.getOutputStream()); 

     boolean flaga=true; 
     int msg; 
     int i=0; 
     int msgOut; 
     msgOut=GraczK; 
     out.writeInt(msgOut); 
     out.writeBoolean(flaga); 
     out.flush(); 
     System.out.println("Wyslano dane "+ GraczK + "Flage" + flaga); 
} 
+2

一個是35行嗎? – CtrlAltDel

+0

它的這一行35 \t \t DataOutputStream out = new DataOutputStream(sock.getOutputStream()); Set Sock Client \t public static final int PORT = 50007; \t public static Socket sock; \t public static int msg = 10; \t \t \t公共Klient()拋出的UnknownHostException,IOException異常 \t { \t \t插座襪子=新的Socket( 「本地主機」,PORT); \t} – Pekus

+0

你可以編輯你的問題,並添加你創建套接字(在客戶端)的代碼部分? – CtrlAltDel

回答

1

1)你所得到的NullPointerException,因爲當你說sock.getOutputStream()sock.getInputStream()您使用的構造至極外部聲明的sock 變量未初始化。

因此而不是創建在構造一個新的sock變量使用你已經有了一個:

//Change this line 
Socket sock=new Socket("localhost", PORT); 

//To this 
Socket sock=new Socket("localhost", PORT); 

2)你的襪子變量不應該被聲明爲staticwyslijDane應該構造後調用被執行(創建套接字),所以它不應該是靜態的。

3)確保在創建Socket後調用wyslijDane方法。

4)首先創建並清空DataOutputStream,然後創建DataInputStream。他們應該是在無論是在客戶端和服務器的代碼相同的順序:

DataOutputStream out=new DataOutputStream(sock.getOutputStream()); 
out.flush(); 
DataInputStream in=new DataInputStream(sock.getInputStream()); 

既然你說,當你創建DataOutputStream問題應該可以解決的異常被拋出。


建議:

作爲一個很好的做法,不創建DataOutputStreamDataInputStream每次調用wyslijDane方法。 請在創建套接字後創建DataOutputStreamDataInputStream

1

什麼是sock設置爲?如果sock不是NullPointerException的原因,那麼帶有行號的代碼會很有幫助。

編輯:當你添加完整的源代碼...當調用靜態wyslijDane(int GraczK)你的Klient()構造函數設置襪子不能被調用。使你的變量和方法不是靜態的將澄清這一點。

編輯:順便說一句,你在你的客戶類中定義了兩個 sock變量,一個靜態變量和一個構造函數,後者在離開構造函數後被銷燬。

相關問題