IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> javaSocket网络编程 -> 正文阅读

[网络协议]javaSocket网络编程

作者:recommend-item-box type_download clearfix

一、网络基础

1.计算机网络

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

2.通信协议

网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。而TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际互连协议)是Internet中最基本的协议,是指能够在多个不同网络间实现信息传输的协议簇。

3.参考模型

参考模型

4.网络结构

客户端/服务器(C/S):
服务器:始终运行并监听端口,等待客户请求并做出响应
客户:需要服务时向服务器发出请求
浏览器 /服务器(B/S):
服务器:不用实时监听端口,客户请求后把响应结果返回
客户:需要服务时向服务器发出请求

5.IP地址和端口号

  • IP地址就是网络中每一台计算机的逻辑地址,用于区分计算机

  • 端口号就是计算机中应用程序的一个数字标识,用于区分应用程序

6.TCP和UDP区别

  1. TCP是面向连接的,UDP是面向无连接的
  2. UDP程序结构较简单
  3. TCP基于字节流,UDP基于数据报
  4. TCP保证数据正确性,UDP可能丢包
  5. TCP保证数据顺序,UDP不保证

二、基于TCP的Socket

1.创建步骤

服务器一般步骤:

  1. 基于端口创建ServerSocket(套接字服务)
  2. 等待客户端连接
  3. 获取客户端的输入流
  4. 使用客户端的输入流(写出到文件或者输出等)
  5. 告知客户端,服务器接收完毕
  6. 关闭资源,断开连接

客户端一般步骤:

  1. 基于服务器的IP地址和端口创建Socket(套接字)连接
  2. 创建一个输出流
  3. 向输出流中写入数据(文件或文本等)
  4. 告知服务器,客户端发送完毕
  5. 关闭资源,断开连接

2.代码示例

服务器:

public class Server {
    public static void main(String[] args) throws Exception {
        // 1.创建服务
        ServerSocket serverSocket = new ServerSocket(6666);
        // 2.等待客户端连接
        Socket clientSocket = serverSocket.accept();
        // 3.获取客户端的IO流
        InputStream is = clientSocket.getInputStream();
        // 4.写出到文件
        FileOutputStream fos = new FileOutputStream(new File("server.jpg"));// IDEA默认在工程根目录下
        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1) {
            fos.write(buffer,0,len);
        }
        System.out.println("server.jpg-->下载完成");
        // 5.告诉客户端,你发的图片我已经接收完了
        clientSocket.shutdownInput();
        // 6.发送一个消息给客户端
        OutputStream os = clientSocket.getOutputStream();
        os.write("服务器已经接收完,可以断开连接了".getBytes());
        // 7.告诉客户端,我的话已经说完了
        clientSocket.shutdownOutput();
        // 8.关闭资源
        fos.close();
        is.close();
        clientSocket.close();
        serverSocket.close();
    }
}

客户端:

public class Client {
    public static void main(String[] args) throws Exception {
        // 1.创建Socket连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 6666);
        // 2.创建输出流
        OutputStream os = socket.getOutputStream();
        // 3.读取文件
        FileInputStream fis = new FileInputStream(new File("client.jpg"));
        // 4.文件输出
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1) {
            os.write(buffer,0,len);
        }
        // 5.告诉服务器,我的图片已经发送完了
        socket.shutdownOutput();
        // 6.读取服务器发送过来的文本
        InputStream is = socket.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer2 = new byte[1024];
        int len2;
        while ((len2 = is.read(buffer2)) != -1) {
            baos.write(buffer2,0,len2);
        }
        System.out.println(baos.toString());
        // 7.告诉服务器,你发的消息我已经知道了
        socket.shutdownInput();
        // 8.关闭资源
        baos.close();
        is.close();
        fis.close();
        os.close();
        socket.close();
    }
}

3.运行结果

先启动服务器,再启动客户端,不然会连接失败

结果
结果

三、基于UDP的Socket

1.创建步骤

发送方的一般步骤:

  1. 创建DatagramSocket(数据报套接字)
  2. 基于接收方的IP和端口,创建InetSocketAddress(IP套接字地址)
  3. 创建数据包
  4. 发送数据包
  5. 关闭资源,断开连接

接收方的一般步骤:

  1. 基于发送方的端口,创建DatagramSocket(数据报套接字)
  2. 接收数据包
  3. 获取数据包中的数据,并使用
  4. 关闭资源,断开连接

2.代码示例

接收方(监听线程):

public class Listen implements Runnable {
    private DatagramSocket socket =null;
    private int fromPort;// 接收方的监听端口
    private String fromName;// 发送方的名字

    public Listen(int fromPort,String fromName) {
        this.fromPort = fromPort;
        this.fromName = fromName;
    }

    @Override
    public void run() {
        try {
            socket = new DatagramSocket(fromPort);// 创建socket
            while (true) {
                // 接收数据包
                byte[] buffer = new byte[1024];
                DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
                socket.receive(packet);
                // 获取数据
                String receiveData = new String(packet.getData(), 0, packet.getLength());
                System.out.println(this.fromName + ":" + receiveData);
                // 终止条件
                if (receiveData.equals("bye")) {
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            socket.close();// 关闭资源
        }
    }
}

发送方(发送线程):

public class Talk implements Runnable {
    private DatagramSocket socket = null;
    private InetSocketAddress socketAddress = null;
    private int toPort;// 接收方的端口
    private String toHostName;// 接收方的主机名或IP地址

    public Talk(String toHostName, int toPort) {
        this.toPort = toPort;
        this.toHostName = toHostName;
    }

    @Override
    public void run() {
        try {
            socket = new DatagramSocket();// 创建socket
            socketAddress = new InetSocketAddress(toHostName,toPort);
            while (true) {
                // 从键盘获取数据
                BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
                String data = reader.readLine();
                // 创建数据包
                byte[] datas = data.getBytes();
                DatagramPacket packet = new DatagramPacket(datas,0,datas.length, this.socketAddress);
                socket.send(packet);// 发送数据包
                // 终止条件
                if ("bye".equals(data)) {
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            socket.close();// 关闭资源
        }
    }
}

学生启动两个线程

public class Student {
    public static void main(String[] args) {
        new Thread(new Talk("localhost",6666)).start();
        new Thread(new Listen(8888,"老师")).start();
    }
}

教师启动两个线程

public class Teacher {
    public static void main(String[] args) {
        new Thread(new Talk("localhost",8888)).start();
        new Thread(new Listen(6666,"学生")).start();
    }
}

3.运行结果

在这里插入图片描述
在这里插入图片描述

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-26 10:33:32  更:2021-09-26 10:36:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/27 1:49:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码