[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 ...
随机推荐
- Ural1109_Conference(二分图最大匹配/匈牙利算法/网络最大流)
解题报告 二分图第一题. 题目描写叙述: 为了參加即将召开的会议,A国派出M位代表,B国派出N位代表,(N,M<=1000) 会议召开前,选出K队代表,每对代表必须一个是A国的,一个是B国的; ...
- hdu1391(Number Steps )
Problem Description Starting from point (0,0) on a plane, we have written all non-negative integers ...
- fzu 2035 Axial symmetry(枚举+几何)
题目链接:fzu 2035 Axial symmetry 题目大意:给出n个点,表示n边形的n个顶点,判断该n边形是否为轴对称图形.(给出点按照图形的顺时针或逆时针给出. 解题思路:将相邻两个点的中点 ...
- call、apply以及bind
call与apply都可以改变js的this指向,两者最主要的区别就是使用时传参的不同,apply的参数可以以数组的形式传进来,但是call方法的参数必须要一个一个的传进来,就像这样. func.ca ...
- 实现浏览器遗漏的原件 jQuery.selectCheckbox
工作中遇到了一个下拉需要实现checkbox的效果,如下图 或许网上已经有实现了,但简单的功能自己实现就好了, 结构 <div class="form-control-wrap&quo ...
- delphi中覆盖最大化消息(覆盖WM_GETMINMAXINFO消息)
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; ...
- log4net概述
log4net概貌 log4net是一个框架,用来记录日志的框架.为什么要记录日志呢?每个程序员都不能保证自己的程序完全没有错误,可是当程序已经部署的时候出现错误怎么办?我们这时候就要根据我们的日志文 ...
- 基于visual Studio2013解决面试题之0501上台阶
题目
- 【图像识别】 图像处理和图像分析(leptonica)leptonica-1.68安装配置 (vs2008)
Leptonica Leptonica is a pedagogically-oriented open source site containing software that is broadly ...
- python模块介绍- HTMLParser 简单的HTML和XHTML解析器
python模块介绍- HTMLParser 简单的HTML和XHTML解析器 2013-09-11 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq ...
:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态。比方近期在看网易公开课MIT《算法导论》,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序猿最好还是从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)