Java套接字从客户端向服务器发送数据

时间:2015-10-25 18:12:37

标签: java sockets

为何获得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);
}

2 个答案:

答案 0 :(得分:1)

sock设置为什么?如果sock不是NullPointerException的原因,那么带行号的代码会很有帮助。

编辑:在您添加完整的源代码之后......在调用静态wyslijDane(int GraczK)时,您的Klient()构造函数设置sock一定不能被调用。使你的变量和方法不是静态的可以澄清这一点。

编辑:BTW在您的客户端类中定义两个 sock变量,一个是静态的,一个在构造函数中,后者在离开构造函数后被销毁。

答案 1 :(得分: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)你的sock变量不应该被声明为static,并且在执行构造函数(创建套接字)之后应该调用wyslijDane所以它不应该是静态的

3)确保在创建wyslijDane后调用Socket方法。

4)首先创建并刷新DataOutputStream,然后创建DataInputStream。它们在客户端和服务器代码中的顺序应该相同:

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

由于您说创建DataOutputStream时会抛出异常,因此应该解决问题。

建议:

作为一种良好做法,每次调用DataOutputStream方法时都不要创建DataInputStreamwyslijDane。 而是在创建套接字后立即创建DataOutputStreamDataInputStream