天天看点

java socket如何请求485协议_学习Java的022天,认识网络编程

java socket如何请求485协议_学习Java的022天,认识网络编程

学习Java的第022天——写在端午节之后

了解学习了网络编程的基本概念,IP和端口、socket含义,TCP协议和UDP协议 、InetAddress/InetSocketAddress/URL、基于TCP的Socket编程 、基于TCP的Socket编程实现聊天室等内容等。

首先:计算机网络的作用是资源共享和信息传递。

2. 计算机网络的组成:

a) 计算机硬件:计算机(大中小型服务器,台式机、笔记本等)、外部设备(路由器、交换机等)、通信线路(双绞线、光纤等)。

b) 计算机软件:网络操作系统(Windows 2000 Server/Advance Server、Unix、Linux等)、网络管理软件(WorkWin、SugarNMS等)、网络通信协议(如TCP/IP协议栈等)。

3. 计算机网络的多台计算机是具有独立功能的,而不是脱离网络就无法存在的。

(1) 网络编程的三要素是什么?

①IP 地址:唯一标识网络上的每一台计算机,两台计算机之 间通信的必备有素 ;

②端口号:计算机中应用的标号(代表一个应用程序), 0-1024 系统使用或保留端口 ,端号口占 2 个字节,所以 有效端口 0-65535 ;

③通信协议:通信的规则 TCP,UDP 。

解释一下通信协议就是:

通过计算机网络可以实现不同计算机之间的连接与通信,但是计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。

国际标准化组织(ISO,即International Organization for Standardization)定义了网络通信协议的基本框架,被称为OSI(Open System Interconnect,即开放系统互联)模型。OSI模型制定的七层标准模型,分别是:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。

虽然国际标准化组织制定了这样一个网络通信协议的模型,但是实际上互联网通讯使用最多的网络通信协议是TCP/IP网络通信协议。

TCP/IP 是一个协议族,也是按照层次划分,共四层:应用层,传输层,互连网络层,网络接口层(物理+数据链路层)。

java socket如何请求485协议_学习Java的022天,认识网络编程

开放系统互连参考模型与TCP/IP参考模型对比

用来标识网络中的一个通信实体的地址。通信实体可以是计算机、路由器等。 比如互联网的每个服务器都要有自己的IP地址,而每个局域网的计算机要通信也要配置IP地址。路由器是连接两个或多个网络的网络设备。

目前主流使用的IP地址是IPV4,但是随着网络规模的不断扩大,IPV4面临着枯竭的危险,所以推出了IPV6。

IPV4:32位地址,并以8位为一个单位,分成四部分,以点分十进制表示,如192.168.0.1。因为8位二进制的计数范围是00000000---11111111,对应十进制的0-255,所以-4.278.4.1是错误的IPV4地址。

IPV6:128位(16个字节)写成8个16位的无符号整数,每个整数用四个十六进制位表示,每个数之间用冒号(:)分开,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984

需要知道的是:

1. 127.0.0.1 本机地址

2. 192.168.0.0--192.168.255.255为私有地址,属于非注册地址,专门为组织机构内部使用。

IP地址用来标识一台计算机,但是一台计算机上可能提供多种网络应用程序,如何来区分这些不同的程序呢?这就要用到端口。

端口是虚拟的概念,并不是说在主机上真的有若干个端口。通过端口,可以在一个主机上运行多个网络应用程序。 端口的表示是一个16位的二进制整数,对应十进制的0-65535。

.IP地址好比每个人的地址(门牌号),端口好比是房间号。必须同时指定IP地址和端口号才能够正确的发送数据。

我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层的服务呢?在应用层和传输层之间,则是使用套接Socket来进行分离。

套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据;而这个小口以内,也就是数据进入这个口之后,或者数据从这个口出来之前,是不知道也不需要知道的,也不会关心它如何传输,这属于网络其它层次工作。

Socket实际是传输层供给应用层的编程接口。Socket就是应用层与传输层之间的桥梁。使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过Internet在全球范围内通信。

java socket如何请求485协议_学习Java的022天,认识网络编程

Socket的作用

TCP协议和UDP协议是传输层的两种协议。Socket是传输层供给应用层的编程接口,所以Socket编程就分为TCP编程和UDP编程两类。

在网络通讯中,TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。而UDP方式就类似于发送短信,使用这种方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。

总的来讲就是:

TCP是面向连接的,传输数据安全,稳定,效率相对较低。

UDP是面向无连接的,传输数据不安全,效率较高。

TCP通信原理是:

服务器创建 ServerSocket,在指定端口监听并处理请求;

客户端创建 Socket,向服务器发送请求 ;

java socket如何请求485协议_学习Java的022天,认识网络编程

TCP在建立连接时又分三步走:

第一步,是请求端(客户端)发送一个包含SYN即同步(Synchronize)标志的TCP报文,SYN同步报文会指明客户端使用的端口以及TCP连接的初始序号。

第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement)。

第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。然后才开始通信的第二步:数据处理。

这就是所说的TCP的三次握手(Three-way Handshake)。

基于UDP协议的通信方式,称为数据报通信方式。在这种方式中,每个数据发送单元被统一封装成数据报包的方式,发送方将数据报包发送到网络中,数据报包在网络中去寻找它的目的地。

UDP协议的特点是:

Ø 不需要利用 IO 流实现数据的传输

Ø 每个数据发送单元被统一封装成数据包的方式,发送方将数据包发送到网络中,数据包在网络中去寻找他的目的地。

Ø DatagramSocket:用于发送或接收数据包

Ø DatagramPacket:数据包

Java为了可移植性,不允许直接调用操作系统,而是由http://java.net包来提供网络功能。Java虚拟机负责提供与操作系统的实际连接。

InetAddress类的作用及常用方法;

作用:封装计算机的IP 地址,不包含端口号

方法:String getHostAddress()-----获得IP 地址

String getHostName()-----获得主机名

static InetAddress getByName(String host)-----根据主机名获得IP 地址

InetSocketAddress类的作用及常用方法;

作用:此类用于实现 IP套接字地址 (IP 地址+端口号),用于socket 通信

方法:InetAddress getAddress()-----获取InetAddress对象

int getPort()-----获取端口号

String getHostName()-----获取主机名

IP地址唯一标识了Internet上的计算机,而URL则标识了这些计算机上的资源。类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

URL的常用方法有:

String getProtocal()-----获取此 URL 的协议名称

String getHost()-----获取此 URL 的主机名(如果适用)

int getPort()-----获取 URL 的端口号

String getFile()-----获取此 URL 的文件名

getDefaultPort()-----获取与此 URL 关联协议的默认端口号

getPath()-----获取此 URL 的路径部分

openStream()方法-----打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream 。

基于TCP协议的Socket编程_双向通信_实现单次请求与响应

java socket如何请求485协议_学习Java的022天,认识网络编程

Soket编程实现一次双向通信的传输示意图

(1) 实现一次单次请求与响应,客户端与服务器的操作步骤是什么?

客户端:

1. 创建Socket对象

2. 获取输出流

3. 获取输入流

4. 关闭流,关闭Socket。

服务器端:

1.创建ServerSocket对象

2. 监听是否有客户端请求连接

3. 获取输入流

4. 获取输出流

5. 关闭流,关闭Socket

也可以说:

Ø 1. 创建服务器ServerSocket,在创建时,定义ServerSocket的监听端口(在这个端口接收客户端发来的消息)。

Ø 2. ServerSocket调用accept()方法,使之处于阻塞状态。

Ø 3. 创建客户端Socket,并设置服务器的IP及端口。

Ø 4. 客户端发出连接请求,建立连接。

Ø 5. 分别取得服务器和客户端Socket的InputStream和OutputStream。

Ø 6. 利用Socket和ServerSocket进行数据传输。

Ø 7. 关闭流及Socket

java socket如何请求485协议_学习Java的022天,认识网络编程

双向通信_实现单次请求与响应---客户端

java socket如何请求485协议_学习Java的022天,认识网络编程

双向通信_实现单次请求与响应---服务器端

java socket如何请求485协议_学习Java的022天,认识网络编程

两台电脑可以进行简单的单次双向通信

TCP协议的Socket编程_双向通信_实现模拟用户登录

双向通信用户登录的示意图:

java socket如何请求485协议_学习Java的022天,认识网络编程

用户登录的过程客户端与服务器的功能如下

客户端:1.创建Socket对象

2. 获取输出流(对象流)

3. 创建User对象,将封装后的对象发送服务器 4. 获取输入流(数据流)

5. 关闭流,关闭Socket

功能:发送用户的信息接收服务器的响应

服务器端:1. 创建ServerSocket对象

2. 获取输入流

3. 对用户名和密码进行验证

4. 获取输出流

5. 关闭流

功能:接收客户端的请求和响应客户端

客户端与服务器端单次聊天的缺点是:

只能客户端先发送数据,然后才能接收数据,如果不发就 收不到,(接收和发送是在一个线程中实现的)不符合实际情况

单次聊天的缺点的解决方案是

① 多次聊天可以使用循环来解决

② 先发后收的问题可以使用线程来解决,一个接收数据的线 程,一个发送数据的线程

java socket如何请求485协议_学习Java的022天,认识网络编程

实现群聊的原理是:

客户端创建接收和发送的线程。

服务器端创建多个客户端路径的线程

使用集合实现转发效果。

java socket如何请求485协议_学习Java的022天,认识网络编程

群聊实现的步骤为:

客户端:1.创建Socket对象

2. 创建发送的线程类对象

3. 创建接收的线程类对象

4. 创建Thread类对象并启动线程

5. 关闭流

服务器端:1. 创建集合对象,存储每一个连接进来的客户端

2. 创建ServerSocket对象

3. 监听客户端是否有客户端连接

4. 创建线程类的对象

5. 添加到集合中

6. 启动线程

7. 关闭流

(缺少的示例程序后续会练习并补充)