最近在学习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中的信息。
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中的信息。
解决方案 »
- smartupload怎么使用
- jsp页面脚本不报错了
- SSH配置出现Servlet action is not available错误!难啊!。。。
- ssh集成出现异常 大家帮我看看 java.lang.ClassCastException: java.lang.Long
- spring+struts+hibernate怎么整合
- 100分 急求 struts2 标签 实现自动勾选功能的代码
- 环境变量配置完了,运行还是找不到javax.servlet包??
- html:form
- hibernate in action,大家帮忙:)
- 急!java读取*.mdb文件,报错java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver
- 怎么才能面试出水平,请给我建议
- 错误 急急..................
唯一标识是不是标志连接的,断开连接时需要去掉
导入了包 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>
有两点我说一下
1.你从客户端接收的数据,要放到另一个Thread中处理,不要阻塞当前的收发线程
2.把HashMap换成Hashtable比较好,Hashtable是线程同步的,不用手动加锁
当对方突然退出时而服务器却还在不停的进行读写的操作这时就会出错,Hashmap中存储的client 可能清空null了。要捕获异常,在客户退出之后可以发送一些像byebye这样的句子来确定客户退了。