网络编程

1.IP

IPV4、IPV6

package com.xiaobai.net.lesson01;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class TestInetAddress {
    public static void main(String[] args) {
        try {
            InetAddress ip01 = InetAddress.getByName("127.0.0.1");
            System.out.println(ip01);
            InetAddress ip02 = InetAddress.getByName("www.baidu.com");
            System.out.println(ip02);
        } catch (UnknownHostException e) {
            
            e.printStackTrace();
        }
    }
}

2.端口

端口标识计算机上的一个程序的进程:

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

  • 被规定0~65535

  • TCP\UDP:65535*2

  • 端口分类

    • 公有端口:0~1023

      • HTTP:80

      • HTTPS:443

      • FTP:21

      • TELENT:23

    • 程序注册端口:1024~49151,分配用户或者程序

      • Tomcat:8080
      • MySQL:3306
      • oracle:1521
    • 动态、私有:49152~655235

    //常用dos命令
    netstat -ano//查看所有端口
    netstat -ano|findstr "5900"//查看指定端口
    tasklist|findstr "8696"//查看指定端口进程
    

3.通信协议

协议:就是一个约定

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

TCP/IP协议

重要:

  • TCP:用户传旭协议
  • UDP:用户数据报协议

出名的:

  • TCP
  • IP:网路传输协议

TCP、UDP对比

TCP:

  • 连接、稳定
  • 三次握手、四次挥手
    • 三次握手
      • 最少3次,保证稳定,
      • A:请求连接 B:接受请求连接 A:请求连接
    • 四次挥手
      • A:断开请求
      • B:接受断开请求
      • B:确定断开请求
      • A:再次确认断开
  • 客户端、服务端
  • 传输完成,释放连接,效率低

UDP:

  • 不连接、不稳定
  • 客户端、服务端:没有明确界限
  • 不管有没有准备好,都可以发给你

1.4TCP

客户端

  1. 连接服务器通过socket
  2. 发送消息
package com.xiaobai.net.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 outputStream = null;
        try {
            //1、要知道地址
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            //2、端口号
            int port = 9999;
            //3、创建一个socket链接
            socket = new Socket(serverIP,port);
            //4、发送消息,IO溜消息
            outputStream = socket.getOutputStream();
            outputStream.write("你好,欢迎".getBytes());
        } catch (Exception e) {
            
            e.printStackTrace();
        }finally{
            if(outputStream != null){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    
                    e.printStackTrace();
                }
            }
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    
                    e.printStackTrace();
                }
            }

        }
    }
}

服务端

  1. 建立服务端端口
  2. 等待客户链接accept
  3. 接受用户消息
package com.xiaobai.net.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 inputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        try {
            //1、我要有个地址
            serverSocket = new ServerSocket(9999);
            //2、等待客户端链接
            socket =  serverSocket.accept();
            //3、读取客户端的消息
            inputStream = socket.getInputStream();
            //4、管道流
            byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while((len=inputStream.read(buffer))!=-1){
                byteArrayOutputStream.write(buffer,0,len);
            }
            System.out.println(byteArrayOutputStream.toString());

        } catch (IOException e) {
            
            e.printStackTrace();
        }finally{
            if (byteArrayOutputStream != null) {
                try {
                    byteArrayOutputStream.close();
                } catch (IOException e) {
                    
                    e.printStackTrace();
                }
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    
                    e.printStackTrace();
                }
            }
            if (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    
                    e.printStackTrace();
                }
            }
        }
    }
}

1.5文件上传

客户端

package com.xiaobai.net.lesson02;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClientDemo02 {
    public static void main(String[] args) throws Exception {
    //创建socket链接
    Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9999);
    //创建一个输出流
    OutputStream os = socket.getOutputStream();
    //文件流
    //读取文件
    FileInputStream fis = new FileInputStream(new File("1.png"));
    //写出文件
    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[1024];
    int len2;
    while((len2=inputStream.read(buffer2))!=-1){
        baos.write(buffer2,0,len2);
    }
    System.out.println(baos.toString());
    inputStream.close();
    baos.close();
    //确定服务器接收完毕,才能断开链接
    fis.close();
    os.close();
    socket.close();
    }

}

服务器端

package com.xiaobai.net.lesson02;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServerDemo02 {
    public static void main(String[] args) throws Exception{
        //创建服务
        ServerSocket serverSocket = new ServerSocket(9999);
        //监听客户端的连接性
        Socket socket = serverSocket.accept();//阻塞时监听,会一直等待客户端链接。
        //获取输入流
        InputStream is = socket.getInputStream();
        //文件输出
        FileOutputStream fos = new FileOutputStream(new File("receive.png"));
        byte[] buffer = new byte[1024];
        int len;
        while((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
        //通知客户端接收完毕
        OutputStream os = socket.getOutputStream();
        os.write("接受完毕,关闭".getBytes());
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}

1.6UDP

发送消息

发送端

package com.xiaobai.net.lesson03;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpClientDemo01 {
    public static void main(String[] args) throws Exception{
        //建立一个socket
        DatagramSocket socket = new DatagramSocket();
        //建包
        String msg ="你好啊!";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9999;
        DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), 0,msg.getBytes().length,localhost,port);
        //发送包
        socket.send(datagramPacket);
        //关闭流
        socket.close();
    }
}

接受端:

package com.xiaobai.net.lesson03;

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

public class UdpServerDemo01 {
    public static void main(String[] args) throws Exception{
        DatagramSocket socket = new DatagramSocket(9999);
        byte[] buffer = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(buffer, 0,buffer.length);
        socket.receive(datagramPacket);
        System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
        socket.close();
    
    }
    
}

循环发送

package com.xiaobai.net.chat;

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

public class UdpsenderDemo01 {
    public static void main(String[] args) throws Exception{
        DatagramSocket socket = new DatagramSocket(8888);
        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", 6666));
            socket.send(packet);
            if (data.equals("bye")) {
                break;
            }
        }

        socket.close();
    }
}

package com.xiaobai.net.chat;

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

public class UdpReceiveDemo01 {
    public static void main(String[] args) throws Exception{
        DatagramSocket socket = new DatagramSocket(6666);
        while (true) {
            byte[] container =new byte[1024];
            DatagramPacket packet = new DatagramPacket(container, 0,container.length);
            socket.receive(packet);
            byte[] data = packet.getData();
            String receivedata = new String(data,0, packet.getLength());
            System.out.println(receivedata);
            if (receivedata.equals("bye")) {
                break;
            }
            
        }
        socket.close();

        

    }
}

多线程咨询(既是发送方,又是接受方)

发送类:

package com.xiaobai.net.chat;

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 TalkSend implements Runnable{
    DatagramSocket socket = null;
    BufferedReader reader = null;
    private String toIP;
    private int toPort;
    private int fromPort;

    public TalkSend(String toIP, int toPort, int fromPort) {
        this.toIP = toIP;
        this.toPort = toPort;
        this.fromPort = fromPort;
        try {
            socket = new DatagramSocket(fromPort);
            reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                String data = reader.readLine();
                byte[] datas = data.getBytes();
                DatagramPacket packet = new DatagramPacket(datas, 0, datas.length,new InetSocketAddress(this.toIP, this.toPort));
                socket.send(packet);
                if (data.equals("bye")) {
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        socket.close();
    }
}

接受类:

package com.xiaobai.net.chat;

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

public class TalkReceive implements Runnable{
    DatagramSocket socket =null;
    int port;
    private  String msgFrom;

    public TalkReceive(int port,String msgFrom) {
        this.port = port;
        this.msgFrom = msgFrom;
        try {
            socket = new DatagramSocket(port);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        try {
            while (true) {
                byte[] container =new byte[1024];
                DatagramPacket packet = new DatagramPacket(container, 0,container.length);
                socket.receive(packet);
                byte[] data = packet.getData();
                String receivedata = new String(data,0, packet.getLength());
                System.out.println("来自客户端"+this.msgFrom+":"+receivedata);
                if (receivedata.equals("bye")) {
                    break;
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        socket.close();

    }
}

创建客户端1:

package com.xiaobai.net.chat;

public class TalkStudent {
    public static void main(String[] args) {
        new Thread(new TalkSend("localhost",9999,7777)).start();
        new Thread(new TalkReceive(8888,"老师")).start();
    }
}

创建客户端2:

package com.xiaobai.net.chat;

public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new TalkSend("localhost",8888,5555)).start();
        new Thread(new TalkReceive(9999,"学生")).start();

    }
}

1.7URL

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

DNS域名解析,将www.baidu.com解析为IP

package com.xiaobai.net.lesson04;

import java.net.MalformedURLException;
import java.net.URL;
//http://localhost:8080/host-manager/manager.xml
public class URLDemo01 {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://pms.dtinsure.com/index.php?m=bug&f=browse&productid=114&branch=0&browseType=assigntome");
            System.out.println(url.getProtocol());//获取协议
            System.out.println(url.getHost());//获取主机IP
            System.out.println(url.getPort());//获取端口
            System.out.println(url.getPath());//获取文件地址
            System.out.println(url.getFile());//获取文件全路径
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

下载

package com.xiaobai.net.lesson04;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class URLDown {
    public static void main(String[] args) throws  Exception{
        URL url = new URL("http://localhost:8080/host-manager/manager.xml");
        HttpURLConnection urlConnection =(HttpURLConnection) url.openConnection();
        InputStream inputStream = urlConnection.getInputStream();
        FileOutputStream fos = new FileOutputStream("test.txt");
        byte[] buffer = new byte[1024];
        int len;
        while ((len=inputStream.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
        fos.close();
        inputStream.close();
        urlConnection.disconnect();
    }
}

posted @ 2021-04-29 11:00  77的小白  阅读(58)  评论(0)    收藏  举报