ServerSocket与Socket类

简介:

TCP最主要的特征就是能够建立长时间的连接,而且能够保证数据安全的送达,但是速度比较慢。使用TCP进行连接的时候会有三次握手,之后才建立起服务器与客户端的连接,因为TCP的链接习惯是询问对方机器是否存在,不存在就不会建立连接,存在才会建立连接

示意图:

b4f286d2665264cf457dce2d6d0afac0.png



ServerSocket类:

Java中想要使用TCP协议做编写服务端的话,需要使用到ServerSocke类,这个类是TCP协议的。

TCP协议的操作类java.net包下放着ServerSocket类就是服务器端,服务器插座Socket这个单词就是插座的意思。

 

Socket类:

同样是TCP协议并与ServerSocket类相对的是Socket类,这个类是作为一个通讯端、客户端的存在。用于去连接服务器端,这个Socket如果是从ServerSocket拿到的对象,那就是与服务器连接的那个Socket如果是自己创建的Socket对象,那你就是客户端

在理论上可以有无限个Socket端来连接ServerSocketServerSocket端上每有一个Socket端来连接,就会创建与之相对的Socket对象。也就是说ServerSocket端上也有Socket对象,每一个Socket就像插座上的插孔一样,连接着通讯端的Socket对象。

示意图:



4bd07676926db1994bb5877da07cad33.png




ServerSocketSocket类:

ServerSocket类可以编写服务器端,Socket类可以用来编写客户端。创建ServerSocket对象的时候需要声明一个端口号,这样通讯端才能通过端口号去连接。创建Socket对象的时候则需要声明一个IP地址和ServerSocket对象的端口号,这样才能对服务端发出连接请求。在发出连接请求成功连接后,Socket通讯端会创建两个流,一个是InputStream流一个是OutputStream流。同时,ServerSocket服务器端会得到一个Socket对象,然后这个Socket对象也会创建出InputStream流和OutputStream流。

示意图:



c4b116eed8b5ee2b1c39f1b773886590.png



上面只是粗略的说一下如何建立的连接,实际上ServerSocket服务器端的Socket对象是通过accept();方法得到的,这个方法监听着声明的端口号。一旦有通讯端来连接,就会创建Socket对象,客户端和服务器端建立连接成功之后就通过InputStream流和OutputStream流来进行交互数据。

 

完整示意图:

28cb2fe1c3e05eab465e46b2b76d8189.png



明白了两个类之间的联系后,我们就开始尝试编写一个服务器端吧。我们使用浏览器作为Socket端,因为浏览器也是TCP协议的,所以可以连接到我们编写的服务器端。(提示:如果确定编写的代码无误,但是浏览器却连接不到编写的服务端,可以更换IE浏览器试一下)

  代码示例:

a3c89d655fdcef13cee96391f1cc1dec.png


运行结果:

3b4db47cbe0a1f1a73aabdf3a39b8c83.png


浏览器会发送一段浏览器的信息:

0b9fefe2341f7293bd64f48672557721.png


代码示例:

6cbad10bd4919b00ecd8e3a253ec5a58.png


运行结果:

58f9c2ca9f2f405d85e92e1266769ba0.png

a23b25377001d4139457eb9832183f08.png




现在我们已经知道如何编写服务器端,并且知道可以使用浏览器作为客户端去进行连接了,那么接下来使用Socket类进行编写一个客户端,简单的与服务器端交互一下数据。服务器端的编写和上面的第一个示例没有区别,就不过多解释。

客户端则是需要声明一个ip地址和端口号,这个端口号是服务器端的端口号,这点要注意。然后同样的通过流来交互数据,读取或输出数据时,需要看一下服务器端是先读取还是先输出,服务器端先读取的话客户端就需要先编写输出数据的代码,否则反之。关于这个谁先读取或输出是没有规定的,都是根据另一端的编写的代码来决定。

  服务器端代码示例:

66b633f2eea9f6c328bcea39ef464627.png


客户端代码示例:

88afaf7fc40ca2cab9999f73329e4c00.png


运行结果:

9f8f06da2ea9c40a0597eb9d0c78e8d0.png


当有两个结果并且想要两个控制台界面时,可以点击这里,选择New Console View新建控制台:

4fb6fac66ab7322ac870ab7528a790f0.png

abdeaf059d5ac41896668f059db32959.png


代码之间的关系示意:

1d2b68d19910eedba21aa8f56e9a4562.png




多网卡:

多网卡就是一台计算机中有好几个网卡,一般普通PC电脑有两个网卡,一个物理网卡,一个虚拟网卡。笔记本电脑则一般有三个网卡一个无线网卡,一个物理网卡,一个虚拟网卡。

一般在服务器上有很多个网卡,所以就有很多网线接口,因为有些服务器会需要“三合一网络”,“三合一网络”就是将联通、电信、移动的网线都接入到这台服务器里,那这台服务器就能同时使用三个运营商的网络了。

而且因为服务器机房里一般都是有很多台服务器在进行集群,所以也需要一部分网络接口用于连接内部的集群网络,一部分网络接口则连接通过防火墙之类的安全措施过滤后的外部网络。

  多网卡服务器图片:

b4f0980d7e3a702116e651b68e50efc3.png



本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1976671,如需转载请自行联系原作者

相关文章
muduo源码剖析之Socket类
封装了一个sockfd相关的设置。比较简单,已经编写注释。
107 0
|
存储 Cloud Native Linux
C++封装了socket通信类
C++封装了socket通信类
|
安全 网络协议 Java
Thread类的用法 && 线程安全 && 多线程代码案例 && 文件操作和 IO && 网络原理初识 &&UDP socket
Thread类的用法 && 线程安全 && 多线程代码案例 && 文件操作和 IO && 网络原理初识 &&UDP socket
119 0
|
6月前
|
网络协议 Unix Linux
# 2个类轻松构建高效Socket通信库
本文介绍了一种通过两个类`EpollEventHandler`和`IEpollEvent`构建高效Socket通信库的方法。该库支持TCP、UDP和Unix域套接字,采用I/O多路复用技术(如epoll),提升并发处理能力。通过抽象基类和具体事件类的设计,简化了API使用,便于开发者快速上手。文章还提供了服务端与客户端的实例代码,展示其在实际项目中的应用效果。此Socket库适应嵌入式环境,功能定制性强,有助于减少外部依赖并提升维护效率。
149 98
# 2个类轻松构建高效Socket通信库
|
网络协议 Java
Java中如何使用Socket类检测端口是否存在
Java中如何使用Socket类检测端口是否存在
287 4
java使用ServerSocket和Socket实现客户端与服务端通讯
java使用ServerSocket和Socket实现客户端与服务端通讯
110 0
|
网络协议 Java
【零基础学Java】—Socket类(五十五)
【零基础学Java】—Socket类(五十五)
【零基础学Java】—Socket类(五十五)
|
缓存 网络协议 算法
ServerSocket与Socket入门详解
ServerSocket与Socket入门详解
755 0
|
缓存 移动开发 网络协议
TCP编写服务器,客户端以及遇到的两个问题,Socket,ServerScket 类,flush(),方法。以及多线程解决,及改进的线程池写法,IO多路复用的思想,C10K,C10M的阐述。万字超细
TCP编写服务器,客户端以及遇到的两个问题,Socket,ServerScket 类,flush(),方法。以及多线程解决,及改进的线程池写法,IO多路复用的思想,C10K,C10M的阐述。万字超细
java.nio.* 篇(1) FileChannel AsynchronousFileChannel ServerSocket Socket 使用案例
java.nio.* 篇(1) FileChannel AsynchronousFileChannel ServerSocket Socket 使用案例