网络——实现服务器

【0】README

0.1) 本文描述部分转自 core java volume 2 , 旨在理解 网络——实现服务器 的基础知识 ;
0.2) for source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter3/EchoServer.java + https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter3/ThreadedEchoServer.java


【1】实现服务器

1)看个荔枝:我们的服务器可以向client 发送信息;
2)服务器描述:

  • 2.1)一旦启动服务器程序, 它便等待某个客户端连接到他的端口;
  • 2.2)ServerSocket 类用于建立服务器套结字, 如:
ServerSocket s = new ServerSocket(8189)
  • 2.3)用于建立一个监控8189的服务器,如:
Socket incoming = s.accept();
  • 2.4)上述代码用于告诉程序不停地等待, 直到有client就连接到这个端口;
  • 2.5)如果有client 连接到 server 的 8189端口, 可以使用这个对象来得到输入流和输出流, 如:
 InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();
  • 2.6)服务器发送给服务器输出流的所有信息都会成为 client 程序的输入, 同时来自 client 程序的所有输出都会被包含在 服务器输入流中;
  • 2.7)因为本章中的程序,我们都要通过套接字来发送文本, 所以我们将流转换为扫描器和写入器:
InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();
try (Scanner in = new Scanner(inStream)) 
PrintWriter out = new PrintWriter(outStream, true /* autoFlush */);
  • 2.8)以下代码将给client 发送一条信息:
out.println("hello, ");
  • 2.9)代码最后,我们关闭了连接进来的套接字:
incoming.close();
  • Conclusion) 这就是大致情况。 每一个server 程序, 比如一个 HTTP web 服务器, 都不间断地执行这个循环:

    • C1)通过输入数据流从客户端接收一个命令;
    • C2)解码这个客户端命令;
    • C3) 收集客户端所请求的信息;
    • C4) 通过输出数据流发送消息给客户端;

这里写图片描述


【2】为多个客户端服务(有多个client 同时连接到我们的server上)

1)假设我们希望有多个客户端同时连接到我们的server上, 每当程序建立一个新的套接字连接, 即当调用accept 时, 将启动一个新线程来处理服务器和该客户端间的连接, 而主程序将立即返回并等待下一个连接;
2)为了实现这个机制, 服务器应该具有以下代码的循环操作:

 while (true){  Socket incoming = s.accept();System.out.println("Spawning " + i);Runnable r = new ThreadedEchoHandler(incoming);Thread t = new Thread(r);t.start();i++;}
  • 2.1)ThreadEchoHandler 类实现了 Runnable接口,而在它的run方法中包含了与client 循环通信的代码:
public void run(){  try{  try{InputStream inStream = incoming.getInputStream();OutputStream outStream = incoming.getOutputStream();              Scanner in = new Scanner(inStream);        PrintWriter out = new PrintWriter(outStream, true /* autoFlush */);              out.println( "Hello! Enter BYE to exit." );              // echo client inputboolean done = false;while (!done && in.hasNextLine()){  String line = in.nextLine();            out.println("Echo: " + line);            if (line.trim().equals("BYE"))done = true;}}finally{incoming.close();}}catch (IOException e){  e.printStackTrace();}}
  • 2.2)由于每一个连接都会启动一个新的线程,因而多个client 就可以同时连接到 server了;

3)看个荔枝(做个测试):

  • step1)编译和运行服务器程序;
  • step2)打开 数个 telnet 窗口;
  • step3)切换窗口,键入命令(telnet localhost(or your visitorial host) port )。注意你可以同时通过这些窗口进行通信;
  • step4) 完成之后,切换到你启动服务器的窗口, 使用ctrl +c 强制关闭它;

这里写图片描述
这里写图片描述


【3】半关闭

1)引入半关闭的原因: 半关闭提供了这样一种能力: 套接字连接的一端可以终止其输出,同时仍旧可以接收来自另一端的数据;
2)problem+solution

  • 2.1)problem: 这是一种很典型的case。 例如,我们在向服务器传输数据, 但是并不知道要传输多少数据。在向文件写数据时,我们只需在数据写入后关闭文件即可。 但是,如果关闭一个套接字,那么与服务器的连接将立即断开, 因而也就无法读取服务器的响应了;
  • 2.2)solution:使用半关闭就可以解决。 可以通过关闭一个套接字的输出流来表示发送给服务器的请求数据已经结束, 但是必须保持输入流处于打开状态;

3)以下代码演示了 如何在客户端使用半关闭方法:

Socket socket = new Socket(host, port);
Scanner in = new Scanner(socket.getInputStream() );
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.print(...);
writer.flush();
socket.shutdownOutput();  // client 关闭 outputStream,但是保持inputStream 处于开启状态;
while(in.hasNextLine() != null)
{String line = in.nextLine();......
}
socket.close();
  • 3.1)服务器端将读取输入信息,直到到达输入流的结尾, 然后它再发送响应; 然后上述代码中的while 循环读取 server 的response info;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

image 闪烁 c# ajax updatepanel,Why doesn't asp:UpdatePanel refresh an Image?

问题I have the following UpdatePanel that gets an image from an ashx handler all of which works fine when the page is refreshed. However, when the timer fires, the label is refreshed with current time, but never the image.ImageUrl"~/getImage.ashx?cam…

kafka处理流式数据_通过Apache Kafka集成流式传输大数据

kafka处理流式数据从实时过滤和处理大量数据,到将日志数据和度量数据记录到不同来源的集中处理程序中,Apache Kafka越来越多地集成到各种系统和解决方案中。 使用CData Sync ,可以轻松地将此类解决方案应用于任何CRM,ERP或Analyti…

Oracle入门(十一)之SQL

一、SQL组成 SQL的组成 核心SQL主要有四个部分: 1、数据定义语言即SQL DDL(Data Definition Language ),用于定义 SQL模式、基本表、视图、索引等结构。 CREATE、ALTER、DROP、REVOKE、GRANT2、数据操纵语言 即SQL DML(Data Manipulation Language)。 数…

常见 Java 字节码 指令 助记符

转自: 常见java字节码 有时候为了能理解JVM对程序所做的优化等,需要查看程序的字节码,因此知道了解一些常见的指令集很重要! 指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02…

等价关系和等价类_确定Java等价性的新时代?

等价关系和等价类几个月前,我读了一篇题为“确定Java等价性的新时代?”的博客文章。 这在某种程度上与我当时在我那令人沮丧的副项目Java :: Geci中开发的内容非常吻合 。 我建议您暂停阅读,阅读原始文章,然后再返回此处&#xff…

数据结构(一)之链表

一、链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分&#xff…

高级数据结构实现——自顶向下伸展树

【0】README 1) 本文部分内容转自 数据结构与算法分析,旨在理解 高级数据结构实现——自顶向下伸展树 的基础知识; 2) 源代码部分思想借鉴了数据结构与算法分析,有一点干货原创代码,for original source …

测试框架 如何测试私有方法_高效的企业测试–测试框架(5/6)

测试框架 如何测试私有方法本系列文章的这一部分将介绍测试框架以及我在何时以及是否应用它们方面的想法和经验。 关于测试框架的想法 我对大多数测试框架不太满意的原因是,按照我的观点,它们大多增加了语法上的便利性和便利性,但是本质上并…

数据结构(二)之链表反转

一、链表反转 1、反转非递归算法 2、反转递归算法 链表结点&#xff1a; package cn.edu.scau.mk;/**** author MK* param <T>*/ public class Node<T> {private T data;private Node<T> next null;public Node(T data) {this.data data;}public T getD…

web安全测试视频课程专题_有关有效企业测试的视频课程

web安全测试视频课程专题我已经制作了一些有关有效企业测试的视频。 在实际项目中&#xff0c;我仍然认为该主题非常重要。 这是我在测试Enterprise Java项目中的经验以及一些示例。 1.介绍和有效的Maven使用 在此视频中&#xff0c;我将介绍测试过程&#xff0c;并演示如何使…

网络——获取Web数

【0】README 0.1&#xff09; 本文描述转自 core java volume 2&#xff0c; 旨在理解 “网络——获取Web数” 的基础知识&#xff1b; 0.2&#xff09; for source code , please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chap…

数据结构(三)之单链表反向查找

一、反向查找单链表 1、简单查找 先遍历获取单链表单长度n&#xff0c;然后通过计算得到倒数第k个元素的下标为n-k&#xff0c;然后查找下标为n-k的元素。 2、优化查找 先找到下标为k的元素为记录点p1&#xff0c;然后设置新的记录点p2的下标从0开始&#xff0c;同时遍历两个…

java使用:: 表达式_Java 13:切换表达式的增强功能

java使用:: 表达式您可能还记得我以前的文章&#xff0c;在Java 12中&#xff0c;传统的switch语句得到了增强&#xff0c;因此可以用作表达式。 在Java 13中&#xff0c;对该功能进行了进一步的更改 。 break语句不能再返回值。 相反&#xff0c;您必须使用新的yield语句&…

网络——Base64Encode(转:自定义Base64编码器——Base64Encode)

【0】README 0.1&#xff09; 本文source code 转自 core java volume 2 &#xff0c; 旨在了解 如何定义一个 编码器&#xff0c; 如Base64Encode &#xff1b; 0.2&#xff09;注意&#xff1a; 区别自定义的 Base64Encode 和 java.util.Base64 编码器 0.3&#xff09;fo…

数据结构(四)之单链表查找中间结点

一、查找单链表中间结点 1、简单查找 先遍历获取单链表单长度n&#xff0c;然后通过计算得到中间结点为n/2&#xff0c;然后查找下标为n/2的元素。 2、优化查找 先设置记录点fast、slow&#xff0c;下标均从0开始&#xff0c;fast走两步&#xff0c;slow走一步&#xff0c;同…

java面试常见面试问题_Java面试准备:15个Java面试问题

java面试常见面试问题并非所有的访谈都将重点放在算法和数据结构上—通常&#xff0c;访谈通常只侧重于您声称是专家的语言或技术。在此类访谈中&#xff0c;通常没有任何“陷阱”问题&#xff0c;而是它们要求您利用内存和使用该语言的经验–换句话说&#xff0c;它们测试您对…

网络——提交表单数据(post方式)

【0】README 1&#xff09; 本文文字描述 转自 core java volume 2 &#xff0c; 旨在理解 网络——提交表单数据 的基础知识 &#xff1b; 2&#xff09; for source code, please visit https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/cha…

html5实现最智能大气的公司年会抽奖(源码)

文章目录 1.设计来源1.1 主界面1.3 数据配置1.4 抽奖效果1.5 中奖效果 2.效果和源码配置2.1 动态效果2.2 员工信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码2.6 项目结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/…

Linux入门(一)之权限指令系统管理

一、权限指令 普通用户需要使用sudo或者root超级管理员可以执行权限指令。 二、linux系统init程序 &#xff08;1&#xff09;运行init程序&#xff08;引用runoob.com&#xff09; init 进程是系统所有进程的起点&#xff0c;你可以把它比拟成系统所有进程的老祖宗&#xf…

java jsf_使用Java和JSF构建一个简单的CRUD应用

java jsf使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 JavaServer Faces&#xff08;JSF&#xff09;是用于构建Web应用程序的Java框架&#xff0c;其中心是作为用户…