请教一个关于Socket的小问题,我现在要在服务器端永久开启一个端口,任意一台客户机访问该端口均循环四次调用,并返回相应的服务器的时间給服务器端。
我现在写了如下代码,但是只有第一次返回了时间,后面则异常了,估计是Socket端口关闭的问题,请问该如何修改才能达到要求?public class SynTimeServer
{
    public SynTimeServer(){}
    public static void main( String[] args ) throws IOException
    {
        ServerSocket ss = new ServerSocket( 8001 );
        Socket s = ss.accept();
        OutputStream ops = s.getOutputStream();                         //建立一个输出流对象
        ObjectOutputStream oos = new ObjectOutputStream( ops );         //把输出流放入一个对象输出包装类中让其发送        String serverTime = getNowTime();
        ServerTime st = new ServerTime( serverTime );
        oos.writeObject( st ); //把对象写入输出流包装类中
        oos.close();
        s.close();
        ss.close();
    }    private static String getNowTime()
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String nowTime = sdf.format(new java.util.Date());
        return nowTime;
    }
}
public class SynTimeClient
{
    public static void main( String[] args ) throws IOException, ClassNotFoundException
    {
        Socket s = new Socket( "127.0.0.1",8001 );        InputStream ips = s.getInputStream(); //建立一个输入流对象
        for( int i = 1;i < 5;i++ )
        {
            ObjectInputStream ois = new ObjectInputStream( ips ); //把输入流放入一个对象包装类中让其接收
            ServerTime st = (ServerTime)ois.readObject(); //将接收到的服务器端传来的ServerTime对象的数据强制转换为ServerTime类型
            System.out.println( "第"+i+"次" + st.serverTime.substring( 0,10 ) );
            System.out.println( "第"+i+"次" + st.serverTime.substring( 11,19 ) );
            ois.close();
        }
        s.close();
    }
}public class ServerTime implements Serializable
{
    public String serverTime;
    public ServerTime( String serverTime )
    {
        this.serverTime = serverTime;
    }
}

解决方案 »

  1.   

    你的服务器SynTimeServer, 在main 函数里面 
    oos.close();
            s.close();
            ss.close();
      

  2.   

    把这个SOCKET 都关闭了,运行完MAIN 函数就关了,结果你的客户端还在循环连接这个SOCKET 所以 出现这个问题
     解决办法:把你的SynTimeServer 主线阻塞起来,这样你的服务器端才算永久开启一个端口
      

  3.   

    问题比较多
    最直接的错误:server端write了1个object,client端要读4个object另外,server最好用线程处理
    do{
     Socket s = ss.accept();
     //start a Thread to process... 
    }while(notterminate);
      

  4.   

    要做个守护线程来监听,accept后起另外的线程进行处理.守护线程只管监听.
    要不一次accept后ServerSocket就close了.程序也就结束.
    楼上也给出了基本实现框架.
      

  5.   

    多谢楼上几位,我把程序改了一下,但是还是有问题,处理完一次客户端的数据后,服务器端再次ss.accept()的时候在run()里形成了死循环,异常如下:
    java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    怎么才能在没有客户端访问的时候使其处于接收状态,等有客户端访问的时候才继续执行?
    public class SynTimeServer
    {
        public SynTimeServer(){}
        public static void main( String[] args ) throws IOException
        {
            ServerSocket ss = new ServerSocket( 8001 );        boolean bl = true;
            while( bl )
            {
                Socket s = ss.accept();
                new Thread( new Servicer( s )).start();
            }
            ss.close();
        }
    }public class Servicer implements Runnable
    {
        private Socket s = null;
        public Servicer( Socket s )
        {
            this.s = s;
        }
        public void run()
        {
            try
            {
                OutputStream ops = s.getOutputStream();                    
                ObjectOutputStream oos = new ObjectOutputStream( ops );                 ServerTime st = null;
                boolean bl = true;
                while( bl )
                {
                    String serverTime = getNowTime();
                    st = new ServerTime( serverTime );
                    oos.writeObject( st );                                     
                }
                oos.close();
            }
            catch ( IOException e )
            {
                e.printStackTrace();
            }
        }    private static String getNowTime()
        {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String nowTime = sdf.format(new java.util.Date());
            return nowTime;
        }
    }public class SynTimeClient
    {
        public static void main( String[] args ) throws IOException, ClassNotFoundException
        {
            Socket s = new Socket( "127.0.0.1",8001 );        InputStream ips = s.getInputStream();
            ObjectInputStream ois = new ObjectInputStream( ips );         ServerTime st = (ServerTime)ois.readObject();         System.out.println( st.serverTime.substring( 0,10 ) );
            System.out.println( st.serverTime.substring( 11,19 ) ); ois.close();
            s.close();
        }
    }
      

  6.   

    while( !s.isClosed() )  试试看