一文读懂Java Socket编程

大数据开发学习文档(分布式文件系统的实现,大数据生态圈学习文档等): 文章专栏(点击跳转)

一文读懂Java Socket编程

1、什么是Socket?

百度百科说:
  所谓Socket (套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。

在这里插入图片描述

接下来说人话

  Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。例如A、B进行通信,他们发出数据与接收数据的地方就是各自的通信端点,即套接字(Socket)。

2、Socket 通信原理

  它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个套接字都有一个与之相连进程(通过端口号标识)。

  通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的 Socket中,该 Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的 Socket中,使对方能够接收到这段信息。

  Socket是面向客户/服务器模型而设计的。通信的一方扮演客户机的角色,另一方扮演服务器的角色。服务器在运行中一直监听套接字指定的传输层端口,并等待着客户机的连接请求(Connect)。当服务器端收到客户机发来的连接请求以后,服务器会接受客户机的连接请求,双方建立连接后,就可进行数据的传递。

在这里插入图片描述

  Socket(套接字)包括 IP 地址和端口号两个部分,提供向应用层进程传送数据包的机制。通过网络通信的每对进程需要使用 一对 套接字。不同的进程之间的通信所使用的套接字是不一样的,套接字可以用来区分不同的进程之间的数据传输

3、Java Socket编程

下面的部分我将讲解ServerSocket与Socket并通过一些代码示例,讲解一下如何使用socket编写Client和Server端的程序。

3.1 ServerSocket与Socket

3.1.1 Socket

构造函数

public Socket(String host, int port) throws UnknownHostException, IOException
//此方法尝试连接到指定端口上的指定服务器。如果此构造函数未引发异常,则连接成功并且客户端连接到服务器。

public Socket(InetAddress host, int port) throws IOException
//此方法与前一个构造函数相同,只是主机由InetAddress对象表示。

public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException
//连接到指定的主机和端口,在指定地址和端口的本地主机上创建套接字。

public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException
//此方法与前一个构造函数相同,只是主机由InetAddress对象表示。

public Socket()
//创建一个未连接的套接字。使用connect()方法将此套接字连接到服务器。

Socket方法

//将套接字连接到指定的主机。仅当使用无参数构造函数实例化Socket时才需要此方法。
public void connect(SocketAddress host, int timeout) throws IOException

此外:
	getInetAddress();		//远程服务端的IP地址
	
	getPort();				//远程服务端的端口
	
	getLocalAddress()		//本地客户端的IP地址
	
	getLocalPort()			//本地客户端的端口
	
	getInputStream();		//获得输入流
	
	getOutStream();			//获得输出流
3.1.2 ServerSocket

构造函数

public ServerSocket(int port) throws IOException
//尝试创建绑定到指定端口的服务器套接字。如果端口已被另一个应用程序绑定,则会发生异常。

public ServerSocket(int port, int backlog) throws IOException
//与前上面构造函数类似,backlog参数指定要在等待队列中存储的传入客户端的数量。

public ServerSocket(int port, int backlog, InetAddress address) throws IOException
//与前一个构造函数类似,InetAddress参数指定要绑定的本地IP地址。InetAddress用于可能具有多个IP地址的服务器,允许服务器指定哪个IP地址接受客户端请求。

public ServerSocket() throws IOException
//创建未绑定的服务器套接字。使用此构造函数时,在准备绑定服务器套接字时使用bind()方法。

ServerSocket方法

public int getLocalPort()
//返回服务器套接字正在侦听的端口。如果在构造函数中传入0作为端口号并让服务器自己打开端口,则此方法很有用。

public Socket accept() throws IOException
//等待传入的客户端。假设已使用setSoTimeout()方法设置超时值,此方法将阻塞,直到客户端连接到指定端口上的服务器或套接字超时。否则,此方法无限期地阻塞。

public void setSoTimeout(int timeout)
//设置服务器套接字在accept()期间等待客户端的时间的超时值。

public void bind(SocketAddress host, int backlog)
//将套接字绑定到SocketAddress对象中的指定服务器和端口。如果已使用无参数构造函数实例化ServerSocket,请使用此方法。

  当ServerSocket调用accept()时,在客户端连接之前不会返回客户端连接后,ServerSocket在未指定的端口上创建一个新的Socket,并返回对此新Socket的引用。客户端和服务器之间现在存在TCP连接,并且可以开始通信。

3.2 服务器与客户端建立连接

J2SE API的java.net包中包含一组类和接口,它们提供低级别的通信详细信息,开发者可编写专注于解决手头问题的程序。

java.net包提供对两种常见网络协议的支持:

  • TCP代表传输控制协议,它允许两个应用程序之间的可靠通信。TCP通常用于Internet协议,称为TCP/IP。
  • UDP代表用户数据报协议,这是一种无连接协议,允许在应用程序之间传输数据包。

java.net.Socket类表示一个套接字,java.net.ServerSocket类为Server程序提供了一种监听Client并与它们建立连接的机制。使用套接字在两台计算机(或同一计算器的不同进程)之间建立TCP连接时,会发生以下步骤:

  1. Server实例化ServerSocket对象,表示要在哪个端口号上进行通信。
  2. Server调用ServerSocket类的accept()方法。此方法等待,直到Client连接到给定端口上的Server。
  3. 在Server等待之后,Client实例化Socket对象,指定要连接的Server名称(IP地址)和端口号。
  4. Socket类的构造函数尝试将Client连接到指定的Server和端口号。如果建立了通信,则Client现在具有能够与Server通信的Socket对象。
  5. 在Server端,accept()方法返回对连接到客户端套接字的服务器上的新套接字的引用。

我们可以看到,在服务器端建立套接字使用的是ServerSocket()方法而在客户端则是直接使用Socket()方法,那么这两个方法的区别在哪里呢?

一句话:

Server应用程序使用java.net.ServerSocket类来获取端口并侦听客户端请求。
Client应用程序通过实例化一个java.net.Socket类来获取Socket对象,而Server从accept()方法的返回值获取Socket对象。

**代码示例**

//实例化ServerSocket对象
ServerSocket serverSocket = new ServerSocket(Config.META_SERVRE_PORT) ;

//调用accept()方法等待Client请求连接
Socket clientSocket = serverSocket.accept();

// Client实例化Socket对象,指定要连接的Server IP地址和端口号
Connection connection = new Connection(META_SERVRE_HOST, METADATA_SERVER_PORT);

//Connection对象构造函数如下 ↓
public Connection(String host, int port) throws IOException {
    this.host = host;
    this.port = port;
    socket = new Socket(host,port);
    // 获取输入流和输出流
    in = new DataInputStream(socket.getInputStream());
    out = new DataOutputStream(socket.getOutputStream());
}

此时Server和Client要进行通信,可以使用I/O流进行通信。每个套接字都有一个OutputStream和一个InputStream。客户端的OutputStream连接到服务器的InputStream,客户端的InputStream连接到服务器的OutputStream

在这里插入图片描述

(TCP是双向通信协议,所以可以实现同时跨两个流传送数据 ↑ )

3.3通信示例(分布式文件系统心跳链接)

Server端:

在这里插入图片描述

Client端:

在这里插入图片描述


4、结语

//TODO:
InputStream和OutputStream流的操作;
实现一个简单的分布式文件系统(基于Hadoop) 操作文档;
待更新…


最近在写一个简单的分布式文件操作系统,用到了网络编程Socket的知识,虽然不影响写项目,但是还是想着认真对待,毕竟以后肯定还会用到这方面的知识。所以将自己整理的学习文档上传至此,希望对大家的学习也能有所帮助。

15点21分 2023年11月25日
欢迎大家积极讨论,如有错误,还请不吝赐教!

  • 24
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
[14本经典Android开发教程] 2 Android开发手册 API函数详解 一 TextView的API 1 1 结构 java lang Object android view View android widget TextView 直接子类: Button CheckedTextView Chronometer DigitalClock EditText 间接子类: AutoCompleteTextView CheckBox CompoundButton ExtractEditText MultiAutoCompleteTextView RadioButton ToggleB utton 已上传1本: [14本经典Android开发教程] 1 Android开发从入门到精通 稍后上传剩余12本 http: download csdn net detail cleopard 8355245 @更多@ http: cleopard download csdn net 福利 http: xuemeilaile com @更多@ http: download csdn net user cleopard album 17份软件测试文档 http: download csdn net album detail 1425 13份WPF经典开发教程 http: download csdn net album detail 1115 C#资料合辑二[C#桌面编程入门篇] http: download csdn net album detail 957 C#资料合辑一[C#入门篇] http: download csdn net album detail 669 [Csharp高级编程 第6版 ] 共8压缩卷 http: download csdn net album detail 667 10个[精品资源]Java学习资料合辑[一] http: download csdn net album detail 663 10个C#Socket编程代码示例 http: download csdn net album detail 631 6份GDI+程序设计资源整合[全零分] http: download csdn net album detail 625 2014年移动游戏行业数据分析 http: download csdn net detail cleopard 8340331 一文读懂2014年全球互联网广告新生态 http: download csdn net detail cleopard 8340303">[14本经典Android开发教程] 2 Android开发手册 API函数详解 一 TextView的API 1 1 结构 java lang Object android view View android widget TextView 直接子类: Button CheckedTextView Chronometer DigitalClock EditText 间接子类: AutoCompleteTextView CheckBox CompoundBu [更多]
[14本经典Android开发教程]-7-Android编程入门教程 -------------------------------------------------- 本文为以前已经使用Java编程并想开始为Android平台开发开发者编写。我试着尽可能地多的"展开",在合适的每个地方放上示例代码。我也试着尽可能多的插入很多图片,因为它们可以活跃学习过程和吸引读者眼球。但不庆幸的,不是每样都编上代码;你不得不学习一些Android平台基础原理来完全理解它。那就是在第一页中描述的。没有必要通读所有的那些描述页,但那样较好些。你可以把它当成一种参考。当在"展开"-过程期间你应该读也被说明了。因此你可以直接从HelloWorld--Android方式开始。 -------------------------------------------------- 已上传6本: [14本经典Android开发教程]-1-Android开发从入门到精通 http://download.csdn.net/detail/cleopard/8355245 [14本经典Android开发教程]-2-Android开发手册—API函数详解 http://download.csdn.net/detail/cleopard/8374487 [14本经典Android开发教程]-3-Android SDK 中文开发文档 http://download.csdn.net/detail/cleopard/8380429 [14本经典Android开发教程]-4-Android应用程序开发36技 http://download.csdn.net/detail/cleopard/8380495 [14本经典Android开发教程]-5-linux Android基础知识总结 http://download.csdn.net/detail/cleopard/8380529 [14本经典Android开发教程]-6-Android驱动开发入门及手机案例开发分析教程 http://download.csdn.net/detail/cleopard/8388019 剩余8本稍后上传!@或直接从这里寻找@ http://download.csdn.net/user/cleopard/album @更多@ http://cleopard.download.csdn.net/ 福利 http://xuemeilaile.com 17份软件测试文档 http://download.csdn.net/album/detail/1425 13份WPF经典开发教程 http://download.csdn.net/album/detail/1115 C#资料合辑二[C#桌面编程入门篇] http://download.csdn.net/album/detail/957 C#资料合辑一[C#入门篇] http://download.csdn.net/album/detail/669 [Csharp高级编程(第6版)](共8压缩卷) http://download.csdn.net/album/detail/667 10个[精品资源]Java学习资料合辑[一] http://download.csdn.net/album/detail/663 10个C#Socket编程代码示例 http://download.csdn.net/album/detail/631 6份GDI+程序设计资源整合[全零分] http://download.csdn.net/album/detail/625 2014年移动游戏行业数据分析 http://download.csdn.net/detail/cleopard/8340331 一文读懂2014年全球互联网广告新生态 http://download.csdn.net/detail/cleopard/8340303
[14本经典Android开发教程] 8 Linux内核阅读心得体会 读核感悟 2 读核感悟 Linux内核启动 内核的生成 2 读核感悟 Linux内核启动 从hello world说起 3 读核感悟 Linux内核启动 BIOS 5 读核感悟 Linux内核启动 setup辅助程序 6 读核感悟 Linux内核启动 内核解压缩 8 读核感悟 Linux内核启动 开启页面映射 9 读核感悟 Linux内核启动 链接脚本 11 读核感悟 伪装现场 系统调用参数 13 读核感悟 伪装现场 fork 系统调用 15 读核感悟 伪装现场 内核线程: 17 读核感悟 伪装现场 信号通信 19 读核感悟 kbuild系统 内核模块的编译 22 读核感悟 kbuild系统 编译到内核和编译成模块的区别 24 读核感悟 kbuild系统 make bzImage的过程 26 读核感悟 kbuild系统 make menuconfig 31 读核感悟 文件系统 用C来实现面向对象 32 读核感悟 设计模式 用C来实现虚函数表和多态 32 读核感悟 设计模式 用C来实现继承和模板 33 读核感悟 设计模式 文件系统和设备的继承和接口 34 读核感悟 设计模式 文件系统与抽象工厂 36 读核感悟 阅读源代码技巧 查找定义 37 读核感悟 阅读源代码技巧 变量命名规则 42 读核感悟 内存管理 内核中的页表映射总结 43 读核感悟 健壮的代码 exception table 内核中的刑事档案 44 读核感悟 定时器 巧妙的定时器算法 45 读核感悟 内存管理 page fault处理流程 45 读核感悟 文件读写 select实现原理 47 读核感悟 文件读写 poll的实现原理 49 1 功能介绍: 49 2 关键的结构体: 49 3 poll的实现 49 4 性能分析: 50 读核感悟 文件读写 epoll的实现原理 50 1 功能介绍 50 2 关键结构体: 51 3 epoll create的实现 53 4 epoll ctl的实现 53 5 epoll wait的实现 54 6 性能分析 54 读核感悟 同步问题 同步问题概述 55 1 同步问题的产生背景 55 2 内核态与用户态的区别 55 读核感悟 同步问题 内核态自旋锁的实现 56 1自旋锁的总述 56 2非抢占式的自旋锁 56 3 锁的释放 57 4 与用户态的自旋锁的比较 57 5 总结 58 读核感悟 内存管理 free命令详解 58 读核感悟 文件读写 2 6 9内核中的AIO 59 1 AIO概述 59 2 内核态AIO的使用 61 读核感悟 文件读写 内核态AIO相关结构体 61 1 内核态AIO操作相关信息 61 2 AIO上下文: 63 3 AIO ring 63 4 异步I O事件的返回信息 64 读核感悟 文件读写 内核态AIO创建和提交操作 65 1 AIO上下文的创建 io setup 65 2 AIO请求的提交:io submit实现机制 66 读核感悟 文件操作 AIO操作的执行 66 1 在提交时执行AIO 66 2 在工作队列中执行AIO 66 3 负责AIO执行的核心函数aio run iocb 67 4 AIO操作的完成 67 读核感悟 文件读写 内核态是否支持非direct I O方式的AIO 67 已上传7本: [14本经典Android开发教程] 1 Android开发从入门到精通 http: download csdn net detail cleopard 8355245 [14本经典Android开发教程] 2 Android开发手册 API函数详解 http: download csdn net detail cleopard 8374487 [14本经典Android开发教程] 3 Android SDK 中文开发文档 http: download csdn net detail cleopard 8380429 [14本经典Android开发教程] 4 Android应用程序开发36技 http: download csdn net detail cleopard 8380495 [14本经典Android开发教程] 5 linux Android基础知识总结 http: download csdn net detail cleopard 8380529 [14本经典Android开发教程] 6 Android驱动开发入门及手机案例开发分析教程 http: download csdn net detail cleopard 8388019 [14本经典Android开发教程] 7 Android编程入门教程 http: download csdn net detail cleopard 8388043 剩余8本稍后上传 @或直接从这里寻找@ http: download csdn net user cleopard album @更多@ http: cleopard download csdn net 福利 http: xuemeilaile com 17份软件测试文档 http: download csdn net album detail 1425 13份WPF经典开发教程 http: download csdn net album detail 1115 C#资料合辑二[C#桌面编程入门篇] http: download csdn net album detail 957 C#资料合辑一[C#入门篇] http: download csdn net album detail 669 [Csharp高级编程 第6版 ] 共8压缩卷 http: download csdn net album detail 667 10个[精品资源]Java学习资料合辑[一] http: download csdn net album detail 663 10个C#Socket编程代码示例 http: download csdn net album detail 631 6份GDI+程序设计资源整合[全零分] http: download csdn net album detail 625 2014年移动游戏行业数据分析 http: download csdn net detail cleopard 8340331 一文读懂2014年全球互联网广告新生态 http: download csdn net detail cleopard 8340303">[14本经典Android开发教程] 8 Linux内核阅读心得体会 读核感悟 2 读核感悟 Linux内核启动 内核的生成 2 读核 [更多]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蹒跚者_Stan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值