`
zlele
  • 浏览: 37452 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

通信基础

阅读更多
       1.A和B两个机器要通信时,是A,B对应的程序要连接通信,就要知道对方的地址,通常所说的IP地址,它是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,即我们可以通过ip地址来确定一台机器,但是仅仅确定机器还不够,还要知道它所对应开放的是那个端口号,以便我们和对应的程序连接。
//建立绑定在指定端口上的服务器对象
		ServerSocket server=new ServerSocket(port);
		while(true){
	                //让服务器进入等待状态:阻塞状态	
		Socket client=server.accept();
		//从连结对象上得到输入输出流对象
                                OutputStream out=client.getOutputStream();
                                InputStream ins=client.getInputStream();

此处循环的意义在于让服务器保持随时等待客户机来接的状态
(ps:客户机与服务器:在第一次连接中,主动请求的是客户机;等待连接的是服务器)
(ps:端口号0--65535,其中0--1024应避免使用,它们为知名端口)
        创建好了服务器,就要传送数据,输入流读取,输出流发送,传送的都是字节,所以在传送时要做字节和字符串的转换。
        字符串转为字节

       
String s="你好,欢迎来javaKe.com\r\n";
        //取得组成这个字符串的字节
        byte[] data=s.getBytes();
       //用输出对象发送!
       out.write(data);
       out.flush();//强制输出
      //最后关闭与客户机的连结
       client.close();

字节转为字符串
        /**
 * 从输入流中读取字节并拼成字符串 13为间断标识
 * @param ins 输入流
 * @return    读到的字符串
 */
private String readString(InputStream ins) throws Exception{
	//创建一个字符串缓冲区
	StringBuffer stb=new StringBuffer();
	char c=0;
	while(c!=13){
		int i=ins.read();//读取客户机来的一个字节
		c=(char)i;
		stb.append(c);
	}
	String inputs=stb.toString().trim();
	return inputs;
}
     
       2.上边实现了一对一连接,当有两个或多个客户机想连接时,就要用到线程,将每一个连接对象Socket交给一个线程处理,就不必等待。即将连接方法写在线程中
public void run(){
//在线程run中调用处理连结的方法
processChat(this.client);
//处理方法执行完毕后,线程自己即退出...
}

在服务器中启动线程
         3.现在多个客户机可以同时与服务器连接,但只能显示自己的消息,看不到其他客户机的消息,下一步实现登录和所有客户端的消息接收。先要有一个用户的bean,包含用户帐号,密码等
        然后登录,要有帐号和密码,一般情况是存在数据库中,然后进行查找是否存在此用户,这里可以使用“静态块”(“静态块”装载时就执行,即在属性初始化之前执行)在Dao类中初始化成员

//内存用户信息
	private static Map<String,UserInfo> userDB=new HashMap();
	//静态块:模拟生成内存中的用户数据
	//当程序启动时,这段代码会自动执行,向userDB中存放数据
	static{
		for(int i=0;i<10;i++){
			UserInfo user=new UserInfo();
			user.setName("user"+i);
			user.setPw("pw"+i);
			//将指定的值与此映射中的指定键关联
			userDB.put(user.getName(), user);
		}
	}

(ps:关于静态块      java中的自由块分为静态的和非静态的   静态的即static{}   class文件加载时执行一次,一般用来初始化静态变量的值;非静态自由块可以执行多次,初始化即会执行)
           登录成功之后发消息时消息要发送到每一个客户端,即每个线程都要显示消息,遍历线程,显示消息ChatTools类

	private static List<ServerThread> stList=new ArrayList();
/**
	 * 让所有用户看到消息
	 * @param sender 发送者用户对象
	 * @param msg    要发送的内容消息
	 */
	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);
			try {
				//每个线程对象都会输出此信息
				st.sendMsg2Me(msg);//发送消息给每一个客户机
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
               登录和发消息完成之后,要写线程,线程中要执行的方法:验证用户,读消息
               //处理客户机进入的连接对象
private void processChat(){
	try {
		out=client.getOutputStream();
		InputStream ins=client.getInputStream();
		//字节快速转为字符串
		BufferedReader brd= new BufferedReader(new InputStreamReader(ins));
		sendMsg2Me("欢迎你来聊天!,请输入你的用户名:");
		//读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行
		String userName=brd.readLine();
		sendMsg2Me(userName+",请输入你的密码:");
		String pwd=brd.readLine();
		user=new UserInfo();
		user.setName(userName);
		user.setPw(pwd);
		//调用数据库模块,验证用户是否存在
		boolean loginState=DaoTools.checkLogin(user);
		if(!loginState){//不存在这个用户账号则关闭
		    this.closeMe();
		    return ;
		  }
		//认证成功:将这个对象加入服务器队列
		ChatTools.addClient(this); 
		//一行一行的读取客户机发来的消息
		String input= brd.readLine();
		while(!"bye".equals(input)){//一直读取
		    System.out.println("服务器收到的是: "+input);
		    //读到一条消息后,就发送给其他的客户机去...
		    ChatTools.castMsg(this.user, input);
		    input= brd.readLine();//读取下一条
		}
	}catch(Exception ef){
                      ef.printStackTrace();
	}
	ChatTools.castMsg(this.user, "我下线了,再见!");
	this.closeMe();//关闭服务器方法 
	}

             最后就是服务器连接
分享到:
评论

相关推荐

    无线通信基础(中文版)

    《无线通信基础介绍无线通信的基本原理,着重强调概念及其在系统中的实现之间的相互影响,涉及的主要问题有MIMO通信、空时编码、机会通信、OFDM和CDMA等,这些概念均利用无线系统的大量实例予以说明。书中还配有大量...

    数据通信基础 习题与答案

    "数据通信基础习题与答案" 数据通信基础是计算机网络和通信领域中的基础知识,涵盖了数据通信的基本概念、技术和原理。本资源提供了大量的数据通信基础习题,旨在帮助学习者掌握数据通信的基础知识。 一、噪声 1....

    数据通信基础知识

    一、数据通信基础 1. 定义:数据通信是指在两个或多个设备之间通过信道传输数据的过程。这些设备可以是计算机、服务器、传感器或其他网络设备。 2. 组成部分:数据通信系统由五部分组成:发送方、接收方、信源...

    无线通信基础及应用资料

    本资料“无线通信基础及应用”由魏崇毓编著,旨在提供一个全面且系统的无线通信理论与实践知识框架。 首先,我们要了解无线通信的基本原理。无线通信依赖于电磁波的传播,这些电磁波在空气中以光速传播,使得信息...

    无线通信基础及应用(魏崇毓)第1-3章

    本资料“无线通信基础及应用(魏崇毓)第1-3章”是针对这一主题的深入讲解,主要涵盖了无线通信的基础理论、关键技术以及实际应用。以下是基于这三个章节的详细解读: 第一章:无线通信基础 在这一章中,我们首先会...

    无线通信基础 David Tse 中英

    《无线通信基础》是David Tse撰写的一本经典教材,主要涵盖了无线通信领域的核心理论与实践知识。这本书的中文版和英文原版都被包含在这个压缩包中,为学习者提供了便利,可以方便地进行对照阅读,提高理解效果。 ...

    无线通信基础_中文版

    无线通信基础_中文(Fundamentals of Wireless Communication)

    通信基础知识.ppt

    通信基础知识是IT领域中的核心部分,它涉及到计算机和网络如何传递信息的基本原理。这份名为"通信基础知识.ppt"的文件涵盖了多个关键概念,包括计算机基础知识、数字信号处理以及通信系统中的抽样、量化、编码、译码...

    建设工程配建5G移动通信基础设施技术标准.pdf

    建设工程配建5G移动通信基础设施技术标准指的是在进行建设工程时,为了配合未来的移动通信技术,特别是第五代移动通信技术(5G)的部署,而制定的一系列技术规范和要求。这些标准确保了5G网络在新的建筑或项目中能够...

    《无线通信技术》教学课件-第1章无线通信基础.pdf

    《无线通信技术》教学课件-第1章无线通信基础.pdf《无线通信技术》教学课件-第1章无线通信基础.pdf《无线通信技术》教学课件-第1章无线通信基础.pdf《无线通信技术》教学课件-第1章无线通信基础.pdf《无线通信技术》...

    数字通信基础电子版(仇佩亮版)

    此为数字通信基础电子版教程(仇佩亮版),通信专业学生推荐学习教程。

    《无线通信基础》(David_Tse).pdf

    《无线通信基础》(David_Tse)

    数据通信基础ppt

    数据通信基础是信息技术领域中的重要概念,主要涉及数据在不同设备之间传递的方式和机制。数据通信的基本概念包括数据的形式、传输方式以及同步机制等。在数据通信中,数据通常表现为字母、数字和符号的组合,这些...

    无线通信基础知识!高频基础资料

    无线通信基础知识 无线通信基础知识 无线通信基础知识

    移动通信基础知识

    移动通信基础知识是信息技术领域中的一个重要组成部分,特别是在当今无线通信飞速发展的时代。本文将深入探讨移动通信的基础,尤其是第二代移动通信技术(2G)的核心——GSM(全球系统 for 移动通信)业务。 首先,...

    无线通信基础David Tse

    《无线通信基础》是David Tse教授的著作,他在加州大学伯克利分校的学术地位使这本书在无线通信领域享有极高的声誉。这本书是学习无线通信领域的经典教材,旨在为学生和专业人士提供全面、深入的无线通信理论知识。 ...

    数字通信基础[仇佩亮等编著][电子教案]

    《数字通信基础》是由仇佩亮等专家编著的一本深入浅出的教材,主要针对数字通信领域的基础知识进行详尽的阐述。这本书是电子教案的形式,通常包含课件、讲义、习题解答等丰富的教学资源,旨在帮助学生和教师更好地...

    无线通信基础(剑桥大学出版社)

    ### 无线通信基础知识点概述 #### 一、无线通信理论的发展与应用背景 - **物理层无线通信理论的发展**:过去十年间,物理层无线通信理论取得了诸多进展,并被广泛应用于无线系统中。 - **统一视角下的无线通信基础...

Global site tag (gtag.js) - Google Analytics