Доморощенный сокетImplFactory Causing Null Pointer - PullRequest
0 голосов
/ 17 марта 2012

Точно так же, как описано в названии, у меня есть самодельная SocketImplFactory, которая заставляет мой код работать на

(ServerSocket).close();

Я нахожусь в своем уме.Сейчас я публикую все соответствующие файлы, а также два запуска.

Первый, server2.java:

import java.net.Socket;
import java.net.ServerSocket;

public class server2 {
  public static void main(String[] argv){

    if(argv.length!= 1){
      System.err.println("usage: server1 <hostport>");
      System.exit(1);
    }

    try{
      TCPStart.start();

      ServerSocket sock = new ServerSocket(Integer.parseInt(argv[0]));

      sock.close();
      /*Socket connSock = sock.accept();

      System.out.println("got socket "+connSock);

      Thread.sleep(1*1000);
      connSock.close();
      Thread.sleep(35*1000);            */
    }
    catch(Exception e){
      System.err.println("Caught exception "+e);
      e.printStackTrace();
    }
  }
}

Следующий TCPStart.java:

import java.net.*;


//---------------------------------------------------
//
// class TCPStart
//
// this is the hub of the entire socket implementation.
// all modules are initialized here.
//
//
// code that runs on TOP of this whole implementation will
// be put in this file, as separate threads.
//
// to start our implementation of TCP, type
//   java TCPStart <UDP port #>
//
//
//---------------------------------------------------
class TCPStart {

  public final static String PORTRESOURCE = "UDPPORT";
  public final static String LOSSRATERESOURCE = "LOSSRATE";

  static public void start() {

    // check command line args
    if (System.getProperty(PORTRESOURCE)==null) {
      System.err.println("Must set "+PORTRESOURCE+" for UDP port to use with "+
             "-D"+PORTRESOURCE+"=<num>");
      System.exit(1);
    }        


    // this number will initialize what port # you want your UDP
    // wrapper to run on.
    int portForUDP = Integer.parseInt(System.getProperty(PORTRESOURCE));


    // initialize TCPWrapper's port number for UDP wrapping
    TCPWrapper.setUDPPortNumber( portForUDP );


    // initialize more TCPWrapper stuff here, if you want to test packet
    // dropping, or if you want to change the sending-rate limit


    // create an instance of the Demultiplexer
    Demultiplexer D = new Demultiplexer( portForUDP );

    // create an instance of OUR SocketImplFactory
    StudentSocketImplFactory myFactory = new StudentSocketImplFactory(D);


    // tell all Socket objects of this program to use OUR
    // implementation of SockImpl
    try {
      Socket.setSocketImplFactory( myFactory );
      ServerSocket.setSocketFactory( myFactory ); //This is the problem line.
    } catch (Exception e) {
      System.out.println(e);
      System.exit(1);
    }


    // start the demultiplexer
    D.start();

    if (System.getProperty(LOSSRATERESOURCE)!=null) {
      TCPWrapper.dropRandomPackets
    (System.currentTimeMillis(),
     Double.parseDouble(System.getProperty(LOSSRATERESOURCE)));
    }        


  }
}
* 1011И, наконец, StudentSockImplFactory.java
import java.net.*;

//---------------------------------------------------
//
// class StudentSocketImplFactory
//
// this object is what actually creates each INSTANCE of a
// SocketImpl object.  In TCPStart.main(), we call
//
//     Socket.setSocketImplFactory( new StudentSocketImplFactory(D) );
//
// (this is a static function)
// so, when we create a java Socket, it will make a call to
// createSocketImpl(), and the Socket will use OUR code!!!
//
//---------------------------------------------------
class StudentSocketImplFactory implements SocketImplFactory {

    // the Demultiplexer has to be known to every SocketImpl, so that it
    // can communicate with it
    private Demultiplexer D;


    public StudentSocketImplFactory(Demultiplexer D) {
        super();
        this.D = D;
    }

    // Socket object makes this call to get one instance of SocketImpl.
    // reminder: each socket will get a DIFFERENT instance of
    // SocketImpl. this is GOOD, so that we will have one TCPConnection
    // for each Socket!!
    public SocketImpl createSocketImpl() {
        return ( new StudentSocketImpl(D) );
    }
}

Если я закомментирую вышеупомянутую проблему, все будет работать хорошо, пока я не попытаюсь принять соединения.Неудачный прогон:

$ java -DUDPPORT=12345 server2 54321
java.lang.NullPointerException: null buffer || null address

Заранее благодарим за помощь.

1 Ответ

1 голос
/ 17 марта 2012

Я нашел свой собственный ответ, который, вероятно, не будет иметь смысла для многих людей, но я собираюсь опубликовать его, чтобы, если у кого-то еще возникла подобная проблема, он мог найти этот ответ наGoogle box:

Получается,

(ServerSocket).close();

Звонки

(SocketImpl).close();

Что я раньше не осознавал.Так как моя фабрика была сброшена для использования другого SocketImpl (а именно того, который я пишу), когда я пытался отправить Fin Packet, по понятным причинам не было никого, кому его нужно было отправить, поэтому он выдал ошибку нулевого адреса,Просто идет, чтобы показать, иногда вам нужно спать по проблеме, и ответ придет утром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...