【资料图】
推荐学习:《java视频教程》
一、Socket知识
1. Socket概述
(1)Java最初是作为网络编程语言出现的,它对网络的高度支持,使得客户端和服务器端流畅的沟通成为现实。
(2)在网络编程中,使用最多的就是Socket,每一个实用的网络程序都少不了它的参与。
(3)在计算机网络编程技术中,两个进程或者说两台计算机可以通过一个网络通信连接实现数据的交换,这种通信链路的端点就被称为“套接字”(英文名称也就是Socket)。
(4)Socket是网络驱动层提供给应用程序的一个接口或者说一种机制。
(5)使用物流送快递的例子来说明Socket:
-->发件人将有收货人地址信息的货物送到快递站,发件人不用关心物流是如何进行的,货物被送到收货人所在地区的快递站点,进行配送,收货人等待收货就可以了。
-->这个过程很形象地说明了信息在网络中传递的过程。其中,货物就是数据信息,2个快递站点就是2个端点Socket。
(6)信息如何在网络中寻址传递,应用程序并不用关心,只负责准备发送数据和接收数据即可。
2. Socket通信原理
(1)对于编程人员来说,无须了解Socket底层机制是如何传送数据的,而是直接将数据提交给Socket,Socket会根据应用程序提供的相关信息,通过一系列计算,绑定IP及信息数据,将数据交给驱动程序向网络上发送。
(2)Socket的底层机制非常复杂,Java平台提供了一些简单但是强大的类,可以简单有效地使用Socket开发通信程序而无须了解底层机制。
3. java.net包
(1)java.net包提供了若干支持基于套接字的客户端/服务器通信的类。
(2)java.net包中常用的类有Socket、ServerSocket、DatagramPacket、DatagramSocket、InetAddress、URL、URLConnection和URLEncoder等。
(3)为了监听客户端的连接请求,可以使用ServerSocket类。
(4)Socket类实现用于网络上进程间通信的套接字。
(5)DatagramSocket类使用UDP协议实现客户端和服务器套接字。
(6)DatagramPacket类使用DatagramSocket类的对象封装设置和收到的数据报。
(7)InetAddress类表示Internet地址。
(8)在创建数据报报文和Socket对象时,可以使用InetAddress类
二、基于TCP协议的Socket编程
1.Socket类和ServerSocket类
● Socket类
Socket对象在客户端和服务器之间建立连接。可用Socket类的构造方法创建套接字,并将此套接字连接至指定的主机和端口。
(1)构造方法
-->第一种构造方法以主机名和端口号作为参数来创建一个Socket对象。创建对象时可能抛出UnknownHostException或IOException异常,必须捕获它们。
Socket s = new Socket(hostName,port);
-->第二种构造方法以InetAddress对象和端口号作为参数来创建一个Socket对象。构造方法可能抛出IOException或UnknownHostException异常,必须捕获并处理它们。
Socket s = new Socket(address,port);
(2)常用方法
● ServerSocket类
ServerSocket对象等待客户端建立连接,连接建立以后进行通信。
(1)构造方法
-->第一种构造方法接受端口号作为参数创建ServerSocket对象,创建此对象时可能抛出IOException异常,必须捕获和处理它。
ServerSocket ss = new ServerSocket(port);
-->第二种构造方法接受端口号和最大队列长度作为参数,队列长度表示系统在拒绝连接前可以拥有的最大客户端连接数。
ServerSocket ss = new ServerSocket(port,maxqu);
(2)常用方法
-->Socket类中列出的方法也适用于ServerSocket类。
-->ServerSocket类具有accept()方法,此方法用于等待客户端发起通信,这样Socket对象就可用于进一步的数据传输。
2.使用Socket编程实现登录功能
● 实现单用户登录
-->Socket网络编程一般分成如下4个步骤进行:
(1)建立连接。
(2)打开Socket关联的输入/输出流。
(3)从数据流中写入信息和读取信息。
(4)关闭所有的数据流和Socket。
-->使用两个类模拟实现用户登录的功能,实现客户端向服务器端发送用户登录信息,服务器端显示这些信息。
客户端实现步骤:
1)建立连接,连接指向服务器及端口。
2)打开Socket关联的输入/输出流。
3)向输出流中写入信息。
4)从输入流中读取响应信息。
5)关闭所有的数据流和Socket。
服务器端实现步骤:
1)建立连接,监听端口。
2)使用accept()方法等待客户端发起通信
3)打开Socket关联的输入/输出流。
4)从输入流中读取请求信息。
5)向输出流中写入信息。
6)关闭所有的数据流和Socket。
-->客户端和服务器端的交互,采用一问一答的模式,先启动服务器进入监听状态,等待客户端的连接请求,连接成功以后,客户端先“发言”,服务器给予“回应”。
示例01:实现传递对象信息。
示例02:升级演示示例01,实现传递多个对象信息。
● 实现多客户端用户登录
-->一问一答的模式在现实中显然不是人们想要的。一个服务器不可能只针对一个客户端服务,一般是面向很多的客户端同时提供服务的,但是单线程实现必然是这样的结果。
-->解决这个问题的办法是采用多线程的方式,可以在服务器端创建一个专门负责监听的应用主服务程序、一个专门负责响应的线程程序。这样可以利用多线程处理多个请求。
->客户端实现步骤:
1)建立连接,连接指向服务器及端口。
2)打开Socket关联的输入/输出流。
3)向输出流中写入信息。
4)从输入流中读取响应信息。
5)关闭所有的数据流和Socket。
-->服务器端实现步骤:
1)创建服务器线程类,run()方法中实现对一个请求的响应处理。
2)修改服务器端代码,让服务器端Socket一直处于监听状态。
3)服务器端每监听到一个请求,创建一个线程对象并启动。
示例03:升级演示示例02,实现多客户端的响应处理。
-->java.net包中的InetAddress类用于封装IP地址和DNS。要创建InetAddress类的实例,可以使用工厂方法,因为此类没有构造方法。
-->InetAddress类中的工厂方法
-->如果找不到主机,两种方法都将抛出UnknownHostNameException异常。
三、基于UDP协议的Socket编程
TCP | UDP | |
是否连接 | 面向连接 | 面向非连接 |
传输可靠性 | 可靠 | 不可靠 |
速度 | 慢 | 快 |
1.DatagramPacket类和DatagramSocket类
● DatagramPacket类
(1)构造方法
-->客户端要向外发送数据,必须首先创建一个DatagramPacket对象,再使用DatagramSocket对象发送。
(2)常用方法
● DatagramSocket类
(1)构造方法
-->DatagramSocket类不维护连接状态,不产生输入/输出数据流,它的唯一作用就是接收和发送DatagramPacket对象封装好的数据报。
(2)常用方法
2.使用Socket编程实现客户咨询
-->利用UDP通信的两个端点是平等的,也就是说通信的两个程序关系是对等的,没有主次之分,甚至它们的代码都可以完全是一样的,这一点要与基于TCP协议的Socket编程区分开来。
-->基于UDP协议的Socket网络编程一般按照以下4个步骤进行:
(1)利用DatagramPacket对象封装数据包。
(2)利用DatagramSocket对象发送数据包。
(3)利用DatagramSocket对象接收数据包。
(4)利用DatagramPacket对象处理数据包。
-->模拟客户咨询功能,实现发送方发送咨询问题,接收方接收并显示发送来的咨询问题。
发送方实现步骤:
1)获取本地主机的InetAddress对象。
2)创建DatagramPacket对象,封装要发送的信息。
3)利用DatagramSocket对象将DatagramPacket对象数据发送出去。
接收方实现步骤:
1)创建DatagramPacket对象,准备接收封装的数据。
2)创建DatagramSocket对象,接收数据保存于DatagramPacket对象中。
3)利用DatagramPacket对象处理数据。
示例04:发送方发送咨询问题,接收方回应咨询。
推荐学习:《java视频教程》
以上就是JAVA进阶学习之Socket编程的详细内容,更多请关注php中文网其它相关文章!