网络编程基础

网络编程

1.概述

  • 在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换

2.网络编程三要素

IP地址

  • 要想让网络的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接受数据的计算机和识别发送的计算机,而IP地址就是这个标识号。也就是设备的标识

端口

  • 网络的通信,本质上是两个应用程序的通信。每台计算机都有很多的应用程序,那么在网络通信时,如何区分这些应用程序呢?如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的应用程序了。也就是应用程序的标识

协议

  • 通过计算机网络可以使用多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接和通信的规则被称为网络通心协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。常见的协议有UDP协议和TCP协议

3.计算机网络:

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

InetAddress类

  • 此类标识Internet协议(IP)地址
  • 为了方便获取IP地址的获取和操作,java提供了一个类InetAddress供我们使用
方法名 说明
static InetAddress getName(String host) 确定主机名称的IP地址、主句名称可以是机器名称,也可以是IP地址
String getHostName() 获取此IP地址的主机名
String getHostAddress() 返回文本显示中的IP地址字符串
import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAddressDemo {
    public static void main(String[] args) throws UnknownHostException {
        
    InetAddress address = InetAddress.getByName("DESKTOP-1G5ABDD");
    
    String name = address.getHostName();
    System.out.println(name);
    String ip = address.getHostAddress();
    System.out.println(ip);
    }
}

端口

端口:设备上应用程序的唯一标识

端口号:用两个字节表示整数,它的取值范围是0至65535。其中,0至1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另一个服务或应用所占用,会导致当前程序启动失败

协议

UDP协议

  • 用户数据报协议(User Datagram Protocol),以数据报为单位
  • UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建议逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据

UDP发送数据:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
- UDP发送数据步骤
- 1.创建发送端的Socket对象(DatagramSocket)
- 2.创建数据,并把数据打包
- 3.调用DatagramSocket对象的方法数据
- @author HWjoker
- @Version
- @date 2021年4月22日下午6:38:49
  */
  public class sendDemo {
  public static void main(String[] args) throws IOException {
  //创建发送端的Socket对象(DatagramSocket)
  DatagramSocket ds = new DatagramSocket();
  //传输的数据
  byte[] bys = "hello,udp.".getBytes();
  //传输的地址
  InetAddress address = InetAddress.getByName("DESKTOP-1G5ABDD");
  //打包处理
  DatagramPacket dp = new DatagramPacket(bys, bys.length, address, 10086);
  //发送数据报包
  ds.send(dp);
  //关闭Socket对象
  ds.close();
  }
  }


UDP接收数据:

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

/**
- 接收数据的步骤
- 1.创建接收端的Socket对象(DatagramSocket)
- 2.创建一个数据包,用于接收数据
- 3.调用DatagramSocket对象的方法接收数据
- 4.解析数据包,并把数据在控制台显示
- 5.关闭接收端
- @Description
- @author HWjoker
- @Version
- @date 2021年4月22日下午6:48:33
  */
  public class ReceiveDemo {
  public static void main(String[] args) throws IOException {
    //创建一个Socket对象
    //其构造数据报套接字并将其绑定到主机上的指定端口
    DatagramSocket ds = new DatagramSocket(10086);
    byte[] bys = new byte[1024];
    //创建一个数据包,用于接收数据
    DatagramPacket dp = new DatagramPacket(bys, bys.length);
    //调用DatagramSocket对象的方法接收数据
    ds.receive(dp);
    //解析数据包,并把数据在控制台显示
    int len = dp.getLength();
    byte[] datas =  dp.getData();
    String dataString = new String(datas, 0, len);
    System.out.println(dataString);
    //关闭接收端
    ds.close();
  }
}

TCP协议

TCP协议

  • 传输控制协议(Transmission Control),以字节为单位
  • TCP协议是面向连接的通讯协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三才握手”
  • 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠
    • 第一次握手,客户端向服务器向服务器端发出连接请求,等待服务确认
    • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求
    • 第三次握手,客户端再次向服务器端发送确认信息,确认链接

TCP发送数据

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
//import java.io.InputStream;
//import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**

- TCP发送数据
- 1.创建客户端Socket对象(Socket)
- 2.获取输出流,写数据
- 3.释放资源
- @Description
- @author HWjoker
- @Version
- @date 2021年4月22日下午7:14:05
  */
  public class sendDemo {
  public static void main(String[] args) throws UnknownHostException, IOException {
    //创建文件读取对象
    BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\11525\\Desktop\\789.txt"));
    //创建客户端Socket对象(Socket)
    Socket s = new Socket(InetAddress.getByName("DESKTOP-1G5ABDD"),10000);
    //获取输出流,写数据
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    InputStream is = s.getInputStream();
    byte[] byss = new byte[1024];
    String line;
    while((line = br.readLine()) != null) {
    bw.write(line);
    bw.newLine();
    bw.flush();
    //接收服务器反馈
    int len = is.read(byss);
    String data = new String(byss,0,len);
    System.out.println(data);
    }
    //自定以结束信息
    bw.write("over");
    bw.newLine();
    bw.flush();
    int len = is.read(byss);
    System.out.println(new String(byss, 0, len));
    //释放资源
    br.close();
    s.close();
  }
  }

TCP接收协议

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * TCP接收数据
 * 1.创建客户端Socket对象(ServeSocket)
 * 2.获取输出流,读数据
 * 3.释放资源
 * @Description
 * @author HWjoker
 * @Version
 * @date 2021年4月22日下午7:12:36
 */
public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        //创建客户端Socket对象(ServeSocket)
        ServerSocket ss = new ServerSocket(10000);
        BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\11525\\Desktop\\11525.txt"));
        // 监听客户端连接
        Socket s = ss.accept();
        //获取输出流,读数据
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        OutputStream os = s.getOutputStream();
        String line;
        while ((line = br.readLine()) != null) {
            if("over".equals(line)) {
                break;
            }
            bw.write(line);
            bw.newLine();
            bw.flush();
            // 反馈
            os.write("已收到".getBytes());
        }
        //整体反馈
        os.write("传出成功!".getBytes());
        //释放资源
        ss.close();
        bw.close();
    }
}

你可能感兴趣的:(网络编程基础)