前面已经写了Java, C++同时实现SocketClient功能 程序比较,比较了java,c++写TcpClient程序的不同,今天比较TcpServer程序的不同
分别用java,C++写了2个程序,程序实现功能相同,都是socket服务器通信,主要的功能就是对收到的数据进行转发。‘
服务器转发模式在一些网络服务中非常常见,可以说是一些网络通信服务器的基础,它的通讯模式一般如下图:
具有独立公网IP的服务器,此服务器的配置一般都很好,因为他可能会无时不刻的进行的巨大的数据的处理与存储。
假入client B要发送字符串Hello到Client A,因为 A, B不一定具有公网IP,而且A也不知B是否在网络上,即使B在网络上A也不知道B的IP和端口是什么,即使A知道B的IP和端口,B的IP也极有可能是局域网IP,所以为了A能够与B顺利通信,一般的方法是A与B同时连接到具有一个公网IP的服务器上,由服务器进行数据的处理与转发,一些大型的即时通信聊天软件采用的就是这种模式,当然要实现真正的聊天可能还得有登陆权限管理等,但是数据转发模式是一些聊天软件的基础。
数据转发服务器UI尽可能的相同,如下图
以C++编写为例,实现的功能非常简单,就是一个客户端发出的数据发给所有的在线的非自己的客户端,
以图中的数据为例就是IP192.168.1.77的客户端把数据转发给IP192.168.1.254,而192.168.1.77发出的数据自己不能收到;同时IP192.168.1.254的客户端把数据转发给IP192.168.1.77,而192.168.1.77发出的数据自己不能收到。
开始比较:
1.比较大小
2.比较源码个数
c++
java
只有一个
SocketServer.java
3.比较源码大小:
C++
java
表面的比较就是这些。
一些编程方面的差别请参考Java, C++同时实现SocketClient功能 程序比较
除了这些还有一些区别印象较深的就是C++的异步处理实在是非常的方便,在源码里面根本体现不出来进程;java中对消息的处理就是不断的开进程,一个客户端一个进程;
在java里面写了一个类中类实现了runnable接口
class Server implements Runnable{
public void run() {
try {
ss = new ServerSocket(Integer.parseInt(tfPort.getText()));
} catch (IOException e) {
System.out.println("启动失败");
addLog("服务器启动失败,请查看端口是否已被占用");
// bStart = false;
return;
}
addLog("服务器启动成功,端口号:" + ss.getLocalPort());
try {
tfIP.setText(InetAddress.getLocalHost().getHostAddress().toString());
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
while (bStart) {
Socket s = null;
try {
s = ss.accept();
Client c = new Client(s);
clients.add(c);
displayClients();
new Thread(c).start();
} catch (IOException e) {
System.out.println("服务器被关闭");
bStart = false;
// e.printStackTrace();
}
}
try {
if(ss != null)
ss.close();
StartServer.setLabel("打开服务器");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在开启服务器的按键中启动了这个进程
StartServer.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
if(bStart) {
bStart = false;
StartServer.setLabel("打开服务器");
addLog("服务器已经关闭");
for(int i = 0; i < clients.size(); i++) {
clients.get(i).close();
}
//clients.clear();
try {
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ss = null;
} else {
bStart = true;
StartServer.setLabel("关闭服务器");
new Thread(new Server()).start();
}
}
});
C++非常简单在开启服务器的按键中仅仅写了两句话就OK了
if (!listenSocket->Create(m_port))
// 创建服务器的套接字,IP地址默认本机IP
{
AfxMessageBox(_T("服务器启动失败,请查看端口号 ")+port+_T(" 是否被占用!"));
UpdateEvent(_T("服务器启动失败,请查看端口是否已被占用!"));
listenSocket->Close();
return;
}
if (!listenSocket->Listen())
{
AfxMessageBox(_T("监听失败!"));
listenSocket->Close();
return;
}
看起来做网络数据处理还是C++比较方便,参考了 MFC tcpserver转发数据 编程思想使程序编写大大简化。
当然这只是基础,实际中可能还需要用户登录,权限管理,数据库连接等;数据不能乱转发啊,得有目的性;还有就是客户不在线怎么处理;客户端掉线服务器清除死链(超时,心跳包)等。
当然java和C++还有一个非常重要的区别是跨平台型,C++程序只能运行在windows操作系统,而Java编写的程序可以通过jre允许在linux系统上运行,而目前服务器的模式由于linux的开源和linux的健壮性,linux服务器还是比较受大家青睐,java运行linux服务器还是比较常见的。
程序下载地址:SocketServer
更多资料请:web.nenewind.com