网络编程知识大全

网络编程

计算机网络:不同的地理位置 连接 网络通信协议 实现资源共享

目的:数据交换 通信

如何准确的定位网络上的一台主机 192.168.16.124:端口

网络通信的要素

  1. ip

    • ip地址 :InetAddress

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

    • 127.0.0.1:本机 locallhost

    • ip地址的分类:

      1. ipv4/ipv6 2.公网(互联网 )-私网(局域网) *ABCD类地址 *192.168.xx.xx,专门给组织内部使用

        • ipv4: 127.0.0.1,4个字节组成 0~255,42亿,30亿都在北美,亚洲4亿,2011年就用尽

        • ipv6: 128位 8个无符号整数

          2001:Obb2:aaaa:0015:0000:0000:1aaa:1312
            
  2. 端口号

  3. 网络通信协议:TCP UDP

  4. 域名: 记忆ip问题

    ip

    public class TestInetAddress {
        public static void main(String[] args) {
    ​
            try {
                //查询本机地址
                InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
                System.out.println(inetAddress1 );
                InetAddress inetAddress3 = InetAddress.getByName("localhost");
                System.out.println(inetAddress3 );
                InetAddress inetAddress4 = InetAddress.getLocalHost();
                System.out.println(inetAddress4 );
                //查询网站地址
                InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
                System.out.println(inetAddress2);
                //常用方法
                System.out.println(inetAddress2.getCanonicalHostName()); //规范的名字
                System.out.println(inetAddress2.getHostAddress());//ip
                System.out.println(inetAddress2.getHostName());//域名 或者自己电脑的名字
            } catch (UnknownHostException e) {
                throw new RuntimeException(e);
            }
    ​
        }
    }

    端口
    1. 端口表示计算机上的一个程序的进程 PID P:process 进程

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

      • 被规定 ~65535

      • TCP,UDP: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

          1. netstat -ano //查看所有的端口
          2. netstat -ano|findstr 5900 //查看指定的端口
          3.tasklist|findstr  8696//查看指定端口的进程
           

          public class TestInetSocketAddress {
              public static void main(String[] args) {
                  InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);
                  System.out.println(socketAddress);
                  InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080);
                  System.out.println(socketAddress2);
                  System.out.println(socketAddress.getAddress());
                  System.out.println(socketAddress.getPort());//端口
                  System.out.println(socketAddress.getHostName());//地址
              }
          }
          通信协议

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

          问题: 大事化小,分层


          TCP/IP协议簇,是一组协议

          • TCP:用户传输协议

            打电话

            **连接,稳定

            **三次握手,四次挥手

            //最少需要3次,保证稳定连接
            A:你瞅啥
            B:瞅你咋地
            A:打一架
                
                
                
            A:我要走了
            B:你要走吗?
            B:你走了吗?
            A:我走了

            **客户端,服务端

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

          • IP:网络互联协议

          • UDP:用户数据报协议

            **发短信

            **不连接,不稳定

            **客户端,服务端:没有明确的界限

            **不管有没有准备好,都可以发给你..

            **导弹

            **DDOS:洪水攻击(饱和攻击)

          TCP实现聊天

          客户端

          1.连接服务器Socket

          2.发送消息

          public class TcpClientDemo01 {
          ​
              public static void main(String[] args) {
                  Socket socket =null;
                  OutputStream os =null;
                  try {
                      //1.要知道服务的地址   端口号
                      InetAddress serverIP = InetAddress.getByName("127.0.0.1");
                      int port = 9999;
                      //2.创建一个socket连接
                       socket = new Socket(serverIP,port);
                      //3.发送消息 IO流
                       os = socket.getOutputStream();
                      os.write("你好,欢迎学习java".getBytes());
                      
                  } catch (Exception e) {
                      throw new RuntimeException(e);
                  }finally {
                      if(os!=null){
                          try {
                              os.close();
                          } catch (IOException e) {
                              throw new RuntimeException(e);
                          }
                      }
                      if(socket!=null){
                          try {
                              socket.close();
                          } catch (IOException e) {
                              throw new RuntimeException(e);
                          }
                      }
                  }
              }
          }

          服务器

          1.建立服务的端口 ServerSocket

          2.等待用户的连接 accept

          3.接受用户端的消息

          public class TcpServerDemo01 {
              public static void main(String[] args) {
                  ServerSocket serverSocket = null;
                  Socket socket = null;
                  InputStream is = null;
                  ByteArrayOutputStream baos = null;
                  try {
                      //1.我得有一个地址
                      serverSocket = new ServerSocket(9999);
                      //2.等待客户端连接过来
                      while(true){
                          socket = serverSocket.accept();
                          //3.读取客户信息
                          is = socket.getInputStream();
                          //管道流
                          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) {
                      throw new RuntimeException(e);
                  } finally {
                      //关闭资源
                      if (baos != null) {
                          try {
                              baos.close();
                          } catch (IOException e) {
                              throw new RuntimeException(e);
                          }
                      }
                      if (is != null) {
                          try {
                              is.close();
                          } catch (IOException e) {
                              throw new RuntimeException(e);
                          }
                      }
                      if (socket != null) {
                          try {
                              socket.close();
                          } catch (IOException e) {
                              throw new RuntimeException(e);
                          }
                      }
                      if (serverSocket != null) {
                          try {
                              serverSocket.close();
                          } catch (IOException e) {
                              throw new RuntimeException(e);
                          }
                      }
                  }
              }
          }

TCP实现文件上传

客户端

public class TcpClientDemo02 {
    public static void main(String[] args) throws IOException {
        //创建一个socket连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
        //创建一个输出流
        OutputStream os = socket.getOutputStream();
        //读取文件
        FileInputStream fis = new FileInputStream(new File("x.JPG"));
        //4.写出文件
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer))!=-1){
            os.write(buffer,0,len);
        }
        //5.关闭资源
        fis.close();
        os.close();
        socket.close();
    }
}

服务端

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("reveice.JPG"));
        byte[] buffer= new byte[1024];
        int len;
        while((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
        //5.关闭资源
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();
​
​
​
​
    }
}

Tomcat

服务端 Tomcat服务器

客户端 浏览器

UDP

发送端

public class UDPDemo1 {
    //不需要连接服务器
    public static void main(String[] args) throws IOException {
        //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();
    }
}

接收端

public class UDPDemo02 {
    public static void main(String[] args) throws IOException {
        //开放端口
        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();
​
    }
}
udp聊天实现
public class UDPSenderDemo01 {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(8888);
        //准备数据 从控制台读取 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", 6666));
            socket.send(packet);
            if(data.equals("bye")){
                break;
            }
        }
        socket.close();
    }
}
public class UDPServerDemo01 {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(6666);
        while (true) {
            //准备接收包裹
            byte[] container = new byte[1024];
            DatagramPacket packet = new DatagramPacket(container, 0, container.length);
            socket.receive(packet);//阻塞式接受包裹
            //断开连接 bye
            byte[] data = packet.getData();
            String datas = new String(data,0,packet.getLength());
            System.out.println(datas);
            if(datas.equals("bye")){
                break;
            }
        }
        socket.close();
    }
​
}
UDP多线程在线咨询

TalkSend/TalkService

public class TalkSend implements  Runnable{
    DatagramSocket socket = null;
    BufferedReader reader = null;
    private int  fromport;
    private String toip;
    private  int toport;
​
    public TalkSend(int fromport, String toip, int toport) throws SocketException {
        this.fromport = fromport;
        this.toip = toip;
        this.toport = toport;
        socket = new DatagramSocket(fromport);
        reader = new BufferedReader(new InputStreamReader(System.in));
    }
    @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 (IOException e) {
                throw new RuntimeException(e);
            }
​
        }
        socket.close();
    }
}
 
public class TalikReveice implements Runnable{
    DatagramSocket socket = null;
    private int port;
    private  String msgfrom;
​
    public TalikReveice(int port,String msgfrom) throws SocketException {
         socket= new DatagramSocket(port);
        this.port = port;
        this.msgfrom=msgfrom;
​
    }
    @Override
    public void run() {
        try {
            while (true) {
                //准备接收包裹
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container, 0, container.length);
                socket.receive(packet);//阻塞式接受包裹
                //断开连接 bye
                byte[] data = packet.getData();
                String datas = new String(data,0,packet.getLength());
                System.out.println(msgfrom+": "+datas);
                if(datas.equals("bye")){
                    break;
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        socket.close();
    }
}

4个线程

public class TalkStudent {
    public static void main(String[] args) throws SocketException {
        new Thread(new TalkSend(7777,"localhost",9999)).start();
        new Thread(new TalikReveice(8888,"老师")).start();
    }
}
public class TalkTeacher {
    public static void main(String[] args) throws SocketException {
        new Thread(new TalkSend(5555,"localhost",8888)).start();
        new Thread(new TalikReveice(9999,"学生 ")).start();
    }
}
URL
  • 统一资源定位符 :定位资源的,定位互联网某一个资源
  • DNS域名解析 www.baidu.com xxx.xx.xx
  • 协议://ip地址:端口/项目名/资源
  • public class TestDemo01 {
        public static void main(String[] args) throws IOException {
            //下载地址
            URL url = new URL("http://localhost:8080/qinjiang/cch.txt");
           //连接地址
            HttpURLConnection urlConnection =  (HttpURLConnection)url.openConnection();
            InputStream inputStream = urlConnection.getInputStream();
            FileOutputStream fos = new FileOutputStream("cch.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();//断开连接
    ​
    ​
        }
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值