Day15-网络编程

网络编程

计算机网络

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

网络编程的目的

  • 数据交换
  • 通信

网络通信要素

地址

  • ip
  • 端口号

通过ip地址和对应端口号,可以准确定位到某个机器上的某个应用

规则

网络协议

在这里插入图片描述

IP

ip地址:InetAddress

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

  • 127.0.0.1:本机localhost

  • ip地址的分类

    • Ipv4/Ipv6
    • 公网-私网
      • ABCD类地址
      • 192.168.xx.xx局域网内部地址
  • 域名:记忆ip地址

    存在一个dns服务器,用来将对应的域名转化成ip地址,便于人们记忆ip地址

InetAddress address = InetAddress.getByName("127.0.0.1");

端口

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

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

  • 规定有0-65535

  • 根据提供的服务方式不同,可以分为TCP协议端口UDP协议端口,单个协议下,端口号不能重复。

  • 端口分类

    • 根据协议分类

      • TCP协议端口

        多用于与用户端直连的连接方式

      • UDP协议端口

        将信息发布出去,不关心后续,也称无连接方式

    • 根据端口号划分

      • 公认端口

        范围: 0~1023。它们紧密绑定于一些服务

        • HTTP :80
        • HTTPS : 443
        • FTP : 21
        • TELENT : 23
      • 注册端口

        范围:1024~49 151。分配用户或者程序,一般我们使用此范围端口号

        • Tomcat :8080
        • MySql :3306
        • Oracle :1521
      • 动态或私有端口

        范围: 49 152~65 535。不应当使用这些端口,木马病毒较为喜欢此类端口,比较隐蔽

    服务器的服务端口,最多可以有65536个!你知道什么端口号对应哪些服务吗?

InetSocketAddress socketAddress = new InetSocketAddress("localhost",8080);

通信协议

通信协议是指双方实体完成通信或服务所必须遵循的规则和约定

TCP/IP

TCP/IP是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCPIP两个协议,而是指一个由FTPSMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

TCP/IP协议的组成

TCP与UDP的区别

TCP(打电话)

用户传输协议

  • 连接 稳定

  • 三次握手 四次挥手

    最少连接三次,才能保证稳定连接

    img


    当要断开时,连续三次确定端开,然后再核实一次

    img

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

  • 客户端-服务端

UDP(发短信)

用户数据报协议

  • 不连接,不稳定
  • 客户端服务端无明确界限

TCP例子

发送信息

客户端

1.通过键盘输入发送的信息

2.获取想要发送服务端的地址和端口号

3.创建socket连接

4.将信息通过输出流输出

服务端

1.给自己设置端口号

2.等待客户端连接

3.读取客户端信息

代码
package TCP;

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

//客户端
public class TcpClient {
    public static void main(String[] args) throws IOException {
        //1.通过键盘输入聊天内容
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();

        //2.服务器的地址端口号
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 9999;
        //3.创建一个socket连接
        Socket socket = null;
        //4.通过i/o流发送信息
        OutputStream os = null;

        //正式代码
        try {
            socket = new Socket(address,port);
            os=socket.getOutputStream();
            os.write(s.getBytes());         //通过字节的方式将内容传输过去
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(os!=null){
                os.close();
            }
            if(socket!=null){
                socket.close();
            }
            sc.close();
        }

    }
}
package TCP;
//服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws IOException {
        //1.有一个地址
        ServerSocket serverSocket = null;
        //2.等待客户端连接
        Socket socket = null;
        //3.读取客户端信息
        InputStream is = null;
        ByteArrayOutputStream bis = null;        //通过管道流读取信息,避免乱码

        //正式代码
        try {
            serverSocket = new ServerSocket(9999);      //设置自身端口号
            socket = serverSocket.accept();
            is = socket.getInputStream();
            bis = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int count=0;
            while ((count=is.read(buffer))!=-1){
                bis.write(buffer,0,count);
            }
            System.out.println(bis.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(bis!=null){
                bis.close();
            }
            if(is!=null){
                is.close();
            }
            if(socket!=null){
                socket.close();
            }
            if(serverSocket!=null){
                serverSocket.close();
            }
        }
    }
}

上传文件

客户端

1.创建连接

2.创建输出流,用输入流将文件读取进来

3.通过输出流输出读取到的文件

4.通知服务端输出完毕

5.接受服务端的反馈

6.关闭服务

服务端

1.创建服务连接

2.创建输入流,用输出流将文件写入到指定位置

3.通过输入流将输入的文件写入

4.通知客户端接受完毕

5.关闭服务

代码
package TCP;
//客户端
import java.io.*;
import java.net.Socket;

public class TcpFileClient {
    public static void main(String[] args) throws Exception {
        //1.创建一个socket连接
        Socket socket = new Socket("127.0.0.1",9000);
        //2.创建输出流
        OutputStream os = socket.getOutputStream();
        FileInputStream fis = new FileInputStream(new File("D:\\code\\JavaSE\\files\\1.jpg"));
        //3.输出文件
        byte [] buffer = new byte[1024];
        int count;
        while ((count=fis.read(buffer))!=-1){
            os.write(buffer,0,count);
        }

        //An:通知服务端输出完毕
        socket.shutdownOutput();        //我已经传输完了
        
        InputStream is = socket.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] bytes = new byte[1024];
        int count1;
        while ((count1=is.read(bytes))!=-1){
            baos.write(bytes,0,count1);
        }
        System.out.println(baos.toString());

        //4.关闭
        baos.close();
        is.close();
        fis.close();
        os.close();
        socket.close();
    }
}
package TCP;
//服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpFileServer {
    public static void main(String[] args) throws Exception {
        //1.创建连接
        ServerSocket serverSocket = new ServerSocket(9000);
        Socket socket = serverSocket.accept();
        //2.创建输入流
        InputStream is = socket.getInputStream();
        FileOutputStream fos = new FileOutputStream(new File("D:\\code\\JavaSE\\files\\5.jpg"));
        //3.写入文件
        byte[] buffer = new byte[1024];
        int count;
        while ((count=is.read(buffer))!=-1){
            fos.write(buffer,0,count);
        }

        //An:通知客户端接收完毕
        OutputStream os = socket.getOutputStream();
        os.write("接受完毕".getBytes());

        //4.关闭服务
        os.close();
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}

UDP例子

多线程聊天

发送方

1.创建连接

2.创建输出流

3.以包的形式发送数据

4.关闭

接收方

1.创建连接

2.创建输入流

3.将包中的数据转换成字符

4.关闭

package UDP;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
//发送端
public class UdpSender implements Runnable {
    //1.创建连接,从控制台接受数据
     DatagramSocket socket=null;
     BufferedReader bufferedReader = null;

    //2.发送数据需要自身端口号,接收方的端口号,地址
    private int myPort;
    private int toPort;
    private String address;

    public UdpSender(int myPort, int toPort, String address) throws Exception {
        this.myPort = myPort;
        this.toPort = toPort;
        this.address = address;
        //开启连接
        socket=new DatagramSocket(myPort);
        bufferedReader=new BufferedReader(new InputStreamReader(System.in));//从键盘输入信息
    }

    @Override
    public void run() {
        while (true){
            try {
                String data = bufferedReader.readLine();    //将键盘输入的信息转换为字符串
                byte[] buff = data.getBytes();              //将字符串的信息转换为二进制信息,存储在数组中
                //将数据打包
                DatagramPacket packet = new DatagramPacket(buff,0,buff.length,new InetSocketAddress(this.address,this.toPort));
                socket.send(packet);
                if(data.equals("bye")){                     //跳出循环的条件
                    break;
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
        System.exit(0);

    }
}
package UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Socket;
import java.net.SocketException;
//接收端
public class UdpReceive implements Runnable {
    //1.创建连接
    DatagramSocket socket = null;
    //2.接受方的端口号,姓名
    private int myPort;
    private String name;

    public UdpReceive(int myPort,String name) throws SocketException {
        this.myPort = myPort;
        this.name=name;
        //开启连接
        socket = new DatagramSocket(myPort);
    }

    @Override
    public void run() {
        while (true){
            try {
                //创建一个容器用来放置数据
                byte[] container = new byte[1024];
                //接受数据包
                DatagramPacket packet = new DatagramPacket(container,0,container.length);
                socket.receive(packet);
                //将包中的数据解压出来
                byte[] buffer = packet.getData();
                String data = new String(buffer,0,buffer.length);
                System.out.println(name+":"+data);
                if (data.equals("bye")){        //跳出循环
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
        System.exit(0);
    }
}

package UDP;
//测试,学生端
public class TalkStudent {
    public static void main(String[] args) throws Exception {
        //使用线程进行接受和发送
        new Thread(new UdpSender(9999,9998,"localhost")).start();
        new Thread(new UdpReceive(9997,"老师")).start();
    }
}


package UDP;
//测试,教师端
public class TalkTeacher {
    public static void main(String[] args) throws Exception {
        new Thread(new UdpSender(5555,9997,"localhost")).start();
        new Thread(new UdpReceive(9998,"学生")).start();
    }
}

URL


https://www.baidu.com/

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


协议://ip地址:端口号/项目名/资源


下载资源

1.输入下载地址

2.连接该地址的ftp

3.将文件存入对应位置

4.关闭服务

package URL;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class Download implements Runnable {
    private String url;
//    private String fileName;

    public Download(String url) {
        this.url = url;
    }

    @Override
    public void run() {
        try {
            URL url1 = new URL(url);        //获取下载地址
            HttpURLConnection urlConnection= (HttpURLConnection)url1.openConnection();  //连接到该资源的http
//            String[] s = url.split(".");
//            fileName = s[s.length-1];
            //下载资源
            InputStream inputStream = urlConnection.getInputStream();
            FileOutputStream fos = new FileOutputStream("1.jpg");
            byte[] buffer = new byte[1024];
            int count;
            while ((count=inputStream.read(buffer))!=-1){
                fos.write(buffer,0,count);
            }
            fos.close();
            inputStream.close();
            urlConnection.disconnect();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

posted @ 2021-02-25 17:01  2月2日  阅读(73)  评论(0)    收藏  举报