문제

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.

도움이 되었습니까?

해결책

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.

다른 팁

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();
   }
}

.......

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top