网络编程(java)

1 网络编程概述

1.1什么是计算机网络?

把分布在不同地理区域的,居有独立功能的计算机,通过通信线路连接起来,能够实现资源传递共享。

  • 有人说,20世纪最伟大的发明不是计算机,而是计算机网络。 还有人说,如果你买了计算机而没有联网,就等于买了电话机而没有接电话线一样。

1.2 网络编程概述

什么是网络编程?

  • 使用计算机语言开发软件,让软件能够通过网络进行数据交换,java语言支持网络通信。

  1. Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。

  2. Java提供的网络类库,可以实现网络连接,联网的底层细节被隐藏在Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。

网络编程的目的: 直接或间接地通过网络协议与其它计算机进行通讯。

1.3网络编程的核心问题:

①如何精确找到计算机网络中的目标主机?

IP+端口:ip是计算机的地址(找电脑)(ipv4、ipv6),端口对应的是计算机上的一个进程(找程序),ip+端口----->找到某台主机+找到主机上某个程序

②找到后如何安全可靠的传输数据?

协议:对传输的速率,传输代码、代码结构(报文)、传输控制步骤、出错控制等内容制定标准。

2 网络模型

2.1 OSI模型:把网络分为七层(理想实现)

由低至高有七层:物理层、数据链路层、网络层、传输层、表示层、会话层、应用层。

1.应用层:

  • 专门用于应用程序。与其他计算机进行通讯的一个应用,解决最终通信双方数据传输问题,即不同结点上两个对应应用进程之间的通信。 协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP等。

2.表示层:

  • 定义数据格式以及加密。(在五层模型里面已经合并到了应用层)。 格式有,JPEG、ASCll、DECOIC、加密格式等。

3.会话层:

  • 在会话层及以上的高层次中,数据传送的单位不再另外命名,统称为报文。会话层不参与具体的传输,它提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制。如服务器验证用户登录便是由会话层完成的。定义了如何开始、控制和终止一个会话。(在五层模型里面已经合并到了应用层)。 对应主机进程,指本地主机与远程主机正在进行的会话。

4.传输层:

  • 提供端对端的通信管理。 定义传输数据的协议端口号,以及流控和差错校验。协议有:TCP UDP等,数据包一旦离开网卡即进入网络传输层。

5.网络层:

  • 进行逻辑地址寻址,实现不同网络之间的路径选择。(路由选择) 协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP。在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息- -源站点和目的站点地址的网络地址。

6.数据链路层:

  • 采取差错检测、差错控制、流量控制等方法将有差错的物理线路变为无差错的数据链路。传输介质为“帧”。

7.物理层:

  • 作用是建立、维护、断开物理连接。物理层实际上就是布线、光纤、网卡和其它用来把两台网络通信设备连接在一起的东西(甚至一个信鸽也可以被认为是一个1层设备)。物理层设置目的就是屏蔽通信设备和通信技术,只需要考虑如何使用物理层服务。传输介质为“比特”。

2.2 TCP/IP模型:把网络分成四层(现实实现)

1.网络接口层:

  • 网络接口层包括用于协作IP数据在已有网络介质上传输的协议。它定义像地址解析协议这样的协议,提供TCP/IP 协议的数据结构和实际物理硬件之间的接口。 可以理解为:确定网络数据包的形式。

2.网络层

  • 网络层对应于 OSI 七层参考模型的网络层,本层包含 IP 协议、RIP 协议,负责数据的包装、寻址和路由。同时还包含网间控制报文协议用来提供网络诊断信息; 可以理解为:该层能确定计算机的位置。

3.传输层

  • 传输层对应于 OSI 七层参考模型的传输层,它提供两种端到端的通信服务。其中 TCP 协议提供可靠的数据流运输服务,UDP 协议提供不可靠的用户数据报服务。

     

4.应用层

  • 应用层对应于 OSI 七层参考模型的应用层和表达层会话层。

d870d34cccac4f1996ee65946e94bbe6.png

 

3 网络通信要素:IP,端口号,通信协议

3.1 IP

  • IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址.网络中的计算机使用IP地址来进行唯一标识;

  • 在Windows系统下,打开cmd,输入命令ipconfig,按回车即可查看。

  • 本地回环地址(hostAddress):127.0.0.1 ,它代表设备的本地虚拟接口.

0816a900c63245d6a397c1300b8e0df0.png

 3.2 端口号

端口号是计算机中的应用程序的一个整数数字标号,用来区分不同的应用程序。

0 ~ 1024 未被系统使用或保留的端口号,0 ~ 65535为有效的端口号, 也就是说我们要对一些程序定义端口号的时候,要选择1024 ~ 65535范围内的整数数字。

比如,以前学过的MySQL的端口号是3306,SQLServer的端口号是1433, 查了一下Oracle的端口号是1521。

3.3 网络通信协议

计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、 传输控制步骤、出错控制等制定标准。

1.传输层协议中有两个非常重要的协议:

①传输控制协议TCP(Transmission Control Protocol) ;

②用户数据报协议UDP(User Datagram Protocol)。

TCP:

①安全可靠的传输协议;

②每次传输数据时,先与服务器通过“三次握手”建立连接;

③保证网络通畅,然后再进行数据传输,在连接中可进行大数据量的传输;

④断开时进行“四次挥手”,保证客户端和服务器都知情;

⑤因为要建立连接,所以传输速率相比于UDP速率慢。

⑥TCP协议进行通信的两个应用进程:客户端、服务端。

三次握手:fcb6de729aec4973876c463063c80eae.png

 四次挥手:

6efb1dfee2dd49aa895bd53ae75446f3.png

 UDP:

①将数据、源、目的封装在数据报中进行发送,不需要建立连接,发送是否成功不知道;

②因为无需连接,故是不可靠的;

③每个数据报的大小限制在64K内;

④发送数据结束时无需释放资源,速度快。

4 Java中的网络编程

Java语言支持网络通信,将支持网络编程的类都封装在java.net包中,提供支持TCP协议传输的实现类。

ServerSocket(服务器端)

Scoket(客户端)

4.1 TCP编程

● 利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准。

● 通信的两端都要有Socket,是两台机器间通信的端点

● 网络通信其实就是Socket间的通信。

● Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。54a0606c347c402ebb6d7242f5bdb772.png

方 法功 能
void close() throws IOException关闭Socket,不可在以后的网络连接中使用,除非创建新的套接字。
InputStream getInputStream() throws IOException获取与Socket相关联的字节输入流,用于从Socket中读取数据。
OutputStream getOutputStream() throws IOException获取与Socket相关联的字节输出流,用于向Socket中写数据。

ServerSocket常用方法:

方 法

功 能

Socket accept() throws IOException

等待客户端连接请求,返回与该客户端进行通信用的Socket对象

void close()throws IOException

关闭监听Socket

客户端Socket的工作过程包含以下四个基本的步骤:

创建 Socket:

  • 根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。

打开连接到 Socket 的输入/出流:

  • 使用 getInputStream()方法获得输入流, 使用 getOutputStream()方法获得输出流,进行数据传输

按照一定的协议对 Socket 进行读/写操作:

  • 通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。

关闭 Socket:

  • 断开客户端到服务器的连接,释放线路

注意:

客户端程序可以使用Socket类创建对象,创建的同时会自动向服务器方发起连接

Socket的构造方法是:

①Socket(String host,int port)throws UnknownHostException,IOException

  • 向服务器(域名是host。端口号为port)发起TCP连接,若成功,则创建Socket对象,否则抛出异常。

②Socket(InetAddress address,int port)throws IOException

  • 根据InetAddress对象所表示的IP地址以及端口号port发起连接。

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
​
public class Client {
    public static void main(String[] args) throws IOException {
        //创建客户端,创建时就会连接服务器,检查网络是否通畅
        Socket socket = new Socket("127.0.0.1", 9999);
        //DataOutputStream 数据输出字节流
        //向服务器发送消息
        DataOutputStream dataOut = new DataOutputStream(socket.getOutputStream());
                         dataOut.writeUTF("你好服务器");
        //接收服务器发送的消息
        DataInputStream dataIn = new DataInputStream(socket.getInputStream());
        System.out.println("服务器说:"+dataIn.readUTF());
    }
}

服务器程序的工作过程包含以下四个基本的步骤:

①调用 ServerSocket(int port) :

  • 创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。

②调用 accept():

  • 监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。

③调用该Socket类对象的 getOutputStream() 和 getInputStream ():

  • 获取输出流和输入流,开始网络数据的发送和接收。

④关闭ServerSocket和Socket对象:

  • 客户端访问结束,关闭通信套接字。

服务器建立 ServerSocket 对象

ServerSocket 对象负责等待客户端请求建立套接字连接,类似邮局某个窗口中的业务员。也就是说,服务器必须事先建立一个等待客户请求建立套接字连接的ServerSocket对象,所谓“接收”客户的套接字请求,就是accept()方法会返回一个 Socket 对象 。

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/*
   基于TCP协议下的通信方式
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //创建服务器
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器启动,等待连接");
        //监听是阻塞的,直到有客户端连接上来,才能继续向下执行
        Socket socket = serverSocket.accept();
        System.out.println("客户端连接成功");
        //接收客户端发送的消息
        DataInputStream dataIn = new DataInputStream(socket.getInputStream());
        System.out.println("客户端说:"+dataIn.readUTF());
        //向客户端回复信息
        DataOutputStream dataOut = new DataOutputStream(socket.getOutputStream());
        dataOut.writeUTF("你好客户端");
    }
}

5 UDP编程

● 类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。

● UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。

● DatagramPacket 对象封装了UDP数据报(数据、源、目标),在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。

● UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接

流 程:

  1. DatagramSocket与DatagramPacket

  2. 建立发送端,接收端

  3. 建立数据报

  4. 调用Socket的发送、接收方法

  5. 关闭Socket

● 发送端与接收端是两个独立的运行程序

发送端:

import java.io.IOException;
import java.net.*;
/*
   基于UDP协议下的通信方式
 */
public class Send {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket();
​
        byte[] bytes = "你好,接收端!".getBytes();
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 9999);
                       datagramSocket.send(datagramPacket);
    }
}

接收端,要指定监听的端口:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
​
public class Receive {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(9999);
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);
        datagramSocket.receive(datagramPacket);
        String msg = new String(datagramPacket.getData(), 0, datagramPacket.getLength(), "utf-8");
        System.out.println(msg);
    }
}

 

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chen☆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值