Java实现网络编程(UDP,TCP协议)

目录

网络编程

获取本机的IP地址的方法

1、协议定义:

UDP(User Datagram Protocol):用户数据报协议

TCP (Transmission Control Protocol):传输控制协议 

2、UDP协议

UDP 协议发送给数据:

UDP协议接收数据

3、TCP协议

TCP服务器实现步骤

TCP客户端实现步骤

4、心得体会

慢慢体会啊啊啊啊,不要做自己欺骗自己的小傻子啊。每次学的东西都没入脑,第二天就忘了。路漫漫其修远兮,吾将上下而求索。


网络编程

        又称Socket编程,网络编程三要素(ip,port,协议(udp,tcp/ip))

获取本机的IP地址的方法

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * @author wyd
 * @date 2021/8/10
 * 网络编程------>Socket编程
 *
 * 网络编程的三要素:
 *             ip:ip地址
 *             port:端口号
 *             协议:
 *                      udp协议
 *                           1)不需要建立连接通道
 *                           2)属于一种不可靠连接
 *                           3)发送文件大小限制的
 *                           4)执行效率高 (不同步的)
 *                      TCP/Ip协议
 *                          1)建立连接通道
 *                          2)属于安全连接(可靠连接)
 *                          3)发送文件(使用基本字节流),相对udp协议来说没有限制
 *                          4)执行效率低(同步的)
 *
 * InetAddress:互联网ip地址
 *      获取InetAddress:ip地址对象
 *      public static InetAddress getByName(String host):参数:主机名称(计算机电脑名称)
 *      public String getHostAddress():获取ip地址字符串形式
 *
 */

public class NetDemo {
    public static void main(String[] args) throws UnknownHostException {

        //如何获取自己电脑上的ip地址
        InetAddress inetAddress = InetAddress.getByName("DESKTOP-4KUN8QI");//主机名称
        String ip = inetAddress.getHostAddress();
        System.out.println(ip);//192.168.137.1
    }
}

1、协议定义:

UDP(User Datagram Protocol):用户数据报协议

UDP概述:

  • UDP是无连接的。
  • UDP使用尽最大努力交付。
  • UDP没有拥塞控制。
  • UDP是面向报文的。
  • UDP支持一对一、多对多、多对一和多对多的交互通信

        UDP 是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
      UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象。因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念。Java提供了DatagramSocket类作为基于UDP协议的Socket。

TCP (Transmission Control Protocol):传输控制协议 

        1.TCP协议(传输控制协议)是面向连接的可靠的协议,是允许系统通过Internet进行通信的标准,它定义了如何建立和维护应用程序可以通过其交换数据的网络对话;保证了数据的传递,并保证数据包的发送顺序与发送数据包的顺序相同,是OSI层中的传输层协议,通过传输和确保通过支持网络和Internet传递消息来在远程计算机之间创建连接。

        2.在明白TCP协议这个概念的前提下我们要想实现用Java程序来进行TCP编程其实不难,只需要我们理清相关概念:

        ip:唯一的标识Internet上的某台计算机,在Java程序中通过InetAddress类获取IP

       端口号:可以理解为正在计算机上运行的进程,不同的进程有不同的端口号

      Socket:这是一个比较抽象的概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据传输到网络。

2、UDP协议

UDP 协议发送给数据:

发送处理过程:

  • 创建发送端Socket对象——DatagramSocket
  • 创建数据包——DatagramPacket
  • 通过Socket发送
  • 释放相关资源
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/**
 * @author wyd
 * @date 2022/07/30
 *
 * Udp编程的发送端:
 *  1)创建Socket对象
 *  2) 发送内容 : 内容数据一种数据报文(报包)DatagramPacket
 *  3) 释放资源
 */
public class UdpSend {
    public static void main(String[] args) throws IOException {

        DatagramSocket ds = null;
        try {
            //1)创建Socket对象
            ds = new DatagramSocket();
            //2)创建一个数据报包对象DatagramPacket
            //DatagramPacket(byte[] buf, int length, InetAddress address, int port)
            //参数1:当前数据的字节数组
            //参数2:当前数据的长度
            //参数3:InetAddress:ip地址对象
            //参数4:绑定的端口号
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//读取键盘输入流
            String line;
            while ((line = br.readLine()) != null) {
                if ("886".equals(line))
                    break;
                byte[] bys = line.getBytes();
                int length = bys.length;
                //public static InetAddress getByName(String host)
                InetAddress inetAddress = InetAddress.getByName("192.168.137.1");
                int port = 10086;
                DatagramPacket dp = new DatagramPacket(bys, length, inetAddress, port);//建立数据包,声明长度,接收端主机,端口号
                //3)发送数据报包
                //public void send(DatagramPacket p)
                ds.send(dp);
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4)释放资源
            ds.close();
        }
    }
}

UDP协议接收数据

接收处理过程

  • 创建接受端Socket对象——DatagramSocket
  • 创建数据接收容器 ——DatagramPacket
  • 接受数据
  • 打印信息
  • 释放资源
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
 * @author wyd
 * @date 2022/07/30
 *
 * Udp接收端
 * 1) 创建Socket对象
 * 2) 创建一个接收容器 : 数据报包:DatagramPacket
 * 3) 接收
 * 4) 解析容器的的实际数据大小
 * 5) 展示发送端发送的数据
 */
public class UdpReceive {
    public static void main(String[] args) throws IOException {
        try {
            //)创建Socket对象
            //public DatagramSocket(int port)
            DatagramSocket ds = new DatagramSocket(10086);//接收端口号的消息
            while (true) {
                //2)创建一个接收容器:数据报包:DatagramPacket  实际数据没有这么大
                //public DatagramPacket(byte[] buf, int length)
                //自定义字节缓冲区
                byte[] bytes = new byte[1024];
                int lentgth = bytes.length;
                DatagramPacket dp = new DatagramPacket(bytes, lentgth);//建立信息包

                //3)public void receive(DatagramPacket p)
                ds.receive(dp);

                //4)解析实际数据
                //byte[] getData()   获取实际字节数
                //返回数据缓冲区。
                //int getLength()   获取实际长度
                byte[] bytes2 = dp.getData();
                int length2 = dp.getLength();
                String receiverStr = new String(bytes2, 0, length2);
                System.out.println("输入的数据为:" + receiverStr);

                //获取ip地址
                //InetAddress getAddress()
                //public String getHostAddress():
                String ip = dp.getAddress().getHostAddress();
                //展示数据
                System.out.println("data from " + ip);
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //接收不关闭
            //接收socket对象一一直开着
        }
    }
}

3、TCP协议

TCP服务器实现步骤

        1)创建服务器端的Socket对象

        2)监听客户端连接

        3)获取通道内的输入流

        4)读取数据

import com.sun.security.ntlm.Server;

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

/**
 * @author wyd
 * @date 2022/7/31
 * 服务器端不断读取数据并展示
 */
public class ServerDemo {
    public static void main(String[] args) {

        //1.创建服务器端的ServerSocket,指明自己的端口号
        ServerSocket ss = null;
        try {
            ss = new ServerSocket(10010);
            while (true) {
                System.out.println("服务器正在等待连接");
                //2.调用accept表示监听客户端的socket
                Socket socket = ss.accept();
                //3.不断监听,不断展示数据,获取通道内的输入流(InputStream)
                InputStream inputStream = socket.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                BufferedReader br = new BufferedReader(inputStreamReader);
                //一次读取一行
                String line = null;
                while ((line = br.readLine()) != null) { //阻塞式方法
                    // //展示数据
                    System.out.println(line);
                }
                //4.获取ip
                String ip = socket.getInetAddress().getHostAddress();
                //展示数据
                System.out.println("data from "+ip+" content is--->"+line);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

TCP客户端实现步骤

        1)创建TCP客户端的Socket对象

        2)写数据

        3)释放资源

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


/**
 * @author wyd
 * @date 2022/7/31
 *
 * TCP客户端不断键盘录入数据,服务器端不断接收数据,然后展示数据
 */
public class ClientDemo {
    public static void main(String[] args) {

        //创建客户端的Socket
        Socket socket = null;
        try {
            //1.创建Socket对象,指明服务器IP和端口号
            socket = new Socket("127.0.0.1", 10010);
            //创建BufferedReader
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            //读取一行
            String line = null;
            while ((line = br.readLine()) != null) {//null只是作为 一个文件是否读完
                if ("over".equals(line)) {
                    break;
                }
                //2.获取一个输出流用于输出数据
                OutputStream outputStream = socket.getOutputStream();
                //3.写出数据的操作(这里也可以用转换流OutputStreamWriter)
                OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
                BufferedWriter bw = new BufferedWriter(outputStreamWriter);
                //给封装的通道内的流对象bw写一行
                bw.write(line);
                bw.newLine();
                bw.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //释放资源
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

4、心得体会


慢慢体会啊啊啊啊,不要做自己欺骗自己的小傻子啊。
每次学的东西都没入脑,第二天就忘了。
路漫漫其修远兮,吾将上下而求索。

你可能感兴趣的:(java,udp,开发语言)