最近在学习socket编程,考虑如下实现,请教一下按下面实现有什么问题?还需要如何改进一下呢?多谢!server端开启监听,获取客户端连接后开启此连接的接收线程:
private ExecutorService exec;
……
Socket client = null;   
while (true) {   
     client = server.accept();  
     sockHashMap.put(client.getInetAddress(), client);
     exec.execute(new MsgRecieve(client));
}客户端连接后发送一个唯一标识信息至服务端,服务端收到后存入HashMap,此处HashMap考虑同步客户端发送的消息,服务端MsgRecieve线程接收到后进行处理。服务端发送指定客户端消息,从HashMap中找到socket对象,然后调用发送函数发送,发送函数只有一个考虑同步。客户端退出,异常HashMap中的信息。

解决方案 »

  1.   

    while(true)是不是退不出了
    唯一标识是不是标志连接的,断开连接时需要去掉
      

  2.   

    觉得你的hashMap是否没必要啊。难道你要不定时向某些客户群发送消息?
      

  3.   

    没有分了 借着发个帖
    导入了包  struts2-dojo-plugin-2.1.8.1.jar
    jsp  页面加<head>入了   <sx:head parseContent="true"/>
    浏览网页会提示 stack overflow at line  8259
    之后 网站重启动求会报错
    是不是sturus配置有问题
    配置如下
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd"><struts>
    <package name="user" extends="struts-default">


    <action name="saveUser" class="saveUserAction">
    <result name="success" type="redirect">/mainframe.jsp</result>
    <result name="input">/login/login.jsp</result>
    </action>

    <action name="listUser" class="listUserAction">
    <result>/list.jsp</result>
    </action>

    <action name="deleteUser" class="removeUserAction">
    <result name="success" type="redirect">listUser.action</result>
    </action>

    <action name="findUserByUsername" class="loginAction">
    <result name="success" type="redirect">/mainframe.jsp</result>
    <result name="input">/login/login.jsp</result>
    </action>

    <action name="updatePUser" class="updatePUserAction">
    <result name="success">/update.jsp</result>
    </action>

    <action name="updateUser" class="updateUserAction">
    <result name="success" type="redirect">listUser.action</result>
    <result name="input">/update.jsp</result>
    </action>

    <action name="generateExcel" class="generateExcelAction">
    <result name="success" type="stream">
    <param name="contentType">application/vnd.ms-excel</param>
    <param name="contentDisposition">filename="AllUsers.xls"</param>
    <param name="inputName">downloadFile</param>
    </result>
    </action>

    </package>
    </struts>
      

  4.   

    我写过一套socket的东西,和楼主的构想基本一致
    有两点我说一下
    1.你从客户端接收的数据,要放到另一个Thread中处理,不要阻塞当前的收发线程
    2.把HashMap换成Hashtable比较好,Hashtable是线程同步的,不用手动加锁
      

  5.   

    接收到一个连接后,用socket来生成另一个线程,这样当有1000个用户时会启动1000个线程来分别处理而不是就一个线程来处理。
    当对方突然退出时而服务器却还在不停的进行读写的操作这时就会出错,Hashmap中存储的client 可能清空null了。要捕获异常,在客户退出之后可以发送一些像byebye这样的句子来确定客户退了。