前言

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

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

循环

如今我们进入核心服务端循环 -- 这是真正聊天工作的代码,让我们看一看:

  1. // 当构造函数调用start()的时候,会在单独的线程里
  2. public void run() {
  3. try {
  4. // 为通信创建DataInputStream;client使用DataOutputStream输出给我们
  5. DataInputStream din = new DataInputStream(socket.getInputStream());
  6. // 一直循环
  7. while (true) {
  8. // ... 读取下一条信息 ...
  9. String message = din.readUTF();
  10. // ... 输入到控制台上 ...
  11. System.out.println("Sending " + message);
  12. // ... 服务端发送它给全部的client
  13. server.sendToAll(message);
  14. }
  15. } catch (EOFException ie) {
  16. // 不须要错误信息
  17. } catch (IOException ie) {
  18. // 须要错误信息,输出至控制台
  19. ie.printStackTrace();
  20. } finally {
  21. // 因某种原因,连接会关闭,所以服务端会处理它
  22. server.removeConnection(socket);
  23. }
  24. }

你会注意到我们在多个地方使用了务端对象。

第一个地方时当我们调用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. SQL中on条件与where条件的区别(转载)

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和where条件的区别如下: 1. on条件是在生成临时表时使用的条 ...

  2. Windows Service的安装卸载 和 Service控制

    原文 Windows Service的安装卸载 和 Service控制 本文内容包括如何通过C#代码安装Windows Service(exe文件,并非打包后的安装文件).判断Service是否存在. ...

  3. js 常用方法记事本

    1.获取被选中行的名称<tab选项卡中为iframe> /* S 获取首页被选中的选项卡名称 */ var currTab = $("#layout_center_tabs&qu ...

  4. 北京出dell s2740显示器 1900 - V2EX

    水木社区归档站 北京出dell s2740显示器 1900 - V2EX 北京出dell s2740显示器 1900 By kekex · 6 小时 6 分钟前 · 188 次点击 购于今年4月份 镜 ...

  5. android中保存Bitmap图片到指定文件夹中的方法

    /** 保存方法 */  public void saveBitmap() {   Log.e(TAG, "保存图片");   File f = new File("/s ...

  6. JavaScript的原型继承

    JavaScript是一门面向对象的语言.在JavaScript中有一句很经典的话,万物皆对象.既然是面向对象的,那就有面向对象的三大特征:封装.继承.多态.这里讲的是JavaScript的继承,其他 ...

  7. ios点击产生波纹效果

    ios点击产生波纹效果 by 伍雪颖 - (void)viewDidLoad { [super viewDidLoad]; RippleView = [[UIView alloc] initWithF ...

  8. TPL异步并行编程之取消任务

    TPL异步并行编程之简单使用 在上篇随笔里面说明了Task的使用,仅仅是简单使用,有时候把一个任务交给Task去执行,但是呢还是要管理下,比如说:我要叫这个任务停止了,不做了,任务取消了,或者超时了 ...

  9. Main Memory Object-Relational Database Management System

    Main Memory Object-Relational Database Management System FastDBMain Memory Relational Database Manag ...

  10. jqueryUI中datepicker的使用,解决与asp.net中的UpdatePanel联合使用时的失效问题

    1.jqueryUI的datepicker的使用 -->首先在jqueryUI官网上根据你的需要下载适合你系统主题的样式,jqueryUI主题下载地址: -->下载后的文件 jquery- ...