`
草帽当家的
  • 浏览: 24941 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论
阅读更多
        学习通信有将近一个月的时间了,从创建一个简单的服务器到今天用XMPP协议与字节流协议实现服务器与客户机的交互这段过程中,不仅感受到了自己技术上的薄弱,更体会到了作总结的必要性——一方面为自己的学习进度做一个记录,一方面对技术上做一些查漏补缺,更重要的是作总结对我来说还是一件强力而为的事。
一、创建简单服务器
        每台机器都有自己的IP地址,每个服务器都有自己的端口号,只要提供一个没被占用的端口号,就可以创建服务器了。得到服务器的Socket对象,取得输入输出流,然后用telnet软件与服务器进行连接。(每台电脑有0-65535个端口号,我们一般会用1024之后的端口号,0-1024之间的端口号都是知名端口号,一般已被占用!)
/**
	 * 创建服务器
	 */
	public static void setUpServer(int port){
		try{
			//创建服务器
			ServerSocket sc = new ServerSocket(port);
			while(true){
				//服务器阻塞等待客户机的接入
				Socket client = sc.accept();
				//从连接对象上获取输入输出流
				OutputStream ops = client.getOutputStream();
				InputStream ips = client.getInputStream();
				String str = "welcome to server!\r\n";
				ops.write(str.getBytes());//将欢迎信息写到输出流中
				ops.flush();
				int input = 0;//一个字节一个字节的读取客户机的输入
				while(13!=input){
					input = ips.read();//读取客户端输入的信息
				}
				client.close();//关闭与客户端的连接对象
			}
		}catch(Exception ep){
			System.out.println("错误的端口号:"+port);
		}
	}

           //读取字符串的方法(读取小数据)
	          byte[] b = new byte[1024];
	          int length = ips.read(b);
	          String msg = new String(b,0,length);

        当清楚了这一点:数据的发送是以一个一个的bit在网络中传输的(通常理解为是一个一个字节在网络中传输的),之后我们对输入输出流的操作以及对整个通信流程的处理就显得清晰了。
二、多线程服务器
        第一个简单服务器有很大的缺陷,只能同时在线一个用户,这种情况是不允许的,我们必须用线程去控制客户端与服务器的连接,这样才能同时有多个用户共用一个服务器。实现很简单,只要把所有与服务器的连接对象并读取信息的方法放到一个线程中就可以了。
//在指定的端口上启动服务器
	public void setupServer(int port){
		try {
			//在指定端口上创建服务器
			ServerSocket sc = new ServerSocket(port);
			System.out.println("服务器创建成功:"+port);
			while(true){
				Socket client = sc.accept();//阻塞等待中
				System.out.println("进入一个客户机连接:"+client.getRemoteSocketAddress().toString());
				//启动一个处理线程,去处理这个连接对象
				ServerThread ct = new ServerThread(client);
				ct.start();
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

三、群聊服务器的实现
        当一个用户上线时,服务器会验证它的个人信息是否符合登录条件,如果登录成功,服务器会发送当前在线人数,发送给所有用户当前用户的上线信息,当有人下线时,服务器会发送当前用户的下线信息给其他所有在线用户,并且程序能实现群聊的功能。
        程序看起来有些复杂,如果我们把所有的发送与接收消息的方法都定义在同一线程类中,那样会更麻烦,这时就开始考虑设计上的一些东西了。一个类只干一件相同的事,将用户信息封装(以便以后的扩展),创建辅助类——提供静态的方法,用来从队列中添加、删除好友,通知好友上线或下线的信息,只管其他类进行调用。这样一来解结构就清晰化了!
public class ChatTools {
	//存储线程的队列
	private static List<ServerThread> stList = new ArrayList();
	private ChatTools(){}
	//将消息发送给每个在线用户
	public static void castMsg(UserInfo sender,String msg){
		msg = sender.getName()+"说:"+msg;
		for(int i=0;i<stList.size();i++){
			ServerThread st =stList.get(i);
			st.sendMsg2Me(msg);
		}
	}
	//将上线用户添加到队列中,发送在线人数
	public static void addClient(ServerThread ct){
		stList.add(ct);
		castMsg(ct.getOwerUser(),"我上线啦!目前人数"+stList.size());
		
	}
	//将下线客户从队列中删除
	public static void removeClient(ServerThread ct){
		stList.remove(ct);
	}
}

/** 
 * 用户数据封装类,方便以后扩展
 * @author Administrator
 *
 */
public class UserInfo {
	private String name;
	private String pwd;
	private String loginTime;
	private String address;
	//以下是get()set()方法
}

四、简单客户端
        当理解了服务器的创建方法之后,学习客户端就变的很简单了,只要知道服务器的IP地址与创建在哪个端口号上就可以搞定了,基本的通信流程和服务器别无二致。
五、XMPP风格协议应用
        只做服务器很简单,只做客户端也不难。但是要把两者一起做,再加上界面与自定义协议之后,就显得不是那么轻松了(例如:<msg><name>用户名</name></msg>,当然这条协议我们要解析的是用户名,可以用String类中的方法,也可以用dom4j创建并解析(个人喜欢比较优雅的 )同时,协议的制定也会影响整个程序的设计)。流程还是那个流程,但是要同时处理客户端与服务器,复杂程度就会大很多,而且还有很多不确定因素。
        首先是理清通信流程的问题,制定通信流程图,分清什么是同步消息什么是异步消息——同步消息:在我们注册或登录服务器时,首先客户端要发送请求信息,服务器收到请求信息解析并进行信息验证,然后返回注册或登录状态信息,客户端收到信息解析并判断成功或失败,然后进行相应的操作。异步消息:当客户端发送聊天信息时,不考虑服务器是不是收到,或者发送到其他客户端,我只管发我的,与你无关。这一类的消息必然要在run()方法中处理了!
        然后是关于类与方法的制定,客户机与服务器都要解析XML协议,所以我们将解析的方法放到一个util包下,服务器和客户端共用包里的方法,大大的减少了代码量。还有一些用户数据的封装类,存储用户线程发送上线下线的相关类的处理。(凭我现有的编程能力,只能尽量的让每个类处理同一件事,让每个方法只处理一件事!)
        最后就是关于验证,每写一步验证一步,把每个小问题解决了,大的问题也就迎刃而解了。(说的容易,做起来真的很难!)
        当然,不管在简单的服务器还是在XMPP中都遇到了这样或那样的问题,有些问题很幼稚,有些问题还没解决,这里只要谈到了自己的一些思路。关于字节流协议(文件头+文件体,相对与XMPP更严谨一些),对程序的设计上会有更多的问题,对于方法的设计会面临更多问题,这些都留待以后解决。
1
0
分享到:
评论

相关推荐

    一步一步学习 iOS 6 编程

    《一步一步学习 iOS 6 编程》是一本针对初学者的iOS开发教程,特别适合对iOS编程感兴趣的读者。第四版的更新确保了内容与当时的最新技术保持同步,为读者提供了全面且与时俱进的学习路径。该书以清晰易懂的方式介绍...

    一步一步学ActionScript 2

    在"一步一步学ActionScript 2"的学习资源中,你将深入理解这种语言的基础和高级特性,从而能够熟练地构建动态Flash项目。 首先,你需要了解ActionScript 2的基本语法,包括变量声明、数据类型(如Number、String、...

    一步一步学PLC编程(施耐德SoMachine)

    标题中的“一步一步学PLC编程(施耐德SoMachine)”揭示了这是一份关于学习施耐德品牌PLC编程的教程,特别是使用其专有的软件工具——SoMachine。SoMachine是一款集成化软件,用于编程、配置和调试施耐德电气的...

    一步一步学习+iOS+6编程(第四版)

    在“一步一步学习+iOS+6编程(第四版)”这本书中,你将深入探索iOS开发的基础与进阶知识,尤其关注iOS 6这个特定版本。这本书是针对初学者和有一定经验的开发者,旨在通过实例和逐步指导,帮助你掌握苹果移动平台上的...

    手把手教你做项目一步一步学PLC编程三菱

    《手把手教你做项目一步一步学PLC编程三菱GXWorks2》是由文杰编著的一本专为初学者和进阶者设计的PLC编程教程,主要聚焦于三菱公司的PLC产品,特别是其编程软件GX Works2的应用。这本书详细介绍了如何通过实际项目来...

    一步一步教你学linux网络编程

    Linux网络编程是操作系统中一个重要的领域,涉及到网络通信的基础知识,特别是对于开发服务器端应用程序的开发者来说至关重要。本文将引导初学者逐步理解Linux环境下的网络编程,主要关注于使用套接口(Socket)进行...

    [一步一步学习linux汇编语言程序设计].Assembly.Language.Step-by-Step.-.Programming.with.Linux,.3rd.Edition.Oct.2009

    本书《一步一步学习Linux汇编语言程序设计》是针对这一主题的详细教程,旨在帮助读者从零开始掌握汇编语言在Linux环境下的编程技巧。 汇编语言是计算机系统的基础,它与机器语言相对应,每条指令都对应着机器可以...

    零基础无实物一步一步学PLCS7-1200仿真(十)-两个1200单边S7通信

    项目目的:学习通信基本原理,通信相关的指令。 项目功能:通过S7通信,主CPU只有启动按钮,从CPU只有灯。主CPU操作点击启动按钮后,从CPU通过通信收到指令,点亮其控制的灯。 完成了基本指令的学习,让我们来学习...

    一步一步学习QT编程

    "一步一步学习QT编程"的资源旨在为初学者提供一个深入理解QT的平台,通过实际的程序代码和逐句分析,帮助新手快速掌握QT编程的核心概念和技术。 首先,QT库提供了丰富的组件,用于构建跨平台的桌面、移动和嵌入式...

    一步一步教你51_PC串口通信

    在电子工程和嵌入式系统领域,51单片机是一种广泛应用的微控制...本教程的详细步骤和示例代码应包含在"一步一步教你51_PC串口通信"的压缩包文件中,通过学习和实践,你将能够熟练掌握51单片机与PC之间的串口通信技术。

    一步一步学Silverlight 2

    《一步一步学Silverlight 2》是由MS MVP李会军精心编写的教程,旨在为学习者提供一条清晰易懂的学习路径,逐步深入Silverlight 2的世界。这个教程是经典的教育资源,适合初学者和有一定基础的开发者,帮助他们掌握...

    一步一步学Silverlight_2系列

    《一步一步学Silverlight_2系列》是一份针对初学者精心编写的教程,旨在帮助读者深入理解和掌握Microsoft的Silverlight 2技术。Silverlight是微软推出的一种富互联网应用程序(RIA)平台,它允许开发者创建交互性强...

    一步一步学silverlight

    本书《一步一步学Silverlight》非常适合Silverlight初学者阅读,内容覆盖了从基础知识到高级技巧的各个方面。通过本书的学习,读者不仅能够掌握Silverlight的基础知识,还能够了解到如何利用Silverlight开发出高质量...

    一步一步学习linux汇编语言程序设计

    ### 一步一步学习Linux汇编语言程序设计 #### 概述 《一步一步学习Linux汇编语言程序设计》是一本深入浅出地介绍Linux环境下汇编语言编程的书籍。本书由Jeff Duntemann撰写,并由Wiley Publishing, Inc.出版,是其...

    一步一步学ZedBoard & Zynq

    《一步一步学ZedBoard & Zynq》是一个全面的学习资源,涵盖了从基础到高级的ZedBoard和Zynq 7000系列 FPGA(Field-Programmable Gate Array)应用知识。ZedBoard是一款基于Xilinx公司的Zynq-7000 All Programmable ...

    老师教你一步一步学会学精单片机

    本教程“老师教你一步一步学会学精单片机”,旨在帮助初学者从零基础开始,逐步掌握单片机的原理和应用。通过详细的学习过程,你将不再对单片机感到困惑,能够从菜鸟逐渐晋升为高手。以下是一些关键的知识点: 1. *...

    wcf一步一步学习资料

    通过这个“WCF一步一步”学习资料,你可以系统地了解并实践WCF的各种概念和技术,从创建基本服务到处理复杂的安全性和会话管理,逐步成长为一名熟练的WCF开发者。在学习过程中,不断实践和调试,将理论知识转化为...

    一步一步学电脑装机,菜鸟速成版

    "一步一步学电脑装机,菜鸟速成版"旨在为新手提供清晰、易懂的装机指南。以下是一些关键的知识点,涵盖了从硬件选购到系统安装的全过程。 首先,选择合适的硬件是装机的第一步。电脑的主要硬件包括:CPU(中央处理器...

Global site tag (gtag.js) - Google Analytics