前言

学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的“多谋善断";本系列尽管涉及的是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()方法里面。

—————————————————————————————————————————————————————————————————————————

结束语

第二个使用服务端对象的地方会在下一节中提到。

參考文献

[1]. Building  a Java chart server

[2]. Java sockets 101以及中文系列 JAVA套接字(Socket)101

[3]. Java socket通信基本原理介绍

[Java聊天室server]实战之五 读写循环(服务端)的更多相关文章

  1. [Java聊天室server]实战之三 接收循环

    前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识.但学习之前,更 ...

  2. [Java聊天室server]实战之二 监听类

    前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更 ...

  3. Java聊天室[长轮询]

    今天看到有人分享java实现的聊天室,想起很久以前还在热衷于java的时候也做过一个web聊天室,不拿出来晒晒,可能再也不为人知了,单纯是一个兴趣作品,稳定性不好,也没有考虑连接数和并发的问题,拿出来 ...

  4. 重构 JAVA 聊天室 —— CS 模式的简单架构实现

    前言 自从开始弄起数据挖掘之后,已经很久没写过技术类的博客了,最近学校 JAVA 课设要求实现一个聊天室,想想去年自己已经写了一个了,但是有些要求到的功能我也没实现,但看着原有的代码想了想加功能好像有 ...

  5. java基于socket的网络通信,实现一个服务端多个客户端的群聊,传输文件功能,界面使用Swing

    最近在复习java的io流及网络编程.但复习写那些样板程序总是乏味的.便准备写个项目来巩固.想来想去还是聊天项目比较好玩.如果日后完成的比较好自己也可以用(哈哈哈).并且自己后面也要继续巩固java多 ...

  6. java 网络编程基础 TCP/IP协议:服务端ServerSocket;客户端Socket; 采用多线程方式处理网络请求

    1.Java中客户端和服务器端通信的简单实例 Java中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一 ...

  7. JAVA学习第六十三课 — 关于client服务端 && URL类 & URLConnection

    常见的client和服务端 client:       浏览器:IE:弹窗体,猎豹:弹窗体.多标签,争强效果 服务端:       server:TomCat:1.处理请求 2.给予应答 想让TomC ...

  8. [企业化NET]Window Server 2008 R2[2]-SVN 服务端 和 客户端 安装

    1.  服务器基本安装即问题解决记录      √ 2.  SVN环境搭建和客户端使用 2.1  服务端 和 客户端 安装    √ 2.2  项目建立与基本使用     √ 2.3  基本冲突解决, ...

  9. Photon Server初识(六) --- 客户端与服务端消息传递

    前一章客户端与服务端连接成功,现在需要前后端进行数据传递. 一.前端发送消息.在项目Scripts目录中新建脚本 TestSer.cs.并挂载到相机上 二.客户端发送数据给服务端.编辑客户端代码 Te ...

随机推荐

  1. Python 中的用户自定义类型

    Python中面向对象的技术 Python是面向对象的编程语言,自然提供了面向对象的编程方法.但要给面向对象的编程方法下一个定义,是很困难的.问题关键是理解对象 的含义.对象的含义是广泛的,它是对现实 ...

  2. 09-使用for循环输出空心菱形(循环)

    /** * 使用for循环输出空心菱形 * */ public class Test7 { public static void main(String[] args) { for (int i = ...

  3. Mac&iOS Socket

    链接地址:http://geeklu.com/2012/01/macios-socket/ Geeklu 登录 1 Recommend 7 分享 按评分高低排序   加入讨论...         振 ...

  4. DDD领域驱动设计的理解

    DDD领域驱动设计的理解 从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能 ...

  5. 基于Spring的Web缓存

    缓存的基本思想其实是以空间换时间.我们知道,IO的读写速度相对内存来说是非常比较慢的,通常一个web应用的瓶颈就出现在磁盘IO的读写上.那么,如果我们在内存中建立一个存储区,将数据缓存起来,当浏览器端 ...

  6. Python脚本:获取股票信息

    在水木上看到有人在问到想用python去获取股票的信息,sina finance上面的那些数据的是通过js控制的,会根据股票代码去获取实时信息然后根据用户友好的方式展示出来.首先,新浪的一个url让我 ...

  7. GCC中初始化函数是怎样被处理的?

    本文译至: http://gcc.gnu.org/onlinedocs/gccint/Initialization.html 如我们所知,在GCC通过给代码追加__attribute__((const ...

  8. MSYS2 环境搭建(在Qt Creator可以设置环境变量来进行引用这些库)

    本机环境:Windows XP 32位MSYS2地址:http://sourceforge.net/projects/msys2/ 下载32位版本,地址:http://sourceforge.net/ ...

  9. win32 字体变换与窗口同大同小

    #include <windows.h> #include "res/resource.h" LRESULT CALLBACK WinProc(HWND hwnd, U ...

  10. QEventLoop等待另外一个事件的停止,非常实用 good

    void MyWidget::SendRequest(QString strUser) { network_manager = new QNetworkAccessManager(); connect ...