2015-10-25 207 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变量,一个静态变量和一个构造函数,后者在离开构造函数后被销毁。

相关问题