请教一个关于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;
}
}
我现在写了如下代码,但是只有第一次返回了时间,后面则异常了,估计是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;
}
}
解决方案 »
- Java调用bash文件出现command not found
- InputStream输入流的问题
- IOEception的导入???
- 请问一个JAVA语法的问题,请问<>尖括号的语法是什么意思?
- 新手:请大家帮忙解释JDK里bin中的应用文件的作用
- StringBuffer的问题
- 有关数据库插入
- 如果来修改表格(jtable)中的数据,然后再如果得到修改那一行的数据?
- 想封装一个log类,可以控制日志文件大小以及回滚,类似log4j的功能,请教!
- Java连接数据库问题
- 关于文件的读和写-------如何在写入数据时换行?并把奇数行写入文件1,偶数行写入文件2
- Set类型和List类型之间如何互相转换?
oos.close();
s.close();
ss.close();
解决办法:把你的SynTimeServer 主线阻塞起来,这样你的服务器端才算永久开启一个端口
最直接的错误:server端write了1个object,client端要读4个object另外,server最好用线程处理
do{
Socket s = ss.accept();
//start a Thread to process...
}while(notterminate);
要不一次accept后ServerSocket就close了.程序也就结束.
楼上也给出了基本实现框架.
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();
}
}