站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题Sockets 服务器,通讯方便使用XML文件,请问哪种构架(内有我以前C++方式构架)

Sockets 服务器,通讯方便使用XML文件,请问哪种构架(内有我以前C++方式构架)

摘要: Sockets 服务器,通讯方便使用XML文件,请问哪种构架(内有我以前C++方式构架)


首先,我一直是从事C++编程工作,最近发现JAVA写一些网络相关的程序时工作效率特别高.

所以想做一个JAVA方面的服务器.

其中客户端有长连接,也有短连接向服务器请求数据. 客户端同时可能会有多个.

以前我的C++的服务器设计方式是:
1.事先分配一个线程池,用于处理客户端请求;
2.一个线程专门用户的新连接加入到一个Socket链表,同时将断一的删除;
3.一个线程将各个客户端的数据加到数据请求链表;并同时将链表最后的数据让空闲的线程去处理.

问题一. 不知道改成用JAVA来写是不是不用这么复杂的做了, 大家有什么好的设计方法?

这里要注意的是,有很多长连接也会连接到系统,如果一个SOCKET就开一个线程处理的话,SERVER端会有非常多的线程在运行. 而且经常线程创建关闭,是不是系统的效率也会变低?


问题二.如果用我上面的方式来做的法,客户端有新数据来的话有中断吗?(C++有),如果都要用查询方式的话,系统的效率和实时响应能力都会受到影响? 有什么好办法吗?




看得出来楼主对于网络编程是有相当经验的。

我本人做过一点网络编程方面的东西,谈不上什么经验,就楼主提出的问题,我简单说说我的感觉,谨供参考。

-#62; 问题一. 不知道改成用JAVA来写是不是不用这么复杂的做了, 大家有什么好的设计方法?

用 Java 做 socket 编程,无非是 API 看起来更简洁一些,总的处理思路、设计方法什么的,跟 C++ 没什么大区别。感觉比较突出的一点就是“多线程”用起来特别简单。

-#62; 问题二.如果用我上面的方式来做的法,客户端有新数据来的话有中断吗?(C++有),如果都要用查询方式的话,系统的效率和实时响应能力都会受到影响? 有什么好办法吗?

java.nio.channels.ServerSocketChannel 和 java.nio.channels.SocketChannel 可以用来进行多路异步通信,相当于“中断”吧。


帮你顶一下,顺便学习一下.


谢谢 maquan(-#39;ma:kju) ( )的详细解答.

编写完成后,可以把源码发给你,另外有其它有兴趣共同学习的CSDN网友,写下你的邮箱,完成后可以把代码发给大家共同学习.


maquan(-#39;ma:kju)已经总结的很好了,就不废话了


--#62;这里要注意的是,有很多长连接也会连接到系统,如果一个SOCKET就开一个线程处理的话,SERVER端会有非常多的线程在运行. 而且经常线程创建关闭,是不是系统的效率也会变低?

确实是有问题,所以还是应该使用线程池


感觉不就是个soap服务器吗?现成的软件一堆啊


TO: harshing(西边的太阳)

因为我初学JAVA,对JAVA的现有资源不是很了解,有相关的开源项目吗?



http://java-source.net/
查看其中的Web Servers、Web Services



java的Socket封装得相当好了,不用像C++中还要考虑高低字节,sin_addr什么的了,基本的发送和接受报文像下面写就可以了:

private Socket clientSocket;

public SocketTools(Socket pm_oSocket)
{
clientSocket = pm_oSocket;
}


/*
* @向Socket服务端发送报文
* @Param pm_sMsg 报文信息
*/
public void sendSocketMsg(String pm_sMsg)
{
try
{
PrintStream ous = new PrintStream(clientSocket.getOutputStream());
ous.println(pm_sMsg);
}
catch (IOException e)
{
System.out.println(-#34;Client:Socket发送报文错误-#34;);
}

}
/*
* 接收Socket服务端报文
* return returnMsg
*/
public String getServerMsg()
{
try
{
BufferedReader ins = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
return ins.readLine();
}
catch (IOException e)
{
System.out.println(-#34;Client:Socket接收报文错误!-#34;);
e.printStackTrace();
return null;
}

}


学习!
我写过一个很烂的 socket
http://my.6cncn.cn

希望共同学习!看看原代码吧
laiqinyi@msn.com


↑返回目录
前一篇: 怎么能让文字显示在文本框的中间,而不是从文本框的顶头开始显示???
后一篇: 如何在console窗口输出信息?