JAVASE第九章
2021/6/28 20:20:59
本文主要是介绍JAVASE第九章,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 前言
- 一、网络编程概述
- 二、通讯要素:IP和端口号
- 三、InetAddress类
- 四、通讯要素:网络通信协议
- 五、Socket
- 5.1 TCP通信程序介绍
- 5.2 Socket类
- 5.3 ServerSocket类
- 六、UDP
- 总结
前言
网络编程,就是在一定的协议下,实现两台计算机的通信的程序。Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的 支持,程序员能够很容易开发常见的网络应用程序。
一、网络编程概述
把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。
Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的 支持,程序员能够很容易开发常见的网络应用程序。
Java提供的网络类库,可以实现网络连接,联网的底层细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个 跨平台的网络库,程序员面对的是一个统一的网络编程环境。
网络编程的目的: 直接或间接地通过网络协议与其它计算机进行通讯。
网络编程中有两个主要的问题:
1如何准确地定位网络上一台或多台主机
2.找到主机后如何可靠高效地进行数据传输。
如何实现网络中的主机互相通信:
1.通信双方地址
2.一定的规则
二、通讯要素:IP和端口号
网络通信:
如何找到计算机网络中的某台主机(IP).
找到主机后如何可靠安全高效数据传输(通信协议)
IP+端口号:
什么是IP地址:指互联网协议地址(Internet Protocol Address),俗称IP。IP地址用来给一个网络中的计算机设备做唯一的编号。假如我们把“个人电脑”比作“一台电话”的话,那么“IP地址”就相当于“电话号码”。
网络的通信,本质上是两个进程(应用程序)的通信。每台计算机都有很多的进程,那么在网络通信时,如何区分这些进程呢?
如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的进程(应用程序)了。
端口号:用两个字节表示的整数,它的取值范围是0-65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。
利用 协议 + IP地址 + 端口号 三元组合,就可以标识网络中的进程了,那么进程间的通信就可以利用这个标识与其它进程进行交互。
三、InetAddress类
四、通讯要素:网络通信协议
网络通信协议: 计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
TCP/IP协议: 传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是Internet最基本、最广泛的协议。它定义了计算机如何连入因特网,以及数据如何在它们之间传输的标准。它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的
协议来完成自己的需求
通信协议分层的思想: 由于结点之间联系很复杂,在制定协议时,把复杂成份分解成一些简单 的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可 以通信、上一层可以调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展。
通信的协议还是比较复杂的, java.net 包中包含的类和接口,它们提供低层次的通信细节。我们可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节。
TCP:传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前,
在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。
第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
第三次握手,客户端再次向服务器端发送确认信息,确认连接。
UDP:用户数据报协议(User Datagram Protocol)。UDP协议是一个面向无连接的协议。传输数据时,不需要建立连接,不管对方端服务是否启动,直接将数据、数据源和目的地都封装在数据包中,直接发送。每个数据包的大小限制在64k以内。它是不可靠协议,因为无连接,所以传输速度快,但是容易丢失数据。日常应用中,例如视频会议、QQ聊天等。
五、Socket
5.1 TCP通信程序介绍
TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。
两端通信步骤:
1.服务端程序,需要事先启动,等待客户端的连接。
2.客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。
在Java中,提供了两个类用于实现TCP通信程序
客户端: java.net.Socket 类表示。创建 Socket 对象,向服务端发出连接请求,服务端响应请求,两者建 立连接开始通信。
服务端: java.net.ServerSocket 类表示。创建 ServerSocket 对象,相当于开启一个服务,并等待客户端 的连接。
5.2 Socket类
Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。
构造方法:
public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null ,则相当于指定地址为回送地址。
回送地址(127.x.x.x) 是本机回送地址(Loopback Address),主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,立即返回,不进行任何网络传输。
代码:Socket client = new Socket(“127.0.0.1”, 6666);
成员方法:
public InputStream getInputStream() : 返回此套接字的输入流。
如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。
关闭生成的InputStream也将关闭相关的Socket。
public OutputStream getOutputStream() : 返回此套接字的输出流。
如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。
关闭生成的OutputStream也将关闭相关的Socket。
public void close() :关闭此套接字。
一旦一个socket被关闭,它不可再使用。
关闭此socket也将关闭相关的InputStream和OutputStream 。
public void shutdownOutput() : 禁用此套接字的输出流。
任何先前写出的数据将被发送,随后终止输出流。
5.3 ServerSocket类
ServerSocket 类:这个类实现了服务器套接字,该对象等待通过网络的请求。
构造方法:public ServerSocket(int port) :使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指 定的端口号上,参数port就是端口号。
代码:ServerSocket server = new ServerSocket(6666);
成员方法:public Socket accept() :侦听并接受连接,返回一个新的Socket对象,用于和客户端实现通信。该方法 会一直阻塞直到建立连接。
public class Sever { public static void main(String[] args) throws IOException { ServerSocket mySever=new ServerSocket(9900); Scanner sb=new Scanner(System.in); System.out.println("等待客户端连接"); Socket mySocket=mySever.accept(); //等待客户端的连接请求,返回与该客户端进行通信用的 Socket对象 System.out.println("连接成功"); OutputStream out=mySocket.getOutputStream(); DataOutputStream myOut=new DataOutputStream(out); InputStream in=mySocket.getInputStream(); DataInputStream myIn=new DataInputStream(in); while(true){ System.out.println("客户端:"+myIn.readUTF()); myOut.writeUTF(sb.next()); } } } public class Client { public static void main(String[] args) throws IOException { Socket mySocket=new Socket("192.168.31.176",9900); Scanner sb=new Scanner(System.in); OutputStream out=mySocket.getOutputStream(); DataOutputStream myOut=new DataOutputStream(out); InputStream in=mySocket.getInputStream(); DataInputStream myIn=new DataInputStream(in); while(true){ myOut.writeUTF(sb.next()); System.out.println("服务器:"+myIn.readUTF()); } } }
六、UDP
类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
- UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP 数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
- DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址 和端口号以及接收端的IP地址和端口号。
3. UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方 的连接
public class Sever2 { public static void main(String[] args) throws IOException { DatagramSocket mySocket=new DatagramSocket(9966); byte[]b=new byte[1024]; //构造一个 DatagramPacket用于接收长度的数据包 length 。 DatagramPacket dp=new DatagramPacket(b,b.length); while(true) { mySocket.receive(dp); //receive(DatagramPacket p) :从此套接字接收数据报包。 //getData() 返回数据缓冲区 String msg = new String(dp.getData(), 0, dp.getLength(), "utf-8"); System.out.println(msg); } } } public class Client2 { public static void main(String[] args) throws IOException { Scanner sb=new Scanner(System.in); DatagramSocket mySocket=new DatagramSocket(9966); System.out.println("请输入你想对服务器说的话"); while(true) { byte[] b = sb.next().getBytes(); //InetAddress.getByName:确定主机名称的IP地址。 //构造用于发送长度的分组数据报包 length具有偏移 ioffset指定主机上到指定的端口号。 DatagramPacket dp = new DatagramPacket(b, 0, b.length, InetAddress.getByName("127.0.0.1"),9966); mySocket.send(dp); // send(DatagramPacket p) 从此套接字发送数据报包。 } } }
总结
网络编程,就是在一定的协议下,实现两台计算机的通信的程序。在JAVASE的网络编程章节学习中,应该重点掌握网络编程的两个重要协议以及Socket类和ServerSocket类的使用,可以自己动手编写一个客户端和服务器进行交互,加深对网络编程的应用与理解。
这篇关于JAVASE第九章的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-27消息中间件底层原理资料详解
- 2024-11-27RocketMQ底层原理资料详解:新手入门教程
- 2024-11-27MQ底层原理资料详解:新手入门教程
- 2024-11-27MQ项目开发资料入门教程
- 2024-11-27RocketMQ源码资料详解:新手入门教程
- 2024-11-27本地多文件上传简易教程
- 2024-11-26消息中间件源码剖析教程
- 2024-11-26JAVA语音识别项目资料的收集与应用
- 2024-11-26Java语音识别项目资料:入门级教程与实战指南
- 2024-11-26SpringAI:Java 开发的智能新利器