Java网络编程(四)—— ServerSocket(一)

  • Java网络编程(四)—— ServerSocket(一)
    • 总述
    • 创建ServerSocket
    • 绑定端口
    • 使用ServerSocket

总述

之前《Java网络编程(三)—— Socket》介绍了客户端Socket。不过,只有客户端socket还不够,如果不能与服务器对话,客户端并没有什么用处,因此需要一个一直等待客户端连接的服务端。服务器就像坐在电话旁等电话的接线员。他们不知道谁会打电话,或者什么时间打电话,只知道当电话铃响时,就必须拿起电话与之对话,而不管对方是谁。

对于接受连接的服务器,Java提供了一个ServerSocket类表示服务器Socket。换句话说,服务器Socket的任务就是坐在电话旁等电话。从技术上讲,服务器Socket在服务器上运行,监听入站TCP连接。每个服务器Socket监听服务器机器上的一个特定端口。当远程主机上的一个客户端尝试连接这个端口时,服务器就被唤醒,协商建立客户端和服务器之间的连接,并返回一个常规的Socket对象,表示两台主机之间的Socket。换句话说,服务器Socket等待连接,而客户端Socket发起连接。一旦ServerSocket建立了连接,服务器会使用一个常规的Socket对象向客户端发送数据。数据总是通过常规socket传输。

创建ServerSocket

有4个公共的ServerSocket构造函数:

public ServerSocket(int port) throws BindException,IOException
public ServerSocket(int port, int queueLength) throws BindException,IOException
public ServerSocket(int port,int queueLength,InetAddress bindAddress) throws IOException
public ServerSocket() throws IOException

这些构造函数可以指定端口、保存入站连接请求所用的队列的长度,以及要绑定的本地网络接口。

绑定端口

使用无参构造函数会创建一个ServerSocket对象,但并没有将它具体绑定在某一个端口,所以初始时他没有接受任何连接,但是之后可以使用bind()来进行绑定,Java提供了两个函数来进行绑定:

public void bind(SocketAddress endpoint) throws IOException
public void bind(SocketAddress endpoint, int queuelength) throws IOException

使用这种方式,可以允许程序在绑定端口之前设置服务器socket选项,因为有些选项在服务器socket绑定之后就会被固定住:

ServerSocket ss = new ServerSocket();
/*
设置socket选项
*/
SocketAddress http = new InetSocketAddress(80);
ss.bind(http);

如果在InetSocketAddress中传入null,那么会选择任意端口。

使用ServerSocket

在Java中,服务器程序的生命周期是:

  1. 使用一个ServerSocket()构造函数在一个特定端口创建一个新的ServerSocket。
  2. ServerSocket使用其accept()方法监听这个端口的入站连接。accept()会一直阻塞,直到一个客户端尝试建立连接,此时accept()将返回一个连接客户端和服务器的Socket对象。
  3. 根据服务器的类型,会调用Socket的getInputStream()方法、getOutputStream()方法以获得与客户端通信的输入和输出流。
  4. 服务器和客户端根据已协商的协议交互,直到要关闭连接。
  5. 服务器或客户端(或二者)关闭连接。
  6. 服务器返回到步骤2,等待下一次连接。

下面这个简单的例子就是一个时间服务器,这个服务器的socket在6666端口进行监听,当有客户socket连接时,服务器就会返回时间。

public static void main(String[] args) throws Exception {ServerSocket server = null;try {server = new ServerSocket(6666);while (true) {Socket connection = null;try {connection = server.accept();Writer out = new OutputStreamWriter(connection.getOutputStream());Date now = new Date();out.write(now.toString() + "\r\n");out.flush();connection.close();} catch (IOException ex) {} finally {try {if (connection != null) connection.close();} catch (IOException ex) {ex.printStackTrace();}}}}finally {try {if (server != null)server.close();} catch (IOException ex) {}}}

鉴于篇幅原因,余下关于服务器Socket的内容(请求队列长度、关闭ServerSocket、多线程服务器)可以阅读下一篇博客《Java网络编程(五)—— ServerSocket(二)》。

Java网络编程(四)—— ServerSocket(一)相关推荐

  1. Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例

    Java网络编程 Socket.ServerSocket 详解,方法介绍及完整代码示例 概念 什么是网络编程? 网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来.当这些通过网络 ...

  2. Java网络编程(第四版)

    网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击"普通下载" ...

  3. Java课程实验报告 实验四 Java网络编程及安全

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计     班级:1352     姓名:吕松鸿  学号:20135229 成绩:               ...

  4. 【Java】 Java网络编程总结

     一.网络编程三要素: IP地址:每个设备在网络中的唯一标识. 端口号:每个程序在设备上的唯一标识. 协议:为计算机网络中进行数据交换而建立的规则或约定的集合. UDP: 面向无连接,数据不安全,速度 ...

  5. NIO详解(一):java网络编程IO总结(BIO、NIO、AIO)

    1.基本概念 在Java网络通信中,最基本的概念就是Socket编程了.Socket又称"套接字" 向网络发出请求或者应答网络请求. Socket 和ServerSocket类库位 ...

  6. 04.Java网络编程(转载)

    1.网络编程 1.1计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输. 按照计算机网络的定义,通过一定的物理设备将处于不同位置的计算机连接起来组成的网络,这个网络中包含 ...

  7. 【带你入门】java网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  8. 迈入JavaWeb第一步,Java网络编程基础,TCP网络编程URL网络编程等

    文章目录 网络编程概述 网络通信要素 要素一IP和端口号 要素二网络协议 TCP网络编程 UDP网络编程 URL网络编程 Java网络编程基础 网络编程概述 Java是Internet上的语言,它从语 ...

  9. Java 网络编程(超级详细)

    前言:本文是初学Java网络编程时所记录的学习笔记,方便以后查阅学习,同时也作为资料总结分享给大家,如果有问题欢迎指出!! 1. 网络编程 1.1 网络编程基本概念 1.网络 将不同区域的电脑连接到一 ...

最新文章

  1. Nutch之初体验(1)
  2. 【Groovy】编译时元编程 ( ASTTransformation#visit 方法获取 Groovy 源文件 )
  3. 如何将字符数组里的内容转换成uint8的类型?将一个字符数组里面的所有元素变成一个字符串?
  4. 烟台大学计算机学院老师,王鹏-烟台大学计算机与控制工程学院
  5. BOOST 线程完全攻略 - 结束语
  6. 手动打开和关闭windows的相关服务
  7. 转载-聊一聊深度学习的activation function
  8. (转)用PS删除去掉GIF动画图片的背景
  9. 大厂必背 MySQL优化面试题
  10. 图形桌面与命令行模式相关切换快捷键
  11. json csrf html5,Exploiting JSON CSRF
  12. java 拼图_Java 9:“拼图计划终于给了我们急需的Java安全带”
  13. 简单介绍一下HBase、Cassandra、Voldemort、Redis、VoltDB、MySQL(转)
  14. 什么是JIT,JDK17移除了JIT?
  15. 服装企业在饱和的情况下,如何避免交期延误?
  16. word页码设置一些问题
  17. CSpreadSheet类学习,用于操作excel表格。
  18. 查找学校是北大的学生信息
  19. php加固包,PHP基础加固2——语法
  20. mysql pxc 高可用多主机离线部署

热门文章

  1. Java入门 - 方法的使用
  2. 高级会计师评审需要职称计算机哪种考试级别,会计高级职称考哪些科目 评审条件是什么...
  3. 干货分享 | 万字讲解Kafka 从基础到高级(附图讲解)
  4. [资源]_清华大学计算机视频教程_31门_种子ed2k_BT下载
  5. NBU对Oracle备份及恢复手册
  6. 基于CarMaker的C-NCAP主动安全系统试验仿真(三)
  7. vue项目中axios配置(代理配置)
  8. 最新软件开发企业网站Pbootcms模板源码
  9. 电赛综合测评题练习(一)-(与2013年电赛综合测评要求类似)
  10. Android 按钮设置边框实例