前言

学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的“多谋善断";本系列尽管涉及的是socket相关的知识。但学习之前,更想和广大程序猿分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态。

比方近期在看网易公开课MIT《算法导论》,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序猿最好还是从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

原文地址:Building a Java chart server[1]

项目源代码:Socket_Chat

文件夹

正文

计划

我们已经准备好从client接收网络连接。以下讲聊天室怎么样工作的。

上面我们提到 Java语言提供了Socket类。它代表了程序到某处的连接,并且能够数据传输。

可是首先我们如何获得socket呢?client。从定义上看,初始化连接server端。所以。server端的第一件事是等待传入的连接。

我们须要Sockets连接上我们的client。

如今是引入ServerSocket的时候。一个对象工作时简单的:监听端口,新的连接传入,创建一个Socket代表新的连接。

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

接收 Sockets

 记住你的程序可能会服务给非常多client整个互联网。并且这些client会连接你的server端,并且它们互相不联系。也就是说。无法控制它们的顺序,或者时间,当连接到达时。我们稍后会看到。多线程是一种处理连接杰出的方式,一旦这些连接都传入的时候。

然而,我们仍然尽力处理它们到达的连接。

socket提供了一种直接解决方式:serializes(序列化)传入的连接。让它们看起来是请求它们的时候。会一个一个的到达。

这是它的样子。从大体上看:

// 開始监听端口
ServerSocket ss = new ServerSocket( port );
// 始终循环
while (true) {
// 获得一个连接
Socket newSocket = ss.accept();
// 处理连接
// ...
}

accept() 程序是关键所在。当ServerSocket被调用时,它会返回一个新的Socket对象,代表一个新传入的连接。

在你处理连接之后,会调用accept()程序取得下一个连接。这样的方式下,不管你传入的连接多快,不管你机器上有多少处理器或网络接口,在某一时间你仅仅会得到一个连接。

(假设此时没有不论什么连接。accept()程序会堵塞 -- 不返回不论什么东西 -- 知道有连接传入)

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

序列号传入的请求

一般来说,处理同一时候发生的事情上, 序列化是一种有效的方式。

然而。一个潜在的缺陷。它不能够并行。也就是说,序列化阻止我们节省时间在同一时间工作在多个事情上。上面的代码中,正在处理一个连接的时候。其它的连接就会挂起。

可是序列化对于我们不是问题。由于每次一个连接传入的时候,我们会创建一个新的线程处理它。一旦新的线程创建。它就立即处理新的连接。我们的接收循环能够继续接收新的连接传入。

假设创建新线程的行为足够快。连接就不会被挂起。

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

代码

让我们一起看看代码。以下的代码就是我们上面说的:监听接口,接受新的连接,创建线程处理它们。之后仍然会有其它实用的事情要做。

代码例如以下所看到的:

private void listen( int port ) throws IOException {
// 创建ServerSocket
ss = new ServerSocket( port );
// 告诉大家我已经准备好了
System.out.println( "Listening on "+ss );
// 始终接收连接
while (true) {
// 抓取下一个来的连接
Socket s = ss.accept();
// 告诉大家我们得到它了
System.out.println( "Connection from "+s );
// 为了写出数据给其它方面,创建一个DataOutputStream
DataOutputStream dout = new DataOutputStream( s.getOutputStream() );
// 保存该流,这样我们就不须要又一次创建它
outputStreams.put( s, dout );
// 为该连接创建一个新线程。之后忘记它
new ServerThread( this, s );
}
}

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

结束语

代码清单最后一行创建一个线程处理新的连接。这个线程是一个叫ServerThread的对象,它是下一节的主题。

參考文献

[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 聊天室 —— CS 模式的简单架构实现

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

  4. Java聊天室[长轮询]

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

  5. python从socket做个websocket的聊天室server

    下面的是server端:把IP改成自己的局域网IP: #coding:utf8 import socket,select import SocketServer import hashlib,base ...

  6. Netty聊天室(2):从0开始实战100w级流量应用

    目录 客户端 Client 登录和响应处理 写在前面 客户端的会话管理 客户端的逻辑构成 连接服务器与Session 的创建 Session和 channel 相互绑定 AttributeMap接口的 ...

  7. [Java小程序]聊天室——Socket和ServerSocket的使用

    这段小代码是因为担任Java助教给刚学习Java的本科大二的小学弟小学妹们指导,他们的实验作业就是编写一个Java聊天室客户端和服务器,为了避免出纰漏,自己事先写了一下. 客户端Ui代码: packa ...

  8. Netty 仿QQ聊天室 (实战二)

    Netty 聊天器(百万级流量实战二):仿QQ客户端 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之15 [博客园 总入口 ] 源码IDEA工程获取链接:Java 聊天室 实战 源码 写在 ...

  9. 使用 Socket.IO 开发聊天室

    前言 Socket.IO 是一个用来实现实时双向通信的框架,其本质是基于 WebSocket 技术. 我们首先来聊聊 WebSocket 技术,先设想这么一个场景: · 用户小A,打开了某个网站的充值 ...

随机推荐

  1. openstack stein部署手册 8. neutron-api

    # 建立数据库用户及权限 create database neutron; grant all privileges on neutron.* to neutron@'localhost' ident ...

  2. 在eclipse中添加和删除项目

    一. 将JAVA文件夹导入Eclipse中的方法: 方法一:直接将java文件夹复制,然后粘贴到项目下: 方法二:(1)打开Eclipse,点击项目的空白处,现在import: (2)现在Existi ...

  3. 脚本_查找 Linux 系统中的僵尸进程

    #!bin/bash#功能:查找Linux系统中的僵尸进程#作者:liusingbon#使用awk判断ps命令输出的第8列为Z时,显示该进程的 PID 和进程命令ps aux |awk '{if($8 ...

  4. Perl脚本通过Expect登陆多台设备批量执行命令并Log

    本例子尝试使用Perl脚本借助Expect模块实现如下目的: 登陆多台设备 设备登陆信息按如下格式存放于文件中. $ cat hosts.txt 192.168.30.7:node1:telnet:b ...

  5. LightOJ 1289 LCM from 1 to n(位图标记+素数筛

    https://vjudge.net/contest/324284#problem/B 数学水题,其实就是想写下位图..和状压很像 题意:给n让求lcm(1,2,3,...,n),n<=1e8 ...

  6. 什么是shader?

    一.什么是shader? shader是一段GLSL(openGL着色语言)小程序,运行在GPU(图形处理器),而非CPU使用GLSL语言编写,看上去像c或c++,但却是另外一种不同的语言.使用sha ...

  7. 理解Promise (2)

    一进来 我们开始执行 executor函数 传递两个参数 再调用 then 方法 ,then 方法里面有 OnResolve方法,OnReject 方法  在then 方法中,我们一开始的状态是pen ...

  8. java File过滤文件的多种方法

    package com.qf.part1; import java.io.File; import java.io.FileFilter; import java.io.IOException; pu ...

  9. 2 什么是编码?什么是Unicode?

    为了避免在浏览器中传输数据的时候出现中文乱码,我们可以将内容进行URL编码,当然也可以将内容进行UNICODE编码.将汉字进行UNICODE编码,如:“王”编码后就成了“\u738b”,UNICODE ...

  10. 论云时代最经济的APM工具的姿势

    阿里云于大概两月前商业化了一款APM产品 ARMS ,正式填补了 APM 上的云上监控的空白.那么作为阿里云官方 APM 工具,ARMS 和其他传统厂商的 APM 服务相比有什么特点呢? 通过和国内其 ...