java网络编程

网络编程

1. 网络基础知识

1.1 计算机网络

指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件以及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统

1.2 OSI 七层模型

OSI(Open System Interconnect)开放式系统互联,一般也称作OSI参考模型。是由ISO(国际标准化组织)研究的网络互联模型。早期网络在各大公司的内部,是互通的,但是在外部,是不相通的。因为没有 一个统一的规范,外部计算机之间互相传输数据和信息,对方是不能理解的。所以不能互联。意义在于推荐所有公司使用这个规范来控制网络,具有相同的范围,就可以互联。

请添加图片描述

第一层物理层:建立、维护、断开物理连接(网卡、网线、光纤、集线器、中继器、调制解调器)报文头部和上层数据信息。都是由二进制数组成的。物理层将这些二进制数字组成的比特流转换成电信号在网络 中传输。

第二层数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。将上层数据加上源和目的方的物理(MAC)地址封装成数据帧.

第三层网络层:进行逻辑地址寻址,实现不同网络之间的路径选择(路由器),将上层的数据加上源和目的方的逻辑(IP)地址封装成数据包,实现数据从源到目的地的传输

第四层传输层:定义传输数据的协议端口号,以及流控和差校验(防火墙),将上层的数据分片并加上端口号封装成数据段,或者通过对报文头中的端口识别,实现数据从源到目的地的传输

第五层会话层:建立、管理、中止会话,管理是否允许不同机器上的用户之间建立会话连接关系

第六层表示层:数据的表示、安全、压缩,将接收到的数据翻译成二进制数组成的计算机语言,并对数据进行压缩和解压,数据加密和解密工作。

第七层应用导:网络服务与最终用户的一个接口,人机交互窗口。

假设要玩《英雄联盟》游戏

第一层:首先要有网卡、有网线

第二层:要有能访问服务器的工具,mac地址、交换机

第三层:需要有路由器

第四层:访问的协议和端口号

第五层:可以和服务器进行网络连接

第六层:向服务器发送指令,对指令进行二进制的翻译。然后压缩、传到服务器进行解压

第七层:界面展示

OSI和设备的对应关系

物理层-------------网卡

数据链路层-------交换机

网络层-------------路由器

传输层-------------防火墙

应用层-------------计算机

上三层总称应用层:用来控制软件方面

下四层总称数据流层:用来管理硬件方面

数据传输过程

请添加图片描述

1.3 TCP / IP

Transfer(Transmission) Control Protocol/Internet Protocol (传输控制协议/网际(网络)协议):

指能够在多个不同网络间实现信息传输的协议簇。TCP/IP不仅指TCP和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇。对互联网中各部分进行通信 的标准和方法进行规定。是保 证网络数据信息及时、完整传的重要协议。

TCP/IP是一个四层的体系结构:应用层、传输层、网络层和物理+数据链路层

1.4 传输层协议

UDP协议:

面向非连接、传输不可靠(丢包(数据丢失))、用于传输少量数据(数据报包模式)、速度快。发送端和接收端

一个无连接的传输协议,称为用户数据报协议(User Datagram Protocol)。提供了一种无需建立连接可以发送封装的IP数据包的方法

协议比较简单,实现容易,但是没有确认机制,数据包发送出去,无法知道对方是否收到,可靠性较差,但效率比较高。包含报头在内的数据最大长度是64k

TCP协议:

TCP:面向连接(经历三次握手)、传输可靠(保证了数据正确性,数据顺序的正确性),用来传输数据量大,(流模式)、速度慢,建立连接开销大。服务端和客户端

是面向连接的、可靠的、基于字节流的通信协议。是一种有确认机制的协议,每发出一个数据包都要求确认,如果有一个数据包丢失,接收方不会进行确认,发送方就必须要重新发这个数据包。

TCP的三次握手:目的是为了确认客户端和服务端的收发功能是否正常

请添加图片描述

通过三次握手,主要确认4件事情:

1.客户端的发送功能

2.客户端的接收功能

3.服务端的发送功能

4.服务端的接收功能

第一次握手:客户端主动发起的:理解为客户端给服务器发了一个短信,客户端只知道自己把短信发送了,服务端是否收到了短信,并不知道。但是当第一次握手的短信发送到服务端时,服务端就知道自己 的接收功能是没问题的。主要就是确认了服务端接收功能是好用的。

第二次握手,是服务器端发起的:向客户发送数据,有4个参数。如果客户端正常接收了这个消息 ,现在就可以确认:客户端发送功能没有问题,客户端接收功能没有问题。

第三次握手,客户端发起的。客户端又向服务器发送4个参数,服务器收到,就可以确认,服务器端接收 功能是没有问题。

2. 网络编程

2.1 简介

对信息的发送到接收,中间传输为物理线路。主要的工作就是在发送端把信息通过规定的协议进行组装包,在接收端按照规定协议把数据包进行解析,从而提取对应的信息,达到通信的目的。中间最主要析就是数据包的组装、过滤、捕获、分析、处理。

2.2 三要素

  1. 协议:为计算机网络中进行数据交换而建立的各种规则、标准或约定的集合

    1. 协议:网络协议的简称,是计算机双方必须遵守的规则
    2. http:超文本传输协议(不收费)
    3. https:使用安全的套接字传输的超文本协议(收费)
    4. ftp:文件传输协议
    5. file:文件,本机电脑或者网上分享的文件

    URI 与 URL

    1. URI:统一资源标识符,是用来标识某一个互联网资源名称的字符串
      • 包含:主机名,端口,标识符,相对uri
      • http://www.baidu.com/hello.html
    2. URL:统一资源定位符,是互联网的标准资源地址
      • 包含:主机名,端口,标识符,具体路径
      • http://ip:80/home/index.png
  2. IP地址:IP地址(Internet Protocol Address),互联网协议地址,IP地址像我们家庭住址一样,如果要给一个人发快递,需要知道地址,才能由快递员把包裹送到。

    IPV4: 以点进行划分,将一个地址划分成4个部分,每一组构成8位地址,可以算出42亿以上唯一地 址。

    IPV6:并不是一种全新的技术,旨在替换IPV4地址,使用冒号分隔的十六进制数字,分为八个16位块, 构成一个128位的地址方案。

    本机地址

    localhost

    127.0.0.1

    本机ip(cmd – ipconfig)

    InetAddress ip = InetAddress.getByName("LAPTOP-IQLK33VN");
    System.out.println(ip.getHostName());
    System.out.println(ip.getHostAddress());
    
  3. 端口号:设备和外界设备通信交流的出口, 计算机通过IP地址来代表其身份,只能表示某台特定的计算机。但是一台计算上可以同时提供多个服务,比如数据库服务\FTP服务\Web服务,通过端口号来区别在相同的计算上,所提供的不同服务。

    同一台电脑中,不能同时出现同一个端口,端口冲突

    21端口号 表示是FTP

    23端口号 表示Telnet

    25端口号 表示SMTP

    80端口号 表示HTTP

    从0-65535个端口号,1024以下的端口号保留给预定义的服务。

3 网络开发两种模式

C/S结构

Client/Server 客户端/服务器模式:服务器通常高性能的PC、工作站或小型机,并使用大型软件(数据库、WebLogic)。客户端通过安装客户端专用软件。合理分配了任务,给客户端和服务器,降低了系统的通讯开销,充分利用两端硬件环境优势。

B/S结构

Browser/Server 浏览器/服务器模式:是WEB兴起后的一种网络结构模式。WEB浏览器是客户端主要的应用软件。统一客户端,将系统功能的核心全部集中到服务器上,简化系统开发、维护和使用。

4. Socket套接字

4.1 简介

Socket(套接字):是进程间通信的一种方式,可以实现不同主机间的进程通信。应用程序通过Socket向网络发出请求或者响应网络请求。使用Socket来实现两个程序间的双向通讯,通迅的两端都有Socket,数据在两个Socket之间通过IO来进行传输

4.2 工作流程

请添加图片描述

4.3 基于TCP的Socket编程

4.3.1 实现聊天服务

Server端

public class Server {
    public static void main(String[] args) throws IOException {
        //创建了一个ServerSocket
        ServerSocket server=new ServerSocket(1234);
        System.out.println("等待连接...");
        //方法阻塞
        Socket client = server.accept();
        /*InetAddress address = client.getInetAddress();
        System.out.println(address.getHostAddress());
        System.out.println(address.getHostName());
        System.out.println(client.getPort());
        System.out.println(client.getLocalPort());
        System.out.println("已经有客户端连接...");*/
        InputStream inputStream = client.getInputStream();
        InputStreamReader isr=new InputStreamReader(inputStream);
        BufferedReader reader=new BufferedReader(isr);
        OutputStream outputStream = client.getOutputStream();
        PrintWriter pw=new PrintWriter(outputStream);
        Scanner scanner=new Scanner(System.in);
        while (true) {
            String str = reader.readLine();
            System.out.println("【客户端】:" + str);
            if ("bye".equals(str)){
            break;
            }
            str=scanner.nextLine();
            pw.println(str);
            pw.flush();
            if ("bye".equals(str)){
                break;
            }
        }
        reader.close();
        client.close();
        server.close();
    }
}

Client端

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("localhost",1234);
        System.out.println("连接服务器");
        OutputStream os=socket.getOutputStream();//获取输出流
        PrintWriter pw=new PrintWriter(os);
        InputStream inputStream = socket.getInputStream();
        InputStreamReader isr=new InputStreamReader(inputStream);
        BufferedReader reader=new BufferedReader(isr);
        Scanner scanner=new Scanner(System.in);
        System.out.println("请录入聊天内容:");
        while (true) {
            String str = scanner.nextLine();
            pw.println(str);
            pw.flush();
            if ("bye".equals(str)){
            	break;
            }
            str=reader.readLine();//接收服务器端发送的消息
            System.out.println("【服务器端】:"+str);
            if ("bye".equals(str)){
            	break;
            }
        }
        reader.close();
        pw.close();
        socket.close();
    }
}

4.3.2 基于TCP多线程上传文件

server端

public class UploadServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server=new ServerSocket(8888);
        while (true) {
            new Thread(()->{
                try {
                    Socket client = server.accept();
                    InputStream inputStream = client.getInputStream();
                    BufferedInputStream bis = new BufferedInputStream(inputStream);
                    FileOutputStream fos = new FileOutputStream("d:/aa/" +System.currentTimeMillis() + ".mp3");
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                    byte[] b = new byte[1024];
                    int x;
                    while ((x = bis.read(b)) != -1) {
                        bos.write(b, 0, x);
                    }
                    bis.close();
                    bos.close();
                    System.out.println("接收成功");
                    client.close();
                } catch (IOException e) {
                	e.printStackTrace();
                }
            }).start();
        }
        //server.close();
    }
}

Client端

public class UploadClient {
	public static void main(String[] args) throws IOException {
        Socket socket=new Socket("127.0.0.1",8888);
        FileInputStream fis=new FileInputStream("d:/aa/x.mp3");
        BufferedInputStream bis=new BufferedInputStream(fis);
        OutputStream oos=socket.getOutputStream();
        BufferedOutputStream bos=new BufferedOutputStream(oos);
        byte[] b=new byte[1024];
        int x;
        while ((x=bis.read(b))!=-1){
        	bos.write(b,0,x);
        }
        bis.close();
        bos.close();
        System.out.println("上传成功");
        socket.close();
    }
}

4.4 基于UDP的socket编程

public class UDPSocket1 {
    public static void main(String[] args) throws IOException {
        //创建一个Socket
        DatagramSocket socket=new DatagramSocket(2222);
        String msg="有内鬼,终止交易";
        //将字符串转成byte数组
        byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
        //创建一个数据包
        DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length,InetAddress.getByName("localhost"),3333);
        //调用send方法发送
        socket.send(packet);
    }
}    
public class UDPSocket2 {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket=new DatagramSocket(3333);
        byte[] b=new byte[1024];
        DatagramPacket packet=new DatagramPacket(b,b.length);
        //接收消息
        socket.receive(packet);
        //将消息byte数组转换成字符串
        String msg = new String(b, 0, packet.getLength(),
        StandardCharsets.UTF_8);
        System.out.println(msg);
    }
}

4.5 URL 统一资源定位符

public class TestUrl {
    public static void main(String[] args) throws IOException {
        URL url=new
        URL("https://inews.gtimg.com/newsapp_bt/0/15479502317/1000");
        url=new URL("https://new.qq.com/rain/a/20221204A06PK600");
        /* String protocol = url.getProtocol();
        String host = url.getHost();
        int port = url.getPort();
        String file = url.getFile();
        System.out.println("protocol = " + protocol);
        System.out.println("host = " + host);
        System.out.println("port = " + port);
        System.out.println("file = " + file);*/
        URLConnection urlConnection = url.openConnection();
        InputStream is = urlConnection.getInputStream();
        String fileName="d:/aa/qq.jpg";
        fileName="d:/aa/qq.html";
        FileOutputStream fis=new FileOutputStream(fileName);
        byte[] b=new byte[1024];
        int x;
        while ((x=is.read(b))!=-1){
        	fis.write(b,0,x);
        }
        is.close();
        fis.close();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小郑在努力ing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值