0

我有这个关于我正在处理的服务器-客户端 NTP 项目的代码......我初始化了套接字,但我得到了 java.net.SocketException: Socket is not connected 这个错误。有什么线索吗?

谁能帮帮我吗?

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


            while(true){
                ServerSocket server = new ServerSocket(PORT+=1000);
                sock = server.accept();
                new Thread(new Server(PORT+=1000)).start();

                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."); 

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

这是客户端代码,但我认为没关系...

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

和主要...

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

………………………………………………………………………………………………………………………… ………………………………………………………………………………

感谢您的时间。

4

1 回答 1

2

这里是这些行:

   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 循环(服务器类)中创建线程之后。看来您正在尝试在接受套接字之前使用客户端。

于 2013-05-17T02:40:06.813 回答