我现在要作这么个东西,用socket实现的:1:client向server发登录消息,server进行验证后,向客户端发送“登录成功”,并保留这个socket2:server会随时使用这个socket向client发送数据消息3:每隔5分钟,client向server发一个验证消息,保证网络连接正常现在我作到server完成身份验证就作不下去了,不知道怎么实现server随时使用socket向client发数据的功能?是在client弄一个
while(true){
String str = in.readLine();
if(str == null)
break;
}
这样吗?请各位为小弟指点一二!
while(true){
String str = in.readLine();
if(str == null)
break;
}
这样吗?请各位为小弟指点一二!
2:server会随时使用这个socket向client发送数据消息
可以使用一个随机时间, 然后Server在发送一次数据后, 休眠随机长的时间while (!stopped) {
server写数据给client.
int delay = (int)(Math.random() * 3000); // server随机休眠3000毫秒以内
Thread.sleep(delay);
}自己处理一下异常.3:每隔5分钟,client向server发一个验证消息,保证网络连接正常
当client收到一个从server来的消息时, 结束上一Timer, 启动一个新的记时器Timer, 设置时间为5分钟.
5分钟后, Timer发送消息给server, 如果在一写时间内client没有收到server的回复信息, 则说明连接断了.
个人不推荐使用socket,虽然socket也能实现
但是,更推荐rmi,你可以调用java中的rmi来实现客户端和服务器之间的通信,非常方便
当客户端向服务器发登陆消息,服务器进行验证后,将这个客户端对象放入一个队列中,以后从这个队列中取出每个客户端对象,服务器通过这个客户端对象向客户端发送消息,当然,为此你必须得做两个监视器,一个是监视服务器,一个是监视客户端的,当事件发生时,监视器接收到消息,并做出响应处理。
具体的,你可以看下用java做的网络聊天室,很多书上都有这样的例子的
这样,读取互不干扰,可以同时运行。
3:每隔5分钟,client向server发一个验证消息,保证网络连接正常
这个如果要求不严格,可以让client休眠5分钟
Thread.sleep(300000);
然后发送数据就可以了。
登录成功的用户可以每次发送时加上验证信息,可以考虑加密
例子可以参考oreilly的Java in a Nutshell,电子版
如果随便写的话,就像whmjxa说的那样,可以考虑使用rmi,而且安全方面可以由rmi负责
public void write(String str);
里面利用socket.getOutPutStream()来向客户端写数据.这样 在你需要发送的时候直接调用socket包装对象.write()方法写就可以了,这个socket会一直连接着的,不需要什么死循环.在客户端 单独开一个线程用来读取信息 用BufferedRead来包装socket.getInPutStream(),调用BufferedRead中的readLine()就可以了,因为socket.getInPutStream()是阻塞调用的 ,所readLine()也会是阻塞调用的,会一直等到服务器端传送来一个换行标志才会返回,不需要死循环来读.客户端做个定时器 每次接受到服务器数据了就把定时器置0,定时器到时间了就断开连接.(javax.swing.Timer 类就是现成的定时器 可以看下doc文档,上面有例子 很方便 实现一下ActionListener接口就可以)
socket = serverSocket.accept();
System.out.println("已经建立socket链接!");
//接收数据
DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
//数据处理
String messageStr = this.processInputStream(dis);
System.out.println("收到字串:" + messageStr);
Message message = createMessageObject(messageStr);
if (message.getCommand().equalsIgnoreCase("S C")) {
// 登录报文
System.out.println("收到登录报文:" + messageStr);
//构造响应报文
String ret = createLoginReturnStr();
System.out.println("响应登录报文:" + ret); DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write(EncodeUtil.encode(ret).getBytes());
out.flush();
}
else if(message.getCommand().equalsIgnoreCase("S A")){
//链路维护报文
String ret = messageStr;
System.out.println("响应链路维护报文:" + ret); DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write(EncodeUtil.encode(ret).getBytes());
out.flush();
} System.out.println("接收完成!");
}
client端: //构造登录对象
String loginStr = this.getLoginStr();
cs.sendMessage(loginStr);
String ret = cs.getMessage();
if(something){
System.out.println("登录成功!");
}问题是到这儿了我就不知道怎么继续接收server端发来的数据了???链路维护的问题:我的client程序extends TimerTask了,在run中这样写了:
//构造登录对象
String linkTestStr = this.getLinkTestStr();
cs.sendMessage(linkTestStr);
String retStr = cs.getMessage();
在main()中这样写:
Timer timer = new Timer(false);//设置定时器
timer.schedule(new ShenyangClient(), 1000,5000); //1秒后开始运行,每5秒运行一次但运行时就总是不动了,CPU也一直很高,不知道是怎么回事?
socket = serverSocket.accept();
System.out.println("已经建立socket链接!");
这段代码有点问题,你使用建立一次连接还要建立很多次呢,在一个单独的线程里不断的进行监听意味着将创建出多个连接,我想程序动的原因就在这里,你知创建了一个client端,那server完成了一次while循环后又开始监听了,这时没有client请求,sever就下不去了,不断的在监听着!!!
cup高可能是client端引起的,sever在监听的时候没有那么占cpu
这是怎么回事啊?