Java学习路线-39:网络编程TCP、UDP数据传输

本文涉及的产品
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 1个月
简介: Java学习路线-39:网络编程TCP、UDP数据传输

第35 章 : 网络编程

152 网络编程简介

网络编程: 多台主机之间的数据通信

通信协议:IP、TCP(可靠数据连接)、UDP(不可靠数据连接)

网络程序模型:

C/S Client/Server 客户端/服务端 安全性高 开发成本高

B/S Browser/Server 浏览器/服务器 安全性较低 开发成本低


目前以B/S 结构为主


153 Echo程序模型

ServerSocket与Socket

ServerSocket 设置服务器监听端口

Socket 设置要连接服务器的ip和端口


实现一个客户端与服务器端通信 Echo服务

Server.java


import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
    public static void main(String[] args) throws IOException {
        // 设置服务器监听端口
        ServerSocket server = new ServerSocket(8080);
        System.out.println("服务启动。。。");
        // 接收客户端连接
        Socket client = server.accept();
        // 接收客户端消息
        Scanner scanner = new Scanner(client.getInputStream());
        scanner.useDelimiter("\n");
        // 发送给客户端数据
        PrintWriter out = new PrintWriter(client.getOutputStream());
        // 结束标志
        boolean flag = true;
        while (flag) {
            if (scanner.hasNext()) {
                // 读取客户端数据
                String message = scanner.next();
                System.out.println("收到: " + message);
                // 结束标志
                if ("bye".equalsIgnoreCase(message)) {
                    flag = false;
                }
                // 发送数据给客户端
                out.println("[echo] " + message);
                out.flush();
            }
        }
        // 关闭
        out.close();
        scanner.close();
        client.close();
        server.close();
    }
}

Client.java


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client {
    private final static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) throws IOException {
        // 连接服务器
        Socket client = new Socket("localhost", 8080);
        // 接收服务器信息
        Scanner scanner = new Scanner(client.getInputStream());
        scanner.useDelimiter("\n");
        // 向服务器发送信息
        PrintWriter out = new PrintWriter(client.getOutputStream());
        // 结束标志
        boolean flag = true;
        while (flag) {
            // 读取控制台输入,发送给服务器
            String message = getInput("请输入:");
            System.out.println("发送:" + message);
            out.println(message);
            out.flush();
            // 接收服务端返回的数据
            if (scanner.hasNext()) {
                System.out.println("返回:" + scanner.next());
            }
            // 结束标志
            if ("bye".equalsIgnoreCase(message)) {
                flag = false;
            }
        }
        // 关闭操作
        out.close();
        scanner.close();
        client.close();
    }
    // 接收控制台输入
    public static String getInput(String prompt) throws IOException {
        System.out.println(prompt);
        return reader.readLine();
    }
}

154 BIO处理模型

多线程接收多个客户端连接


只用修改服务端代码

Server.java


import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
    public static class ClientThread implements Runnable {
        private Socket client = null;
        private Scanner scanner = null;
        private PrintWriter out = null;
        private boolean flag = true; // 结束标志
        ClientThread(Socket client) throws IOException {
            this.client = client;
            // 接收客户端消息
            this.scanner = new Scanner(client.getInputStream());
            this.scanner.useDelimiter("\n");
            // 发送给客户端数据
            this.out = new PrintWriter(client.getOutputStream());
        }
        @Override
        public void run() {
            while (this.flag) {
                if (this.scanner.hasNext()) {
                    // 读取客户端数据
                    String message = this.scanner.next();
                    System.out.println("收到: " + Thread.currentThread() + message);
                    // 结束标志
                    if ("bye".equalsIgnoreCase(message)) {
                        this.flag = false;
                    }
                    // 发送数据给客户端
                    this.out.println("[echo] " + message);
                    this.out.flush();
                }
            }
            this.out.close();
            this.scanner.close();
            try {
                this.client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) throws IOException {
        // 设置服务器监听端口
        ServerSocket server = new ServerSocket(8080);
        System.out.println("服务启动。。。");
        while (true) {
            // 接收客户端连接
            Socket client = server.accept();
            new Thread(new ClientThread(client)).start();
        }
        // 关闭
        // server.close();
    }
}

155 UDP程序

UDP 基于数据报实现

TCP要保证可靠连接,需要的服务器资源就多


不管客户端是否接收到


Receiver.java

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Receiver {
    public static void main(String[] args) throws IOException {
        DatagramSocket receiver = new DatagramSocket(9000);
        byte[] data = new byte[2014];
        DatagramPacket packet = new DatagramPacket(data, data.length);
        // 等待接收数据
        receiver.receive(packet);
        System.out.println(new String(data, 0, packet.getLength()));
        // 关闭
        receiver.close();
    }
}

Sender.java


import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Sender {
    public static void main(String[] args) throws Exception {
        DatagramSocket sender = new DatagramSocket(9001);
        // 发送数据
        String message = "Hello world";
        DatagramPacket packet = new DatagramPacket(message.getBytes(), 0, message.length(), InetAddress.getByName("localhost"), 9000);
        sender.send(packet);
        // 关闭
        sender.close();
    }
}

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
2月前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
80 11
|
7天前
|
安全 网络协议 Java
Java网络编程封装
Java网络编程封装原理旨在隐藏底层通信细节,提供简洁、安全的高层接口。通过简化开发、提高安全性和增强可维护性,封装使开发者能更高效地进行网络应用开发。常见的封装层次包括套接字层(如Socket和ServerSocket类),以及更高层次的HTTP请求封装(如RestTemplate)。示例代码展示了如何使用RestTemplate简化HTTP请求的发送与处理,确保代码清晰易维护。
|
2月前
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
78 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
2月前
|
网络协议
TCP报文格式全解析:网络小白变高手的必读指南
本文深入解析TCP报文格式,涵盖源端口、目的端口、序号、确认序号、首部长度、标志字段、窗口大小、检验和、紧急指针及选项字段。每个字段的作用和意义详尽说明,帮助理解TCP协议如何确保可靠的数据传输,是互联网通信的基石。通过学习这些内容,读者可以更好地掌握TCP的工作原理及其在网络中的应用。
|
3月前
|
网络协议 Java 物联网
Java网络编程知识点
Java网络编程知识点
75 13
|
3月前
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
105 3
|
3月前
|
数据采集 Java API
java怎么设置代理ip:简单步骤,实现高效网络请求
本文介绍了在Java中设置代理IP的方法,包括使用系统属性设置HTTP和HTTPS代理、在URL连接中设置代理、设置身份验证代理,以及使用第三方库如Apache HttpClient进行更复杂的代理配置。这些方法有助于提高网络请求的安全性和灵活性。
110 0
|
2月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
86 17
|
2月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
2月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
63 10

热门文章

最新文章