[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 ...
随机推荐
- C++智能指针的实现
说起智能指针,不少人都不陌生.比方auto_ptr.shared_ptr.unique_ptr.weak_ptr. 依据shared_ptr的功能,自己仿造也实现了个. 对于shared_ptr这样的 ...
- Thinking in UML 学习笔记(一)——建立对象模型
一.面向对象的本质 面向对象的本质是抽象,当系统达到了超越其处理能力的程度,我们能够抽象出我们能够处理的范围来提成抽象级别,这样就能够构建更大.更复杂的系统. 现实世界和对象世界之间存在着一道沟壑,这 ...
- SQL Server Join方式
原文:SQL Server Join方式 0.参考文献 Microsoft SQL Server企业级平台管理实践 看懂SqlServer查询计划 1.测试数据准备 参考:Sql Server中的表访 ...
- Last_IO_Errno: 1236 Last_IO_Error: Got fatal error 1236 from master when reading data from binary lo
mysql> show slave status\G *************************** 1. row *************************** ...
- android优化原理
时间换时间: 数据的异步载入 分批载入. 开机加速. 时间换空间: 分页. 空间换时间: everything.exe 音乐 图库 在开机启动后, sd卡被挂载 生成数据库. 空间换空间: 8G内存 ...
- C++ 观察者模式样例
C++ 观察者模式样例 #include <iostream> #include <set> #include <string> using namespace s ...
- Servlet的学习之ServletContext(2)
本篇接上篇<Servlet的学习(五)>,继续从ServletContext对象中的方法进行学习,在这一篇中,我们重点关注的是ServletContext对象中对于在web工程中的资源文件 ...
- 14.1.2 Checking InnoDB Availability 检查InnoDB 可用性:
14.1.2 Checking InnoDB Availability 检查InnoDB 可用性: 确认你的server 是否支持InnoDB,使用 SHOW ENGINES 语句.(默认MySQL的 ...
- 移动端网页JS框架-手机触摸事件框架,日历框架带滑动效果
swiper.js,hammer.js,mobiscroll http://www.mobiscroll.com/ 日历
- VC,一条会被鼠标移动的直线
对话框中的小红线可以被移动的 一.类名是 CBinarizationDlg 二.定义两个变量BOOL m_flag;int nPos;在构造函数初始化m_flag = false;nPos=256;三 ...