当前位置:  技术问答>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,...))

|
客户端可以用read()等等(总之是接收数据的方法),比如接收二进制的
DateInputStream DIS;
……
int length = DIS.read(dataBuf);//这句就是在等待对端的消息,消息来到                 才会往下执行
……

|
ManageClient mc=(ManageClient ) mVecMC.firstElement()

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • CentOS下PHP安装完成后继续安装GD扩展库
  • 父进程等待子进程n秒,如果子进程正常退出,父进程立即继续向下执行,如果子出现进程故障一直不退出,父进程等待n秒后继续向下执行,请问
  • 继续继续RAID5问题
  • 停在断点后AppletViewer不能再继续了……
  • make过程中还能继续?
  • 如何让一个daemon线程 重启后来继续运行呢?
  • 编译失败后如何再继续编译
  • 继续给分
  • 怎样使一个线程暂停,还有继续
  • 发现一个有趣的东西,继续散分。
  • sh脚本 用户退出后继续执行 iis7站长之家
  • 请教下:是否有方法 在vim中执行make命令的同时继续编辑和查看文件呢?
  • sh脚本 用户退出后继续执行
  • 郁闷,继续散分
  • 继续请教机器死机问题
  • 继续散分!贿赂各位大虾和小虾
  • 土土的问,gdb中如何从一个断点继续执行到下一个断点?(不是单步)
  • 接前面的《继续讨论文件目录处理的,高手指点!!》
  • 急!急!急!继续提问!简单问题!
  • 直到线程执行完后,才让程序继续执行下去,怎么实现??
  • 继续问:使用Motif库的OverrideShell创建的窗口怎么放在屏幕的中央?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3