java 网络编程

网络编程

1.1 、 概述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-msnO9LVM-1651562535013)(…/…/…/…/Application Support/typora-user-images/image-20220502145707911.png)]

javaweb :B/S

网络编程 :C/S

1.2、网络通信的要素

如何实现网络的通信?

通信双方的地址:

  • IP
  • 端口
  • 192.168.16.124:5900

规则:网络通信的协议

TCP/IP参考模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KEzE4nH4-1651562535015)(…/…/…/…/Application Support/typora-user-images/image-20220502151621864.png)]

小结:

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

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

    • IP和端口号 ip类
    • 网络通信协议 udp,tcp类
  3. 万物皆对象

1.3 IP

ip地址:InetAddress

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

  • 127.0.0.1 localhost

  • ip地址的分类:

    • Ipv4、ipv6
    • 127.0.0.1 4个字节组成。0~255,42亿,2011年就用尽
    • 公网(互联网)-私网(局域网)
      • 192.168.xx.xx 专家给组织内部使用地址
  • 域名:记忆IP问题!

package Net;


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

public class Demo1 {
    public static void main(String[] args) throws UnknownHostException {
        //查询本机地址
        InetAddress inetaddress1 = InetAddress.getByName("127.0.0.1");
        System.out.println(inetaddress1);///127.0.0.1
        InetAddress inetaddress2 = InetAddress.getByName("localhost");
        System.out.println(inetaddress2);//www.baidu.com/112.80.248.75
        InetAddress inetaddress3 = InetAddress.getLocalHost();
        System.out.println(inetaddress3);//tianzhideMacBook-Pro.local/127.0.0.1
        //查询网站IP地址
        InetAddress intaddress4 = InetAddress.getByName("www.baidu.com");
        System.out.println(intaddress4);
        //常用方法
        System.out.println(intaddress4.getAddress());//[B@75b84c92
        System.out.println(intaddress4.getCanonicalHostName());//112.80.248.76
        System.out.println(intaddress4.getHostAddress());//112.80.248.76
        System.out.println(intaddress4.getHostName());//www.baidu.com

    }

}

1.4 端口

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

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

  • 被规定0-65535

  • TCP,UDP:65536*2 tcp:80,udp:80 。单个协议号下,端口号不能冲突

  • 端口分类:

    • 公有端口0-1023

      • HTTP:80
      • Https:443
      • FTP:21
      • SSH:22
      • TELENT:23
    • 程序注册端口:1024-49151 ,分配给用户或者给程序

      • Tomcat:8080
      • Mysql:3306
      • ORacle:1521
    • 动态端口、私有:63342

      netstat -ano //查看所有的端口
      netstat -ano|findstr "5900"//查看指定的端口
      tasklist|findstr "8996" //查看指定端口的进程
      
package Net;


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

public class Demo1 {
    public static void main(String[] args) {
        InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);
        InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080);
        System.out.println(socketAddress2);//localhost/127.0.0.1:8080
        System.out.println(socketAddress);///127.0.0.1:8080
        socketAddress.getAddress();
        System.out.println(socketAddress.getHostName());//localhost
        System.out.println(socketAddress.getPort());//8080

    }
}

1.5通信协议

协议:约定,就好比我们现在说的是普通话。

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

问题:非常复杂

大事化小:分层!

TCP/IP协议簇 :实际上是一组协议

重要:

  • tcp: 用户传输协议
  • UDP:用户数据报协议

出名的协议:

  • TCP:
  • Ip:网络互联协议

TCP UDP 对比

TCP:打电话

  • 连接,稳定

  • 三次握手,四次挥手

    • 最少需要三次,保证稳定连接
      A:你愁啥?
      B:瞅你咋地?
      A:干一场!
        
      A:我要断开
      B:我知道你要断开了
      B:你真的断开了吗
      A:我真的要走了
      
  • 客户端、跟服务端

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

UDP:发短信

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

1.6、TCP

客户端:

  1. 连接服务器Socket
  2. 发送消息

客户端:

  1. 建立服务器的端口ServerSocket
  2. 等待用户的链接accept
  3. 接受用的消息
//客户端
package Net;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;

public class TcpClientDemo01 {
    public static void main(String[] args) {
        Socket socket=null;
        OutputStream os=null;
        try {
            //要知道服务器的地址
            InetAddress ll = InetAddress.getByName("localhost");
            //定义端口号
            int port = 9999;
            //创建一个socket连接
             socket = new Socket(ll,port);
            //发送消息IO流
             os = socket.getOutputStream();
            os.write("你好小伙子".getBytes(StandardCharsets.UTF_8));



        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

//服务器端
package Net;

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) throws IOException {
        ServerSocket ss = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;

        try {
            //1。有一个地址
            ss = new ServerSocket(9999);
            //2.等待客户端连接过来
            socket = ss.accept();
            //3。读取客户端的消息
            is = socket.getInputStream();
            /* 之前学的读取流的方法是不是这样,但是如果超过1024,就容易乱码
            byte[] bytes = new byte[1024];
            int count;
            while ((count=is.read(bytes))!=-1){
                String msg = new String(bytes, 0, count);
                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());
            baos.close();
            is.close();
            socket.close();
            ss.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (baos != null) {
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (ss != null) {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

文件上传

客户端

package Net;

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

public class TcpClientDemo02 {
    public static void main(String[] args) throws IOException {
        //创建一个Socker连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),10001);
        //创建一个输出流
        OutputStream os = socket.getOutputStream();
        //3 读取文件
        FileInputStream fis = new FileInputStream(new File("C:\\Users\\tianzhi\\IdeaProjects\\untitled\\承诺书.jpg"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len=fis.read(buffer))!=-1){
            os.write(buffer,0,len);
        }

        //通知服务器,我已经结束了
        socket.shutdownOutput();//我已经传输完了

        //确定服务器接收完毕,才能断开连接
        InputStream is = socket.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] bytes2 = new byte[1024];
        int len2;
        while ((len2=is.read(bytes2))!=-1){
            baos.write(bytes2,0,len2);
        }
        System.out.println(baos.toString());

        is.close();
        baos.close();
        fis.close();
        os.close();
        socket.close();

    }

}

package Net;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class TcpServerDemo02 {
    public static void main(String[] args) throws IOException {
        //创建服务
        ServerSocket serverSocket = new ServerSocket(10001);
        //2监听客户端的连接
        Socket ss = serverSocket.accept();//阻塞式监听,会一直等待客户端连接
        //获取输入流
        InputStream is = ss.getInputStream();
        //文件输出流
        FileOutputStream fos = new FileOutputStream(new File("receive.jpg"));
        byte[] buffer = new byte[1024];
        int len;
        while ((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }

        //通知客户端我接收关闭了
        OutputStream os = ss.getOutputStream();
        os.write("我接收完毕了。你可以断开了".getBytes());

        os.close();
        fos.close();
        is.close();
        ss.close();
        serverSocket.close();


    }
}

1.7 Tomcat

服务器

  • 自定义 S
  • Tomcat服务器S: java后台开发!

客户端

  • 自定义C
  • 浏览器B

1.8 UDP

客户端:

package Net;

import java.io.IOException;
import java.net.*;

public class UdpClientDemo01 {
    public static void main(String[] args) throws IOException {
        //1 建立一个socket
        DatagramSocket socket = new DatagramSocket();
        //建立一个包
        String msg ="你好,服务器";
        //发送给谁?
        InetAddress localhost = InetAddress.getByName("localhost");
        int port=10002;
        //数据,数据起始,要发送给谁
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);

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


    }
}


接收端:

package Net;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
//还是要等待客户端的连接
public class UdpServerDemo01 {
    public static void main(String[] args) throws IOException {
        //开放端口
        DatagramSocket socket = new DatagramSocket(10002);
        //接收数据包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);//接收,相当于创建一个数据包接收包,当前数据包为null
        System.out.println(packet.toString());
        socket.receive(packet);//阻塞接收;将接收到的数据复制到数据包中
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(), 0, packet.getLength()));

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

UDP聊天实现,循化发送消息

//发送端
package Net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class UdpSenderDemo01 {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(10008);
        //准备数据:控制台读取system.In
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            String data = reader.readLine();
            byte[] datas = data.getBytes();
            DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 10007));
            socket.send(packet);
            if (data.equals("Bye")){
                break;
            }
        }
        socket.close();
    }
}

//接收端
package Net;

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

public class UdpsenderDemo02 {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(10007);
        while (true){
            //准备接收包裹
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
            socket.receive(packet );//阻塞式接收包裹

            //断开连接 bye
            byte[] data = packet.getData();
            String receiveData = new String(data, 0, packet.getLength());
            System.out.println(receiveData);
            if (receiveData.equals("Bye")){
                break;
            }
        }
        socket.close();



    }
}

1.9 URL

https://www.baidu.com

统一资源定位符:定位资源的,定位互联网上的某一个资源

DNS域名解析 www.baidu.com xxxx.xx.xx.xx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值