[Java聊天室server]实战之五 读写循环(服务端)
前言
学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的“多谋善断";本系列尽管涉及的是socket相关的知识,但学习之前,更想和广大程序猿分享的是一种心境
:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态。比方近期在看网易公开课MIT《算法导论》,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序猿最好还是从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)
原文地址:Building a Java chart server[1]
项目源代码:Socket_Chat
文件夹
正文
通信协议
如今我们已经了解从哪里和client连接,应该谈一谈我们的通信协议
每个client/服务端 系统都会有一个通信协议,它仅仅是用于传输信息到前端和后台的格式。协议能够非常easy但非常难得到小块协议,或者它非常标准精妙以至于已经在全世界内协会正式批准。反正,它是一个协议。
我们将要我们自己的协议,由于在Java语言中是非常easy做到的,并且付出一点就能够得到已经存在的标准协议。我们的协议会非常简单。
Java语言有一套很实用的类,称做DataInputStream 和DataOutputStream。这些类同意你读取和输出底层数据对象(比方整形和字符串)到流中,不考虑它们输出的格式。因为这些类使用同样的格式,并且格式是不会改变的,你能够肯定整数会被写入DataOutputStream,在还有一方面会从DataInputStream读出。
我们的协议会是这个样子:
- 当用户在聊天窗体输入某些事情时,他们的信息作为字符串通过DataOutputStream 传递。
- 当client通过DataInputStream接收信息,它会发送相同的信息给全部用户,相同也会作为字符串通过DataOutputStream传递。
- 用户使用DataInputStream接收信息。
协议就是这样!
—————————————————————————————————————————————————————————————————————————
什么是线程?
Java语言的两个主要长处:网络和多线程。也不是说其它语言就不支持上面的功能 -- 它们也支持。可是Java语言的抽象能够非常简洁地提供这些功能,特别对于商业语言来说。
线程一般定义为单个进程里面独立的控制线。真实的意思是说在同一时间,多线程的程序具有多线程,在其内部具有半自主活动的特点。
多线程类似于一个任务和多任务的概念,除了在一个程序中的多个线程能够共享相同的数据空间的不同。而且这样让风向数据更加直接和有效率 -- 相同变得更加easy混乱,不受控制。
—————————————————————————————————————————————————————————————————————————
循环
如今我们进入核心服务端循环 -- 这是真正聊天工作的代码,让我们看一看:
// 当构造函数调用start()的时候,会在单独的线程里
public void run() {
try {
// 为通信创建DataInputStream;client使用DataOutputStream输出给我们
DataInputStream din = new DataInputStream(socket.getInputStream());
// 一直循环
while (true) {
// ... 读取下一条信息 ...
String message = din.readUTF();
// ... 输入到控制台上 ...
System.out.println("Sending " + message);
// ... 服务端发送它给全部的client
server.sendToAll(message);
}
} catch (EOFException ie) {
// 不须要错误信息
} catch (IOException ie) {
// 须要错误信息,输出至控制台
ie.printStackTrace();
} finally {
// 因某种原因,连接会关闭,所以服务端会处理它
server.removeConnection(socket);
}
}你会注意到我们在多个地方使用了务端对象。
第一个地方时当我们调用server.sendToAll()。实际上是一个非常方便的函数。我们会请求server列举全部连接还有一面的OutputStreams,然后把这些信息写入到这些流中。可是由于这么做是非常频繁,我们把全部的这么工作放到server这端,sendToAll()方法里面。
—————————————————————————————————————————————————————————————————————————
结束语
第二个使用服务端对象的地方会在下一节中提到。
參考文献
[2]. Java sockets 101以及中文系列 JAVA套接字(Socket)101
[3]. Java socket通信基本原理介绍
[Java聊天室server]实战之五 读写循环(服务端)的更多相关文章
- [Java聊天室server]实战之三 接收循环
前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识.但学习之前,更 ...
- [Java聊天室server]实战之二 监听类
前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...
- Java聊天室[长轮询]
今天看到有人分享java实现的聊天室,想起很久以前还在热衷于java的时候也做过一个web聊天室,不拿出来晒晒,可能再也不为人知了,单纯是一个兴趣作品,稳定性不好,也没有考虑连接数和并发的问题,拿出来 ...
- 重构 JAVA 聊天室 —— CS 模式的简单架构实现
前言 自从开始弄起数据挖掘之后,已经很久没写过技术类的博客了,最近学校 JAVA 课设要求实现一个聊天室,想想去年自己已经写了一个了,但是有些要求到的功能我也没实现,但看着原有的代码想了想加功能好像有 ...
- java基于socket的网络通信,实现一个服务端多个客户端的群聊,传输文件功能,界面使用Swing
最近在复习java的io流及网络编程.但复习写那些样板程序总是乏味的.便准备写个项目来巩固.想来想去还是聊天项目比较好玩.如果日后完成的比较好自己也可以用(哈哈哈).并且自己后面也要继续巩固java多 ...
- java 网络编程基础 TCP/IP协议:服务端ServerSocket;客户端Socket; 采用多线程方式处理网络请求
1.Java中客户端和服务器端通信的简单实例 Java中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一 ...
- JAVA学习第六十三课 — 关于client服务端 && URL类 & URLConnection
常见的client和服务端 client: 浏览器:IE:弹窗体,猎豹:弹窗体.多标签,争强效果 服务端: server:TomCat:1.处理请求 2.给予应答 想让TomC ...
- [企业化NET]Window Server 2008 R2[2]-SVN 服务端 和 客户端 安装
1. 服务器基本安装即问题解决记录 √ 2. SVN环境搭建和客户端使用 2.1 服务端 和 客户端 安装 √ 2.2 项目建立与基本使用 √ 2.3 基本冲突解决, ...
- Photon Server初识(六) --- 客户端与服务端消息传递
前一章客户端与服务端连接成功,现在需要前后端进行数据传递. 一.前端发送消息.在项目Scripts目录中新建脚本 TestSer.cs.并挂载到相机上 二.客户端发送数据给服务端.编辑客户端代码 Te ...
随机推荐
- Ruby on Rails 實戰聖經阅读(三)
由于是1.8.x:圣经的1.9.3差太多,所以另外按1.8.X来创建hello world 第一個Hello World!! 1. 创建项目rails -d mysql first 2.创建控制器 ...
- 用内存流 文件流 资源生成客户端(Delphi开源)
正文:很多木马生成器就是用的内存流和文件流生成客户端的,废话不多说了,代码如下: unit Main; interface usesWindows, Messages, SysUtils, Varia ...
- cocos2d-x游戏开发(十五)游戏加载动画loading界面
个人原创,欢迎转载:http://blog.csdn.net/dawn_moon/article/details/11478885 这个资源加载的loading界面demo是在玩客网做逆转三国的时候随 ...
- 基于visual Studio2013解决C语言竞赛题之1087数字变换
题目 解决代码及点评 /************************************************************************/ /* ...
- jquery mobile切换页面的几种方法
jquery mobile切换页面的几种方法 - 不厚道青蛙之焦油潭 - 博客频道 - CSDN.NET jquery mobile切换页面的几种方法 分类: phonegap html5 2012- ...
- hdu1298 T9(手机输入法,每按一个数字,找出出现频率最高的字串,字典树+DFS)
Problem Description A while ago it was quite cumbersome to create a message for the Short Message Se ...
- JavaScript快速入门(四)——JavaScript函数
函数声明 之前说的三种函数声明中(参见JavaScript快速入门(二)——JavaScript变量),使用Function构造函数的声明方法比较少见,我们暂时不提.function func() { ...
- velocity中的velocityCounter不起作用的原因
今天用org.springframework.ui.velocity.VelocityEngineFactoryBean 时,velocityCounter这个变量的时候死活不起作用,折腾了良久也不行 ...
- CSipSimple最新版本号
要使用CSipSimple有两种方法:第一种是不编译jni,另外一种是编译jni. 这里介绍的是第一种:不编译jni. 首先,用SVNclient检出CSipSimple源代码:svn checkou ...
- dialog开发
dialog开发屏幕编程:ok_code在程序里用sy-ucomm接受 调用其他事物代码:call transaction ‘SE38’. 1:50 选择屏幕之屏幕按钮: selection-scre ...
:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态。比方近期在看网易公开课MIT《算法导论》,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序猿最好还是从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)