java day21 网络编程(OSI参考模型、TCP、UDP)

1、网络是什么

1.1 计算机网络

为实现资源共享和信息传递,通过通信信路连接起来的若干主机(Host)
在这里插入图片描述

常见计算机网络:

  • 互联网:(Internet)点与点相连。
  • 万维网:(WWW – World Wide Web)端与端相连。
  • 物联网:( IoT - Internet of things) 物与物相连。
  • 网络编程:让计算机与计算机之间建立连接、进行通信。

1.2 网络模型

OSI(Open System Interconnect),即开放式系统互联
该体系结构标准定义了网络互联的七层架构

  • 物理层
  • 数据链路层
  • 网络层
  • 传输层
  • 会话层
  • 表示层
  • 应用层)
    在这里插入图片描述

2、TCP、UDP

2.1 TCP【重点

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

  • 是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连接的过程需要三次握手,断开连接的过程需要四次挥手。

2.2 UDP

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

  • 是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小64KB。

3、基于TCP、UDP编程

3.1 TCP编程

package Day23_Socket.tcp4;

import Day23_Socket.utils.IOUtils;

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

/**
 * @Author wzy
 * @Date 0017 2020-12-17 11:46
 * @Version 1.0
 */
public class readThread extends Thread{
    private BufferedReader br;
    private Socket socket;

    public readThread(Socket socket) throws IOException {
        this.socket = socket;
        br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    }

    @Override
    public void run() {
        try{
            while (true){
                String str = br.readLine();
                if (str!=null){
                    System.out.println(str);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            IOUtils.closeAll(br,socket);
        }
    }
}

package Day23_Socket.tcp4;

import Day23_Socket.utils.IOUtils;

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

/**
 * @Author wzy
 * @Date 0017 2020-12-17 11:46
 * @Version 1.0
 */
public class writeThread extends Thread{
    private BufferedReader br;
    private BufferedWriter bw;
    private String name;
    private Socket socket;

    public writeThread(Socket socket, String name) throws IOException {
        this.socket=socket;
        this.name=name;
        this.bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        this.br  =new BufferedReader(new InputStreamReader(System.in));
    }

    @Override
    public void run() {
        try{
            while (true){
                bw.write(name+":"+br.readLine());
                bw.newLine();
                bw.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            IOUtils.closeAll(bw,socket);
        }
    }
}

package Day23_Socket.tcp4;

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

/**
 * @Author wzy
 * @Date 0017 2020-12-17 10:25
 * @Version 1.0
 */
public class Client {
    public static void main(String[] args) throws IOException {
        //1.连接服务器
        Socket socket = new Socket("127.0.0.1",8888);
        //开启读取数据的线程
        new readThread(socket).start();
        //开启输出数据的线程
        new writeThread(socket,"客户端").start();
    }
}

package Day23_Socket.tcp4;

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

/**
 * @Author wzy
 * @Date 0017 2020-12-17 10:21
 * @Version 1.0
 *
 *      服务器:
 *          三次握手
 *              1.客户端发送数据给接收方
 *              2.服务器接收来自客户端的数据,并返回数据
 *              3.客户端接收到来自服务器的数据
 *
 *     一对一通讯
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //1.建立服务器的套接字
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();
        //开启读取数据的线程
        new readThread(socket).start();
        //开启输出数据的线程
        new writeThread(socket,"服务器").start();
    }
}

3.2 UDP编程

客户端1和客户端2之间的信息互传

package Day23_Socket.udp;

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

/**
 * @Author wzy
 * @Date 0017 2020-12-17 15:22
 * @Version 1.0
 */
public class Client1 {
    public static void main(String[] args) throws IOException {
        //1.创建一个包含端口号的udp套接字
        DatagramSocket socket = new DatagramSocket(8888);

        //发送数据
        //把需要发送的数据存储到字节数组中
        byte[] b = "客户端1:你就是个渣渣".getBytes();
        //创建数据包
        DatagramPacket packet = new DatagramPacket(b, b.length, InetAddress.getByName("127.0.0.1"), 9999);
        //发送数据包
        socket.send(packet);

        //接收数据
        b = new byte[1024];
        packet = new DatagramPacket(b,b.length);
        socket.receive(packet);
        System.out.println(new String(packet.getData(),0,packet.getLength()));

    }
}

package Day23_Socket.udp;

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

/**
 * @Author wzy
 * @Date 0017 2020-12-17 15:22
 * @Version 1.0
 */
public class Client2 {
    public static void main(String[] args) throws IOException {
        System.out.println("客户端2即将运行...");
        DatagramSocket socket = new DatagramSocket(9999);

        //接收数据
        byte[] b = new byte[1024];
        DatagramPacket packet = new DatagramPacket(b,b.length);
        //接收数据报包    -- 阻塞
        socket.receive(packet);
        System.out.println(new String(packet.getData(),0,packet.getLength()));

        //发送数据
        b = "客户端2:我劝你善良".getBytes();
        packet = new DatagramPacket(b,b.length, InetAddress.getByName("127.0.0.1"),8888);
        socket.send(packet);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值