[英]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
方法時都創建DataOutputStream
和DataInputStream
。 而是在創建套接字后立即創建DataOutputStream
和DataInputStream
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.