当前位置: 技术问答>java相关
继续socket的问题,小弟还没明白,:( 多谢各位了。
来源: 互联网 发布时间:2015-07-13
本文导语: 怎样给所有连接到服务端的用户发消息。或怎样给连接到服务器端的指定用户发消息? 服务端得到客户端的socket后是通过线程来处理,他们之间(每个客户和服务器)的会话是单独的。 所以很难分辨哪个客户是哪个...
怎样给所有连接到服务端的用户发消息。或怎样给连接到服务器端的指定用户发消息?
服务端得到客户端的socket后是通过线程来处理,他们之间(每个客户和服务器)的会话是单独的。 所以很难分辨哪个客户是哪个线程?怎么发给他们呢?
回复人: xnfeng(先锋) ( ) 信誉:100 2002-04-23 16:21:00 得分:0
可以用hashtable来存储
每个用户的ip来做hashley
不就可以了
回复人: cranberry(催眠) ( ) 信誉:97 2002-04-23 16:43:00 得分:0
用一个全局数组保存用户信息和输入输出流,发送的时候搜索这个数组找到指定用户的流,发送就可以了!
回复人: floating(cheng) ( ) 信誉:100 2002-04-23 16:44:00 得分:0
能和你通过oicq or icq or msn等单独和你谈谈这问题么?tku.
回复人: alphazhao(绿色咖啡) ( ) 信誉:100 2002-04-23 16:49:00 得分:0
所以很难分辨哪个客户是哪个线程?怎么发给他们呢?
这个有点难以费解
难道你客户端就在一台机器上么?即使就算是这样
你用socket通讯,完全可以在服务器端将每个socket连接保存一个socket号啊,完全可以做到对应相应线程,这样不久简单多了?
回复人: floating(cheng) ( ) 信誉:100 2002-04-23 16:56:00 得分:0
各位能给我一个小小的例子么?
多谢各位,在上海的我请客吃饭。呵呵
回复人: floating(cheng) ( ) 信誉:100 2002-04-23 17:01:00 得分:0
to alphazhao(绿色咖啡)
是可以保存一个socket号的,可是怎么对这个线程做操作呢?
怎么把数据通过这个线程发给这个客户呢?
to: cranberry(催眠)
找到指定用户的流,怎么找?然后又怎么来发给客户,客户怎么接收?是要客户不断监测时候有服务端消息么?
|
给你说一个比较简单的吧:服务端监听客户的连接,如果有一个客户连接上来,这时候应该得到该客户的IP或Socket,你把IP或socket存到Vector中;同时你new一个线程把已经和客户连接的Socket传给该线程;new一个线程的时候应该得到线程的实例句柄,你也把线程的实例句柄存放到一个Vector向量中。
存放ip或Socket的向量与存放线程的实例句柄的向量要一一对应。
Vector mVecClientIP = new Vector(5,3);
Vector mVecMC = new Vector(5,3);
..................
while (true)//接受多个用户
{
if(XXX)//如果应用程序退也结束循环
{
exitListenSocket(-1);
return false;
}
try
{
mSocket = mServerSocket.accept();
}
catch(Exception timeoutE)
{
}处理客户线程
ManageClient mc= new ManageClient(mSocket);
mVecClientIP.addElement(mSocket.getInetAddress().getHostAddress());//当然你也可以存放mSocket到向量里边
mc.start();
mVecMC.addElement(mc);
//mc和mVecClientIP一定对应,也就是说增的时候要一起增,删除的时候 要一起删除。你可以用hashtable来代替Vector
}
想给所有的客户发送信息你可以历遍mVecMC利用线程类实例给所有的客户发送信息,怎么实现发送,你自己在程序中决定(类中实现一个sendInfo(String,int,...)的方法,这样你new一个线程类,该类实例都可以去调用这个sendInfo(String,int,...))
存放ip或Socket的向量与存放线程的实例句柄的向量要一一对应。
Vector mVecClientIP = new Vector(5,3);
Vector mVecMC = new Vector(5,3);
..................
while (true)//接受多个用户
{
if(XXX)//如果应用程序退也结束循环
{
exitListenSocket(-1);
return false;
}
try
{
mSocket = mServerSocket.accept();
}
catch(Exception timeoutE)
{
}处理客户线程
ManageClient mc= new ManageClient(mSocket);
mVecClientIP.addElement(mSocket.getInetAddress().getHostAddress());//当然你也可以存放mSocket到向量里边
mc.start();
mVecMC.addElement(mc);
//mc和mVecClientIP一定对应,也就是说增的时候要一起增,删除的时候 要一起删除。你可以用hashtable来代替Vector
}
想给所有的客户发送信息你可以历遍mVecMC利用线程类实例给所有的客户发送信息,怎么实现发送,你自己在程序中决定(类中实现一个sendInfo(String,int,...)的方法,这样你new一个线程类,该类实例都可以去调用这个sendInfo(String,int,...))
|
客户端可以用read()等等(总之是接收数据的方法),比如接收二进制的
DateInputStream DIS;
……
int length = DIS.read(dataBuf);//这句就是在等待对端的消息,消息来到 才会往下执行
……
DateInputStream DIS;
……
int length = DIS.read(dataBuf);//这句就是在等待对端的消息,消息来到 才会往下执行
……
|
ManageClient mc=(ManageClient ) mVecMC.firstElement()