Java教程

JAVASE第九章

本文主要是介绍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 协议网络程序。

  1. UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP 数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
  2. 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第九章的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!