05.Java网络编程(代码实践)

简介: 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路链接起来,在网络操作系统,网络管理软件及网络通信协议的协调下,实现资源贡献和信息传递的计算机系统网络编程就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换网...

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

网络编程就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换

网络编程三要素:

IP:每个设备在网络中的唯一标识,每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址
ipconfig:查看本机IP地址,ipv4地址
ping:测试连接

端口:每个程序在设备上的唯一标识,每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发送到哪台机器上,还需要确定发送到哪个程序,端口号范围:0~65535,编写的网络应用端口号尽量设置1024以上的,1024之下的基本上都被系统程序占用了

协议:为计算机网络进行数据交换而建立的规则,标准或约定的集合
UDP:面向无连接,数据不安全,速度快,不区分客户端与服务端
TCP:面向链接,三次握手,数据安全但效率低,分为客户端和服务端,三次握手的过程,客户端向服务端发起请求,服务端响应请求,传输数据

Socke套接字通信:

网络上具有唯一标识的IP地址和端口号组合在一起,才能构成唯一能识别的标识符套接字
通信的两端都有socket,网络通信其实就是socket间的通信,它通过IO流进行传输,Socket在应用程序中创建,通过一种绑定机制与驱动机制建立关系,告诉自己所对应的IP和端口

新建一个Java工程模拟UDP通信


img_267f1b14280c52d012826235fc855759.png
图片1.png
package com.ren.socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/**
 * socket好比发货的码头,packet就是需要发送的集装箱货物,这个货物需要发送到哪里,它的地址
 * 信息是在货物上标明的,所以packet构造方法上传递了发送目的地的地址和该地址上接收程序的端口
 * @author renzhenming
 *
 */
public class Send {

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        DatagramSocket socket = new DatagramSocket();
        
        while(true){
            String scan = sc.nextLine();
            DatagramPacket packet = 
                    new DatagramPacket(scan.getBytes(), //或者用127.0.0.1也可以
                            scan.getBytes().length, InetAddress.getByName("192.168.1.103"), 9999);
            socket.send(packet);
        }
    }

}
package com.ren.socket;

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

/**
 * 创建接收端
 * @author renzhenming
 *
 */
public class Receive {

    public static void main(String[] args) throws IOException {
        //用于接收传递过来的数据
        DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
        //指定端口号,用于接收指定端口传递的数据
        DatagramSocket socket = new DatagramSocket(9999);
        
        while(true){
            //执行之后会将接收到的数据放在packet中
            socket.receive(packet);
            //转换成字符串打印
            byte[] arr = packet.getData();
            int len = packet.getLength();
            String ip = packet.getAddress().getHostAddress();
            int port = packet.getPort();
            System.out.println(ip+":"+port+":"+new String(arr,0,len));
        }
    }
}

为了演示效果,我们打开两个命令行,在命令行中分别执行这两个Java方法,先执行Receive端,注意要在bin目录下运行命令


img_cfa1932858998c475d6890b2dc849f0c.png
图片1.png

开启线程执行

package com.ren.socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
 * socket好比发货的码头,packet就是需要发送的集装箱货物,这个货物需要发送到哪里,它的地址
 * 信息是在货物上标明的,所以packet构造方法上传递了发送目的地的地址和该地址上接收程序的端口
 * @author renzhenming
 *
 */
public class SocketDemo {

    public static void main(String[] args) throws IOException {
        new Receive().start();
        new Sender().start();
    }
}

class Receive extends Thread{
    @Override
    public void run() {
        super.run();
        try {
            //用于接收传递过来的数据
            DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
            //指定端口号,用于接收指定端口传递的数据
            DatagramSocket socket = new DatagramSocket(9999);
                    
            while(true){
                //执行之后会将接收到的数据放在packet中
                socket.receive(packet);
                //转换成字符串打印
                byte[] arr = packet.getData();
                int len = packet.getLength();
                String ip = packet.getAddress().getHostAddress();
                int port = packet.getPort();
                System.out.println(ip+":"+port+":"+new String(arr,0,len));
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class Sender extends Thread{
    @Override
    public void run() {
        super.run();
        try {
            Scanner sc = new Scanner(System.in);
            DatagramSocket socket = new DatagramSocket();
            
            while(true){
                String scan = sc.nextLine();
                DatagramPacket packet = 
                        new DatagramPacket(scan.getBytes(), //或者用127.0.0.1也可以
                                scan.getBytes().length, InetAddress.getByName("192.168.1.103"), 9999);
                socket.send(packet);
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

新建一个Java工程模拟TCP通信
TCP协议的Socket通信,客户端通过Socket处理发送和接收,服务端通过ServerSocket 处理发送和接收

Socket_TCP_Client

package com.ren.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Socket_TCP_Client {

    public static void main(String[] args) throws UnknownHostException, IOException {
        //socket1();
        socket2();
    }
    //多个
    private static void socket2() throws UnknownHostException, IOException {
        Socket socket = new Socket("127.0.0.1",12345);
        BufferedReader br = new BufferedReader
                (new InputStreamReader(socket.getInputStream()));
        PrintStream ps = new PrintStream(socket.getOutputStream());
        
        System.out.println(br.readLine());
        ps.println("我可以去哪里逛逛呢");
        System.out.println(br.readLine());
        ps.println("谢谢");
        socket.close();
        
    }

    //一次读取一个
    private static void socket1() throws UnknownHostException, IOException {
        Socket socket = new Socket("127.0.0.1",12345);
        //输入流可以读取服务端输出流写出的数据
        InputStream in = socket.getInputStream();
        //输出流可以写出数据到服务端输入流
        OutputStream out = socket.getOutputStream();
        out.write("打开百度首页".getBytes());
        byte[] arr = new byte[1024];
        int len = in.read(arr);
        System.out.println("收到服务端数据:"+new String(arr,0,len));
    }

}

Socket_TCP_Server

package com.ren.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Socket_TCP_Server {

    public static void main(String[] args) throws Exception {
        //socket1();
        //socket2();
        socket3();
    }
    //多线程开启服务器,可以接收多个客户端来咨询
    private static void socket3() throws IOException {
        final ServerSocket serverSocket = new ServerSocket(12345);
        
        while(true){
            new Thread(new Runnable() {
                
                @Override
                public void run() {
                    
                    try {
                        Socket socket = serverSocket.accept();
                        BufferedReader br = new BufferedReader
                                (new InputStreamReader(socket.getInputStream()));
                        PrintStream ps = new PrintStream(socket.getOutputStream());
                        
                        ps.println("欢迎来到中国");
                        //readLine是以换行为结束符读取一行数据的,如果客户端写入数据的时候使用了print而不是println,就会导致
                        //数据无法读取
                        System.out.println(br.readLine());
                        ps.println("你可以先去游览北京长城");
                        System.out.println(br.readLine());
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
        
        
    }

    //实现多次读取
    private static void socket2() throws Exception {
        ServerSocket serverSocket = new ServerSocket(12345);
        Socket socket = serverSocket.accept();
        
        BufferedReader br = new BufferedReader
                (new InputStreamReader(socket.getInputStream()));
        PrintStream ps = new PrintStream(socket.getOutputStream());
        
        ps.println("欢迎来到中国");
        //readLine是以换行为结束符读取一行数据的,如果客户端写入数据的时候使用了print而不是println,就会导致
        //数据无法读取
        System.out.println(br.readLine());
        ps.println("你可以先去游览北京长城");
        System.out.println(br.readLine());
        socket.close();

    }

    //实现单词读取
    private static void socket1() throws IOException {
        //注意端口号不能超过65535
        ServerSocket server = new ServerSocket(12345);
        //接收服务端数据,这个操作会阻塞线程,直到收到数据才往下执行
        Socket socket = server.accept();
        //接收到的客户端消息
        InputStream is = socket.getInputStream();
        byte[] arr = new byte[1024];
        int len = is.read(arr);
        System.out.println("收到客户端数据:"+new String(arr,0,len));
        //向客户端发送消息需要获取一个输入流然后write
        OutputStream os = socket.getOutputStream();
        os.write("百度一下,你就知道".getBytes());
    }

}
相关文章
|
1月前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
200 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
2月前
|
边缘计算 容灾 网络性能优化
算力流动的基石:边缘网络产品技术升级与实践探索
本文介绍了边缘网络产品技术的升级与实践探索,由阿里云专家分享。内容涵盖三大方面:1) 云编一体的混合组网方案,通过边缘节点实现广泛覆盖和高效连接;2) 基于边缘基础设施特点构建一网多态的边缘网络平台,提供多种业务形态的统一技术支持;3) 以软硬一体的边缘网关技术实现多类型业务网络平面统一,确保不同网络间的互联互通。边缘网络已实现全球覆盖、差异化连接及云边互联,支持即开即用和云网一体,满足各行业需求。
|
22天前
|
人工智能 自然语言处理 前端开发
从理论到实践:使用JAVA实现RAG、Agent、微调等六种常见大模型定制策略
大语言模型(LLM)在过去几年中彻底改变了自然语言处理领域,展现了在理解和生成类人文本方面的卓越能力。然而,通用LLM的开箱即用性能并不总能满足特定的业务需求或领域要求。为了将LLM更好地应用于实际场景,开发出了多种LLM定制策略。本文将深入探讨RAG(Retrieval Augmented Generation)、Agent、微调(Fine-Tuning)等六种常见的大模型定制策略,并使用JAVA进行demo处理,以期为AI资深架构师提供实践指导。
175 73
|
12天前
|
消息中间件 Java 应用服务中间件
JVM实战—1.Java代码的运行原理
本文介绍了Java代码的运行机制、JVM类加载机制、JVM内存区域及其作用、垃圾回收机制,并汇总了一些常见问题。
JVM实战—1.Java代码的运行原理
|
15天前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
66 23
|
13天前
|
人工智能 运维 监控
领先AI企业经验谈:探究AI分布式推理网络架构实践
当前,AI行业正处于快速发展的关键时期。继DeepSeek大放异彩之后,又一款备受瞩目的AI智能体产品Manus横空出世。Manus具备独立思考、规划和执行复杂任务的能力,其多智能体架构能够自主调用工具。在GAIA基准测试中,Manus的性能超越了OpenAI同层次的大模型,展现出卓越的技术实力。
|
19天前
|
缓存 边缘计算 安全
阿里云CDN:全球加速网络的实践创新与价值解析
在数字化浪潮下,用户体验成为企业竞争力的核心。阿里云CDN凭借技术创新与全球化布局,提供高效稳定的加速解决方案。其三层优化体系(智能调度、缓存策略、安全防护)确保低延迟和高命中率,覆盖2800+全球节点,支持电商、教育、游戏等行业,帮助企业节省带宽成本,提升加载速度和安全性。未来,阿里云CDN将继续引领内容分发的行业标准。
71 7
|
20天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
45 5
|
22天前
|
人工智能 运维 API
云栖大会 | Terraform从入门到实践:快速构建你的第一张业务网络
云栖大会 | Terraform从入门到实践:快速构建你的第一张业务网络
|
1月前
|
安全 网络协议 Java
Java网络编程封装
Java网络编程封装原理旨在隐藏底层通信细节,提供简洁、安全的高层接口。通过简化开发、提高安全性和增强可维护性,封装使开发者能更高效地进行网络应用开发。常见的封装层次包括套接字层(如Socket和ServerSocket类),以及更高层次的HTTP请求封装(如RestTemplate)。示例代码展示了如何使用RestTemplate简化HTTP请求的发送与处理,确保代码清晰易维护。

热门文章

最新文章