簡體   English   中英

Java套接字將數據從客戶端發送到服務器

[英]Java socket send data from client to server

為什么會出現NullPointerException 當我從服務器向客戶端發送數據時,一切正常。

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

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

klient = new 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);
}

sock要做什么? 如果sock不是NullPointerException的原因,則行號代碼將很有幫助。

編輯:添加完完整的源代碼后,在調用靜態wyslijDane(int GraczK)必須未調用Klient()構造函數設置襪子。 使變量和方法不是靜態的可以澄清這一點。

編輯:順便說一句,在您的客戶端類中,您定義了兩個襪子變量,一個靜態變量,一個在構造函數中,后者在離開構造函數后被銷毀。

1)您正在獲取NullPointerException因為當您說sock.getOutputStream()sock.getInputStream()您使用的是未初始化在構造函數外部聲明的sock變量。

因此, sock在構造函數中創建一個新的sock變量, sock使用已有的變量:

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

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

2)不應將您的sock變量聲明為static變量,並且應在構造函數執行后(創建套接字)調用wyslijDane因此它不應為static變量。

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

4)首先創建並刷新DataOutputStream ,然后創建DataInputStream 它們在客戶端和服務器代碼中的順序應相同:

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

由於您說的是在創建DataOutputStream時引發了異常,因此應該解決該問題。


建議:

好的做法是,不要在每次調用wyslijDane方法時都創建DataOutputStreamDataInputStream 而是在創建套接字后立即創建DataOutputStreamDataInputStream

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM