网络编程

网络编程

概述

信件

image-20220819111710419

计算机网络:

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

网络编程的目的:

无线电脑...传播交流信息,数据交换。通信

想要达到的这个效果是什么:

  1. 如何准确的定位网络上的一台主机 192.168.16.124:端口,定位到这个计算机上的某个资源
  2. 找到了这个主机,如何传输数据呢?

javaweb:网页编程,B/S

网络编程:TCP/IP C/S

1.2、网络通信的要素

人工智能:智能汽车

如何实现网络的通信?

通信双方地址:

  • ip
  • 端口号
  • 192.168.16.124.5900

规则:网络通信的协议

TCP/IP参考模型image-20220819113557432

小结:

  1. 网络编程中有两个主要的问题

    • 如何准确的定位到网络上的一台或者多台主机
    • 找到主机后如何进行通信
  2. 网络编程中的要素

    1. IP和端口号 IP.
    2. 网络通信协议UDP TCP
  3. 万物皆对象

1.3、IP

ip地址:address

  • 唯一定位一台网络上的计算机

  • 127.0.0.1:本机localhost

  • ip地址的分类

    • ipv4、ipv6
      • IPV4 127.0.0.1 4个字节组成。0-255,42亿~;30亿都在北美,亚洲4亿,2011年用完
      • IPV6 fe80::3d5f:9174:92e3:f9c7%21,128位。8个无符号整数!abcde
        • 2001:0bb2:aaaa:0015:0000:0000:1aaa:1312!
    • 公网(互联网)-私网(局域网)
      • ABCD类地址
      • 192.168.xx.xx,专门给组织内部使用的
  • 域名:记忆IP问题!

    • IP :www.vip.com
package com.xccvt;

import java.net.InetAddress;
import java.net.UnknownHostException;

//测试IP
public class lesson01 {
    public static void main(String[] args) {
        try {
//          查询本机地址
            InetAddress inetAddress=InetAddress.getByName("127.0.0.1");
            System.out.println(inetAddress);
            InetAddress inetAddress1=InetAddress.getByName("www.baidu.com");
            System.out.println(inetAddress1);
            InetAddress inetAddress2=InetAddress.getByName("xccvt.cn");
            System.out.println(inetAddress2);
            InetAddress inetAddress3=InetAddress.getLocalHost();
            System.out.println(inetAddress3);
//            System.out.println(inetAddress3.getAddress());
            System.out.println(inetAddress2.getCanonicalHostName());//规范的名字
            System.out.println(inetAddress2.getHostAddress());//ip
            System.out.println(inetAddress2.getHostName());//域名、或者自己电脑的名字


        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

1.4端口

端口表示计算机上个的一个进程:

  • 不同的进程有不同的端口号!用来区分软件!

  • 被规定0-65535

  • TCP,VDP:65535*2 tcp:80,udp:80码,单个协议下:端口号不能冲突

  • 端口分类

    • 公用端口0-1023

      • HTTP:80
      • HTTPS:443
      • FTP:21
      • Telent:23
    • 程序注册端口:1024-49151,分配用户或者程序

      • Tomcat:8080
      • MySQL:3306
      • Oracle:1521
    • 动态、私有:49152-65535

    • netstat -ano #查看所有端口
      netstat -ano|findstr "8657"	#查看指定端口
      tasklist|findstr "8657"	#查看指定端口进程
      

      image-20220820094121970

1.5、通信协议

协议:约定

网络通信协议:速率,传输码率,代码结构,传输控制.....

问题

大事化小:分层!

TCP/IP协议簇

重要:

  • TCP:用户传输协议
  • UDP:用户数据协议

出名的协议:

  • TCP
  • UDP:用户数据协议

image-20220820094605298

TCP udp对比

TCP:打电话

  • 连接,稳定

  • 三次握手 四次挥手

  • 最少需要三次,保证稳定连接
    A:发送-信息
    B:接受-告诉你
    A:好-知道了
    
    
    
    
    
  • 客户端、服务端

  • 传输完成,释放连接,效率低

UDP:发短信

  • 不连接,不稳定
  • 客户端、服务器:没有明确的界限
  • 不管有没有准备好,都可以发给你...
  • 导弹
  • DDOS:洪水攻击!(饱和攻击)

1.6、TCP

客户端

1、连接服务器Socket

2、发送消息

服务器

  1. 建立服务的端口ServerSocket
  2. 等待用户的链接accept
  3. 接受用户的消息
package com.xccvt.Lesson02;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClientDemo01 {
    public static void main(String[] args) {
        Socket socket=null;
        OutputStream os=null;
        try {
            InetAddress serverip=InetAddress.getByName("127.0.0.1");
            int port=9999;
            socket=new Socket(serverip,port);
            os=socket.getOutputStream();
            os.write("您好15456464".getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (os!=null){
                try {
                    os.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            if (socket!=null){
                try {
                    socket.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }

        }
    }
}
package com.xccvt.Lesson02;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//服务器
public class TcpServerDemo01 {
    public static void main(String[] args) {
        ServerSocket serverSocket=null;
        Socket socket=null;
        InputStream is=null;
        ByteArrayOutputStream baos=null;
        try {
            serverSocket=new ServerSocket(9999);
            socket=serverSocket.accept();
            is=socket.getInputStream();
          /*  byte[] buffer=new byte[1024];
            int len;
            while ((len=is.read(buffer))!=-1){
                String msg=new  String(buffer,0,len);
                System.out.println(msg);
            }*/
//            管道流
            baos=new ByteArrayOutputStream();
            byte[] buffer=new byte[1024];
            int len;
            while ((len=is.read(buffer))!=-1){
                baos.write(buffer,0,len);
            }
            System.out.println(baos.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (baos!=null){
                try {
                    baos.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            if (socket!=null){
                try {
                    socket.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            if (is!=null){
                try {
                    is.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            if (serverSocket!=null){
                try {
                    serverSocket.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

文件上传

package com.xccvt.Lesson02;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

public class TcpClientDemo02 {
    public static void main(String[] args) throws IOException {
//       1、创建一个Socket链接

            Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),9000);
//            2、创建一个输出流
            OutputStream os=socket.getOutputStream();
//            3、文件流
            FileInputStream fis=new FileInputStream(new File("1.jpg"));
            byte[] buffer=new byte[1024];
            int len;
            while ((len=fis.read(buffer))!=-1){
                os.write(buffer,0,len);
            }
            socket.shutdownOutput();//传输完毕
//            确定服务器接受完毕,才能断开连接
            InputStream inputStream=socket.getInputStream();
            ByteArrayOutputStream baos=new ByteArrayOutputStream();
            byte[] buffer2=new byte[2014];
            int len2;
            while ((len2=inputStream.read(buffer2))!=-1){
                baos.write(buffer2,0,len2);
            }
            System.out.println(baos.toString());
            baos.close();
            fis.close();
            os.close();
            socket.close();
    }
}
package com.xccvt.Lesson02;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

//服务器
public class TcpServerDemo02 {
    public static void main(String[] args) throws IOException {
//        1、创建服务
        ServerSocket serverSocket=new ServerSocket(9000);
//        2、监听客户端的连接
        Socket socket=serverSocket.accept();
//        3、获取输入流
        InputStream is=socket.getInputStream();
//        4、文件输出
        FileOutputStream fos=new FileOutputStream(new File("receive.jpg"));
        byte[] buffer=new byte[1024];
        int len;
        while ((len=is.read(buffer))!=-1){
            fos.write(buffer);
        }
//        通知客户端我接受完毕了
        OutputStream os=socket.getOutputStream();
        os.write("接受完毕".getBytes());
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();

    }
}

Tomact

服务器!

  • 自定义
  • Tomcat服务器:java后端

客户端

  • 自定义C
  • 浏览器B

1.7UDP

发短信:不用连接,需要知道对方的地址!

发送端

package com.xccvt.com.lesson03;

import java.net.*;

public class UdpClientDemo01 {
    public static void main(String[] args) throws Exception {
//        1、建立一个Socket
        DatagramSocket socket=new DatagramSocket();

//        2、建个包
        String msg="你好啊,服务器!";
//        发送给谁
        InetAddress localhost = InetAddress.getByName("localhost");
        int port=9090;
//        数据
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);

//        3、发送包
        socket.send(packet);
//        4、关闭流
        socket.close();
    }
}

接收端

package com.xccvt.com.lesson03;


import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpServerDemo01 {
    public static void main(String[] args) throws Exception {
//        开放端口
        DatagramSocket socket = new DatagramSocket(9090);
//        接受数据包
        byte[] buffer=new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
        socket.receive(packet);//阻塞接受
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0,packet.getLength()));

//        关闭链接
        socket.close();
    }
}

咨询

posted @   六个小豹  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示