[Java聊天室服务器]实战之三 接收循环

前言

学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的“多谋善断";本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态。比如最近在看网易公开课MIT《算法导论》,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

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

项目源码:Socket_Chat

目录

      • [Java聊天室服务器]实战之四 线程类(未完成)
      • [Java聊天室服务器]实战之五 读写循环(服务端)(未完成)
      • [Java聊天室服务器]实战之六 去除死链接(未完成)
      • [Java聊天室服务器]实战之七 客户端类(未完成)
      • [Java聊天室服务器]实战之七 读写循环(客户端)(未完成)

正文

计划

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

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

但是首先我们怎样获得socket呢?客户端,从定义上看,初始化连接服务器端。所以,服务器端的第一件事是等待传入的连接。我们需要Sockets连接上我们的客户端。

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

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

接收 Sockets

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

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

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聊天室服务器]实战之三 接收循环

时间: 2024-11-05 12:07:39

[Java聊天室服务器]实战之三 接收循环的相关文章

[Java聊天室服务器]实战之五 读写循环(服务端)

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

[Java聊天室服务器]实战之八 读写循环(客户端)

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

[Java聊天室服务器]实战之六 去除死链接

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

[Java聊天室服务器]实战之四 线程类

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

[Java聊天室服务器]实战之七 客户端类

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

[Java聊天室服务器]实战之一 开篇介绍

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

[Java聊天室服务器]实战之二 监听类

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

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

前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更想和广大程序猿分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比方近期在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序猿最好还是从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字...

Java聊天室[长轮询]

今天看到有人分享java实现的聊天室,想起很久以前还在热衷于java的时候也做过一个web聊天室,不拿出来晒晒,可能再也不为人知了,单纯是一个兴趣作品,稳定性不好,也没有考虑连接数和并发的问题,拿出来博大家一笑吧,项目我已改为maven管理;     有一些没有修复的bug,比如SesseionManager 里的sessionCache 会只增不减等等,每一个用户一个Session实例,一个消息buffer(MessageQueue)来缓存未收到的消息,有SessionManager来管理,D