Java, C++同时实现SocketServer功能 程序比较

7 篇文章 0 订阅

前面已经写了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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值