`
ShXin
  • 浏览: 12941 次
  • 性别: Icon_minigender_2
  • 来自: 天津
社区版块
存档分类
最新评论

通信之增强版服务器

阅读更多

        要做通信,当然不能停留在仅满足于实现它,就算我们一时还做不出像腾讯那样强大的qq,但至少我们可以以之为目标并一步一步做下去。

       我们暂且还用命令行的telnet命令充当客户端,那么,就服务器而言, 在服务器的最简代码基础上,我们可添加的内容还有很多。

        最基本的,不能只发字符而不能发送汉字吧;其次,服务器不能只可以连一个客户端吧;然后,客户端是不是要有用户名和密码才能登录呢;至于聊天,客户端之间要可以群聊吧,服务器要可以给每一个客户端发公告吧;最后的最后,是不是应该给服务器加个界面美化一下呢?

        这些功能,虽然看起来还不及qq的万分之一,但如果连这些最基础的模块都没有,如何一步“登上”qq呢?不要去问:以这样的速度什么时候才能做出来山寨qq。这个问题并没有答案,但肯定的是,不是今天,也不是明天。

        那么,现在,就让我们实现这个增强版的服务器。这里我们定义5个类。

        ChatUI:实现服务器界面并启动服务器。

        ChatThread:处理服务器对象的线程类,每一个ChatThread对象对应一个客户机。

        ChatTools:将某个客户机发来的消息发送给其他客户机。

        DaoTools:生成模拟数据,验证客户端账号。

        UserInfo:用户数据类,每个UserInfo对象存放一个用户的账号。

        以下解释几个主要方法。

        首先是用户名验证,我们只简单的验证用户名是否存在,用户名是我们预先存入数据库的:

//验证是否存在该用户名        
public static boolean checkLogin(UserInfo user){
	if(userDB.containsKey(user.getName()))
		return true;
	System.out.println("认证失败"+user.getName());
	return false;
}
//内存用户信息数据库
private static Map<String, UserInfo> userDB = new HashMap();
//静态块:模拟生成内存中的用户数据,用户名为user1~10
//当程序启动时,这段代码(静态块中的)会自动执行,向userDB中存放数据
static{
	for(int i=0;i<10;i++){
		UserInfo user = new UserInfo();
		user.setName("user"+i);
		user.setPassword("password"+i);
		userDB.put(user.getName(), user);
	}
}
        然后是发送群聊消息的方法,我们分为两种,一种是客户端给其他客户端发送的消息,一种是服务器给所有客户端发送的消息,(sendMsg与最简代码发送消息的类似):
public static void castMsg(UserInfo sender,String msg){
	msg = sender.getName()+" say:"+msg;
	for(int i=0;i<stlist.size();i++){
		ChatThread ctt = stlist.get(i);
		//如果客户端的port与自身不同,才发送消息
		if(ctt.getClient() !=sender.getClient()){
			ctt.sendMsg(msg);
		}
	}
}
public static void castMsg(String msg){
	for(int i=0;i<stlist.size();i++){
		ChatThread ctt = stlist.get(i);
	        ctt.sendMsg(msg);
	}
}
         最后,在线程run()方法中读取客户机发来的消息(closeMe是关闭连接的方法):
InputStream ins=client.getInputStream();
out=client.getOutputStream();
//将输入流ins封装为可以读取一行字符串,也就是以\r\n结尾的字符串
BufferedReader brd = new BufferedReader(new InputStreamReader(ins));
sendMsg("欢迎你来聊天!请输入你的用户名:");
String userName = brd.readLine();
sendMsg(userName+"  请输入你的密码:");
String password = brd.readLine();
user = new UserInfo(client);
user.setName(userName);
user.setPassword(password);
//调用数据库模块,验证用户是否存在
boolean loginState = DaoTools.checkLogin(user);
	if(!loginState){//不存在这个用户账号则关闭
		this.closeMe();
		return ;
	}
ChatTools.addClient(this); //认证成功:将这个对象加入服务器队列
String input = brd.readLine();//一行一行的读取客户机发来的消息
if(!"bye".equals(input)){//一直读取
	System.out.println("服务器收到的是: "+input);
	if(runFlag){
		//读到一条消息后,就发送给其他的客户机去...
		ChatTools.castMsg(this.user, input);
		input = brd.readLine();//读取下一条
	}
}
if("bye".equals(input)){
	if(runFlag)
		ChatTools.castMsg(this.user, "我下线了,再见!");
	this.closeMe();
}
         最基本的模块大概就是这样,只要把它们结合起来,就可以实现增强版的服务器了。
分享到:
评论

相关推荐

    WebSocket网络通信调试工具V1.1增强版.rar

    QT C++ WebSocket网络通信调试工具V1.1增强版,多线程,服务端+客户端二合一,博文地址https://blog.csdn.net/wwplh5520370/article/details/118360069。 1、如有bug,敬请谅解,欢迎在评论区留言,博主会及时修复。...

    短信 服务器版本 中间件

    2. **集成通信**:通达OA短信服务器作为一个中间件,能够与OA系统无缝集成,使得短信发送成为OA工作流程的一部分,提升业务处理的连贯性。 3. **用户验证**:在登录或其他需要身份验证的场景中,短信服务器可以发送...

    E-通信软件1.40版.rar

    E-通信软件1.40版是一款用于电子通信的软件应用程序,主要功能可能包括电子邮件管理、即时消息、文件传输和在线协作等。该版本1.40代表着软件的更新迭代,通常意味着它在前一版本的基础上增加了新特性、修复了已知...

    基于C/C++在Linux上的QTcreator简单tcp通信(服务器转发未完成版)

    在本项目中,我们主要探讨的...开发者可以通过完善`SocketServeTest01.cpp`,使其具备转发或者处理不同类型消息的能力,从而增强服务器的功能。同时,可以优化UI交互,让客户端能够直观地看到通信状态,提升用户体验。

    电信设备-一种通信控制方法及物联网服务器.zip

    在物联网服务器与电信设备的交互中,这种通信控制方法可能旨在优化数据传输效率、增强网络安全性、提升服务质量,或者是为了适应不断增长的连接设备数量。 描述中的信息简洁,但我们可以推测这份PDF文档可能详细...

    基于通信接口封装机制开发网络并发服务器

    基于面向对象通信接口封装机制的网络并发服务器设计不仅提高了并发性和可移植性,还增强了系统的健壮性和扩展性。通过这种方式开发的服务器能够在不同平台上实现高效、稳定且灵活的服务,更好地适应现代网络环境的...

    ESFramework之P2P通信Demophp版v1.0

    **ESFramework之P2P通信Demophp版v1.0**是基于ESFramework.Demos.FileTransfer的一个增强版本,它引入了P2P(Peer-to-Peer)通信技术,允许客户端之间直接进行数据交换,无需通过中央服务器作为中介。这种通信模式在...

    蓝牙通信增强版,支持utf数据传输和回调 封装了客户端和服务器端,支持文件传输,支持文件断点续传

    蓝牙通信增强版,支持utf数据传输和回调 封装了客户端和服务器端,支持文件传输,支持文件断点续传 [注:本内容来自网络,在此分享仅为帮助有需要的网友,如果侵犯了您的权利,麻烦联系我,我会第一时间删除,谢谢您...

    symbian 文件服务器和流存储2

    首先,文件服务器是Symbian操作系统中的核心服务之一,它负责处理文件的创建、打开、读取、写入、关闭以及删除等操作。在Symbian 37版本中,文件服务器可能已经进行了优化和增强,以提高性能和稳定性。文件服务器...

    电信设备-客户端与服务器之间通信动态密钥实现方法.zip

    动态密钥的实现方法是确保这种通信安全的重要技术之一。本文件“客户端与服务器之间通信动态密钥实现方法”深入探讨了这一主题,旨在提供一种高效且安全的数据交换方案。 动态密钥,也称为一次性密码或会话密钥,是...

    浪潮 NF5270M4 最新版 BIOS+BMC FW 服务器固件

    【标题】"浪潮 NF5270M4 最新版 BIOS+BMC FW 服务器固件" 涉及的关键技术点主要包括服务器硬件管理、BIOS(基本输入输出系统)和BMC(Baseboard Management Controller)固件升级。这些是IT基础设施管理中的核心组件...

    Windows网络与通信程序设计 (第2版) 扫描版 pdf

    这意味着它可能在第一版的基础上进行了更新和改进,可能包括了最新的Windows网络技术和通信协议、增强了对网络安全的讨论,或是提供了对新API和工具的介绍。 通过描述中的作者“王艳平”,我们可以了解到,作者可能...

    多媒体通信技术 王汝言

    10. **未来趋势**:5G、物联网(IoT)、云计算和边缘计算等新技术正在推动多媒体通信向更高带宽、更低延迟、更大规模方向发展,例如VR/AR(虚拟现实/增强现实)应用。 《多媒体通信技术》这本书可能还会涉及编码...

    HTTP Web 代理服务器

    然而,对于更复杂的场景,如处理HTTPS(加密的HTTP)流量,或者支持其他协议如FTP,这个简单的代理服务器可能需要进一步的扩展和增强。 总的来说,HTTP Web代理服务器是网络通信中的一种常见工具,它在客户端和...

    Mac 下搭建XMPP服务器之openfire

    4. 连接XMPP客户端:搭建好服务器之后,可以使用各种支持XMPP协议的即时通信客户端来连接这个服务器进行通信。此时,服务器已经可以承载基本的消息传递和状态展示功能。 额外说明: - 在安装和配置过程中,一定要...

    PC与GPRS通讯服务器试用版源码

    【标题】:“PC与GPRS通讯服务器试用版源码”揭示了这是一份用于建立PC与GPRS网络之间通信的服务器端源代码。在IT领域,GPRS(General Packet Radio Service)是一种移动通信技术,它允许通过移动网络进行数据传输,...

    CANopen应用层和通信协议(中文版)_CiA301

    ### CANopen应用层和通信协议(中文版)_CiA301 #### 知识点解析 **一、概述** CANopen作为一种广泛应用于工业自动化领域的开放式现场总线协议,其核心价值在于提供了标准化的应用层协议,使得不同厂商的设备能够...

    wps203打印机服务器调试工具tool_V6版

    4. **网络诊断**:包括端口扫描、IP冲突检查等功能,确保打印机服务器在网络中的正常通信。 5. **性能监控**:实时监测服务器的CPU、内存、硬盘等资源使用情况,及时发现性能瓶颈。 6. **固件升级**:支持一键固件...

Global site tag (gtag.js) - Google Analytics