网络编程

网络编程

1.1,概述

地球村:你在西安,你一个美国的朋友

信件

image-20210922113315947

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

网络编程的目的:

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

想要达到这个效果需要什么:

1.如何准确的定位网络上的一台主机,192.168.16.124:端口,定位到这个计算机上的某个资源

2.找到了这个主机,如何传输数据呢?

java web:网页编程 B/C

网络编程:TCP/IP C/S

 

1.2网络通信的要素

如何实现网络的通信?

通信双方的地址:

  • ip

  • 端口号

规则:网络通信的协议

 

TCP/IP参考模型

image-20210922121608724

小结

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

    • 如何准确的定位到网络上的一台,或者多台主机

    • 找到主机后如何通信

  2. 网络编程中的要素

    • IP和端口号 IP

    • 网络通信协议 udp tcp

  3. 万物皆对象

1.4 端口

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

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

  • 被规定0~65535

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

  • 端口分类

    • 公有端口

      • HTTP:80

      • HTTPS:443

      • FTP:21

      • Telent:23

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

      • Tomcat:8080

      • MySQL:3306

      • Oracle:1521

    • 动态,私有:49152~65535

1.5通信协议

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

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

问题:非常的复杂

大事化小:分层!

TCP/IP协议簇(其实是一种协议)

重要

TCP:用户传输协议

udp:用户数据包协议

出名协议

  • TCP

  • IP:网络互联协议

 

TCP UDP 对比

TCP:打电话

  • 连接,稳定

  • 三次握手,四次挥手(三次握手:最少需要三次,保存稳定连接! 四次挥手)

  • 客户端,和服务端去连接

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

UDP:发短信

  • 不连接,不稳定

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

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

  • 导弹

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

 

TCP

客户端

1.连接服务器 Socket

2.发送消息

package com.kuang.lesson;

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

public class TcpClientDemo01 {

  public static void main(String[] args) {
      OutputStream os =null;
      Socket socket = null;
      //客户端: 我需要知道服务器的地址
      try {
          InetAddress byName = InetAddress.getByName("127.0.0.1");
          int port = 9999;
          //创建一个socket连接
            socket = new Socket(byName,port);
          //发送IO流
            os = socket.getOutputStream();
          //输入信息
          os.write("你好欢迎来到狂神说JAVA".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();
              }
          }
      }
  }



}

服务器

  1. 建立服务器的端口 ServerSocket

  2. 等待用户的链接 accept

  3. 接收用的消息

package com.kuang.lesson;

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 socket= null;
      Socket accept = null;
      InputStream inputStream = null;
      ByteArrayOutputStream baos = null;


      {
          try {
              //服务器;我需要一个地址
                socket = new ServerSocket(9999);//port
                while (true){
                    //等待客户端连接过来
                    accept = socket.accept();
                    //读取客户端的信息
                    inputStream = accept.getInputStream();
//               byte[] bytes = new byte[1024];
//               int len;
//               while ((len=inputStream.read(bytes))!=-1){
//                   String string = new java.lang.String(bytes,0,len);
//                   System.out.println(string);
//               }
                    //管道流
                    baos = new ByteArrayOutputStream();
                    int len;
                    byte[] buffer = new byte[1024];
                    while ((len=inputStream.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 (inputStream != null){
                  try {
                      inputStream.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
              if (accept != null){
                  try {
                      accept.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
              if (socket != null){
                  try {
                      socket.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }
      }
  }



}

文件上传

客户端

package com.kuang.lesson;

import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class TestClienDemo02 {
  public static void main(String[] args) throws Exception{
      //1.创建客户端,端口号
      Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
      //2.读取文件
      FileInputStream file = new FileInputStream("com/kuang/lesson/66656.jpg");
      //创建一个输出流
      OutputStream os = socket.getOutputStream();
      //打印
      byte[] buffer = new byte[1024];
      int len;
      while ((len = file.read(buffer))!=-1){
          os.write(buffer,0,len);
      }
      System.out.println(os.toString());
      //5关闭资源
      os.close();
      file.close();
      socket.close();


  }
}

服务器

package com.kuang.lesson;

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

public class TestServerDemo02 {
  public static void main(String[] args) throws Exception{
      //创建一个服务器等待连接
      ServerSocket socket = new ServerSocket(9000);
      //等待用户连接
      Socket accept = socket.accept();//阻塞流,如果接收不到,会一直停在该命令
          //创建输入流
      OutputStream is = accept.getOutputStream();
      //读取文件
      FileInputStream fis = new FileInputStream(new File("我不到啊"));
      byte[] buffer = new byte[1024];
      int len;
      while ((len = fis.read(buffer))!=-1){
          is.write(buffer,0,len);//输入流
      }
      //关闭资源
      fis.close();
      is.close();
      socket.close();


  }
}

Tomcat

服务端

  • 自定义S

  • TomcatS:Java后台开发

客户端

  • 自定义C

  • 浏览器B

1.7UDP

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

发送消息

package com.kuang.Lesson01;

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 ds = new DatagramSocket();
      //创建包
      String msg = "我是范子义";
      //发送给谁
      InetAddress pa = InetAddress.getByName("localHost");
      //创建包
      int potr = 9090;
      //传输的数据,从开始到终点,发送的人,最后是IP
      DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, pa, potr);//创建包
      //发送包
      ds.send(packet);
      //关闭流
      ds.close();


  }
}

接收消息

package com.kuang.Lesson01;

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

public class UdpServerDome01 {
  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()));

  }
}

循环发送消息

package com.kuang.Chat;

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

public class UdpSenderDome01 {//发送方
  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[] data1 = data.getBytes();
          DatagramPacket packet = new DatagramPacket(data1,0,data1.length,new InetSocketAddress("localhost",6666));//网络擦口地址


          socket.send(packet);
          if (data.equals("bye")){
              break;
          }
      }

      socket.close();
  }
}

循坏接收消息

package com.kuang.Chat;

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

public class UdpReceivedDome01 {//接收

  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();//得到packet中的所有数据
          String s = new String(data, 0, data.length);
          System.out.println(s);
          if (s.equals("bye")){
              break;
          }



      }socket.close();

  }


}

URL

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

DNS 是域名解析

posted @ 2021-09-26 23:09  πππ·  阅读(69)  评论(0)    收藏  举报