请教一个关于Socket的问题,大家多帮助!谢谢

stsoft 2005-12-21 05:24:48
请教一个关于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;
}
}
...全文
176 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
owowo 2005-12-23
  • 打赏
  • 举报
回复
关注一下
stsoft 2005-12-23
  • 打赏
  • 举报
回复
up!
xiguali 2005-12-23
  • 打赏
  • 举报
回复
while( !s.isClosed() ) 试试看
stsoft 2005-12-22
  • 打赏
  • 举报
回复
多谢楼上几位,我把程序改了一下,但是还是有问题,处理完一次客户端的数据后,服务器端再次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();
}
}
cenlmmx 2005-12-21
  • 打赏
  • 举报
回复
要做个守护线程来监听,accept后起另外的线程进行处理.守护线程只管监听.
要不一次accept后ServerSocket就close了.程序也就结束.
楼上也给出了基本实现框架.
kingfish 2005-12-21
  • 打赏
  • 举报
回复
问题比较多
最直接的错误:server端write了1个object,client端要读4个object

另外,server最好用线程处理
do{
Socket s = ss.accept();
//start a Thread to process...
}while(notterminate);
gzhua99 2005-12-21
  • 打赏
  • 举报
回复
把这个SOCKET 都关闭了,运行完MAIN 函数就关了,结果你的客户端还在循环连接这个SOCKET 所以 出现这个问题
解决办法:把你的SynTimeServer 主线阻塞起来,这样你的服务器端才算永久开启一个端口
gzhua99 2005-12-21
  • 打赏
  • 举报
回复
你的服务器SynTimeServer, 在main 函数里面
oos.close();
s.close();
ss.close();

62,626

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧