Question

I have this code about a Server-Client NTP project I'm working on... and I get a "java.lang.NullPointerException" when I run it...

-NullPointerException fixed... I initialize the socket but I get java.net.SocketException: Socket is not connected this error. Any clues?

Can anyone please help me?

package ntp;

import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * @author Anastasis Chirstodoulakis
 */
public class Server extends Thread {
    private int totalTime=0;
    private int x=0;          //counter
    private int moTime=0;     //average time
    private int PORT;
    private Socket sock = new Socket();

    public Server(int PORT) {
        this.PORT=PORT;
    }

    private Server(Socket sock) {
        this.sock = sock;
    }

    @Override
    public void run(){
        try {
            //open socket
            ServerSocket server = new ServerSocket(PORT);
            InputStream  in = sock.getInputStream(); 
            OutputStream out = sock.getOutputStream();
            PrintWriter w = new PrintWriter(out);   //buffer
            Scanner s = new Scanner(in);
            SimpleDateFormat time = new SimpleDateFormat("HH.mm.ss."); 

            while(true){
                sock = server.accept();
                new Thread(new Server(sock)).start();

                String msg=s.nextLine();
                System.out.println(msg);
                //get time and set format
                Date date=new Date();       //get current time
                SimpleDateFormat sd=new SimpleDateFormat("yyyy.MM.dd.HH:mm:ss");    
                String sdf=sd.format(date);
                //convert time into seconds
                String arr[]=msg.split(" ");
                String st=arr[3];
                String arr1[]=st.split("\\.");
                int hh=Integer.parseInt(arr1[0]);
                int mm=Integer.parseInt(arr1[1]);
                int ss=Integer.parseInt(arr1[2]);
                int secTime=(3600*hh)+(60*mm)+ss;

                totalTime += secTime;
                x++; 

                if(x==10){
                    moTime=totalTime/10;    //to get average time

                    String moHour= secToTime(moTime);                
                    w.println("Server time is:"+ moHour);
                    w.flush();  //to empty the buffer
                }
                in.close();
                out.close();
                sock.close();
            }
        }
        catch (IOException ex) {
            System.out.println(ex); 
        }
        catch (NullPointerException ex){
            System.out.println(ex);
        }
    }      

    public String secToTime(int totalSec){
        //seconds to HH,mm,ss
        int hour=totalSec/3600;
        int remain=totalSec%3600;
        int min=remain/60;
        int sec=remain%60;

        String hours = (hour < 10 ? "0" : "") + hour,
        mins = (min < 10 ? "0" : "") + min,
        secs = (sec < 10 ? "0" : "") + sec;
        String send = hours + "." + mins + "." + secs + ".";

        return send;
      }
}

And here is the client code but I think it's ok...

package ntp;

import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * @author Anastasis Christodoulakis
 */
public class Client extends Thread{
    private Random r;
    private int PORT;

    public Client(int PORT) {
        this.PORT=PORT;
        r = new Random();
    }

    public String secToTime(int totalSec){
        //seconds to HH,mm,ss
        int hour=totalSec/3600;
        int remain=totalSec%3600;
        int min=remain/60;
        int sec=remain%60;

        String hours = (hour < 10 ? "0" : "") + hour,
        mins = (min < 10 ? "0" : "") + min,
        secs = (sec < 10 ? "0" : "") + sec;
        String send = hours + "." + mins + "." + secs + ".";

        return send;
      }

    @Override
    public void run(){        
        try {
            //open socket
            Socket sock=new Socket("localhost",PORT);          
            InputStream in=sock.getInputStream();
            OutputStream out=sock.getOutputStream();         
            Scanner s=new Scanner(in);
            PrintWriter w=new PrintWriter(out); //buffer

            for(int i=0;i<10;i++){
                Date today=new Date();     //get current time
                SimpleDateFormat sd=new SimpleDateFormat("yyy.MM.dd.HH.mm.ss");  //change time form
                String sdf=sd.format(today); //time to String

                 //convert time into seconds        
                String ms[]=sdf.split("\\.");
                int hh=Integer.parseInt(ms[3]);                
                int mm=Integer.parseInt(ms[4]);            
                int ss=Integer.parseInt(ms[5]);              
                int secTime=(3600*hh)+(60*mm)+ss; 

                //Random Delay (-0.5/0.5)
                float lag=r.nextFloat()*(0.5f-0.5f)+0.5f;
                secTime= (secTime - (int) (2 - lag));

                w.println("Client time is: " + secToTime(secTime));
                w.flush();      

            }
            while(s.hasNextLine()){
                String input=s.nextLine();
                System.out.println(input);
            }

            in.close();
            out.close();
            sock.close();
        } catch (IOException ex) {
            System.out.println(ex);
        }
    }    
}

and main...

package ntp;

public class NTP {


    public static void main(String[] args) {
        Server server = new Server(2000);   //set port
        Client client = new Client(2000);

        server.start();
        client.start();
    }
}

............... .................... ................... ...............

Thank you for your time.

Was it helpful?

Solution

If this is supposed to be real NTP: NTP is a datagram protocol, not a byte stream protocol. Trying to implement it using streams is a non-starter. NTP is a connectionless. Streams require two endpoints that are connected to each other.

If this is supposed to be your own protocol implemented over TCP: You have to connect a stream socket before you can use its streams. On the server side, that's accept. On the client side, that's connect.

OTHER TIPS

you need to setSock first before run the server.

package ntp;

public class NTP {


public static void main(String[] args) {
    Server server = new Server(2000);   //set port
    server.setSocket(new Socket()); // you also need write setter for socket.
    Client client = new Client(2000);

    server.start();
    client.start();
   }
}

.......

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top