JAVA EE初阶 6: 网络编程套接字

本节目标:

1.网络编程基础

2.Socket套接字

3.UDP数据报套接字编程

4.TCP流套接字编程

1.网络编程基础



1.1 原因


1.2 网络编程中的基本概念

2.Socket套接字


3.UDP数据报套接字编程

3.1 API介绍



3.2 代码示例

UDP Echo Server

java 复制代码
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class EchoServer {
    //创建 socket 对象
    private DatagramSocket socket;

    //构造方法
    public EchoServer(int port) throws SocketException  {
        socket = new DatagramSocket(port);
    }


    //启动服务器,完成主要业务逻辑
    public void start() throws IOException{
        System.out.println("服务器启动!");

        while (true) {
            //1 从客户端读取请求并解析
            //(1) 创建一个空白的 DatagramPacket 对象
            DatagramPacket reqPacket = new DatagramPacket(new byte[4096], 4096);
            //(2) 通过 receive 读取网卡数据,如果网卡没有收到数据,就会阻塞等待。
            socket.receive(reqPacket);
            //(3) 把 DatagramPacket 中的数据转换为字符串,只需要从 DatagramPacket 中读取有效数据即可。
            String request = new String(reqPacket.getData(), 0, reqPacket.getLength());
        
            //2 根据请求计算响应
            String response = process(request);

            //3 把响应写回客户端
            //(1) 把响应构成 DatagramPacket 对象
            DatagramPacket respPacket = new DatagramPacket(response.getBytes(), response.getBytes().length,
            reqPacket.getSocketAddress());
            //(2) 把 DatagramPacket 写回给客户端
            socket.send(respPacket);

            //4 打印日志
            System.out.printf("[%s:%d] req: %s, resp: %s\n",
            reqPacket.getAddress(),reqPacket.getPort(),request,response);
        }
    }


    //由于我们是 "回显服务器" ,所以响应和请求是一样的,这里直接返回请求即可。 
    private String process(String request) {
        return request;
    }


    public static void main(String[] args) throws IOException {
        EchoServer server = new EchoServer(65535);
        server.start();
    }



}




UDP Echo Client

java 复制代码
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class EchoClient {
    private DatagramSocket socket = null;
    private String severIp;
    private int serverPort;

    public EchoClient(String severIp,int serverPort) throws SocketException {
        this.severIp = severIp;
        this.serverPort = serverPort;
        socket = new DatagramSocket();

    }


    public void start() throws IOException {
        Scanner Scanner = new Scanner(System.in);
        System.out.println("客户端启动!");

        while (true) {
            //1.从控制台读取数据
            System.out.println("请输入:");
            String request = Scanner.next();

            //2.构造UDP请求 把数据封装成 DatagramPa 不光要填内容,还要填服务器的地址和端口
            DatagramPacket reqPacket = new DatagramPacket(request.getBytes(), request.getBytes().length,
            InetAddress.getByName(severIp), serverPort);
            socket.send(reqPacket);

            //3.接收服务器的响应
            DatagramPacket respPacket = new DatagramPacket(new byte[4096], 4096);
            socket.receive(respPacket);
            String response = new String(respPacket.getData(), 0, respPacket.getLength());
 
           //4.把响应显示到控制台
           System.out.println("服务器响应:" + response);
        }
    }


    public static void main(String[] args) throws SocketException, IOException {
        EchoClient echoClient = new EchoClient("127.0.0.1", 9090);
        echoClient.start();
    }   

}


4.TCP流套接字编程

4.1 API介绍

(1)ServerSocket

ServerSocket 是创建TCP服务端Socket的API。

**构造方法:ServerSocket(int port)--**创建一个服务端流套接字Socket,并绑定到指定端口。

**方法:Socket accept()--**开始监听指定端口(创建时绑定的端口),有客户端 连接后,返回⼀个服务端Socket对象,并基于该 Socket建立与客户端的连接,否则阻塞等待。

**void close()--**关闭此套接字

(2)Socket

Socket 是客户端Socket,或服务端中接收到客户端建立连接(accept方法)的请求后,返回的服 务端Socket。

不管是客户端还是服务端Socket,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的。

**构造方法:**Socket(String host,int port)--创建⼀个客户端流套接字Socket,并与对应IP的主机上,对应端口的进程建立连接。

方法:

4.2 代码示例

(1)TCP Echo Server


(2)TCP Echo Client






4.3 长短连接



4.4 总结

相关推荐
鼹鼠SDN1 小时前
没有公网 IP,如何在外面访问家里的打印机、摄像头和整个局域网?
网络·网络协议·tcp/ip
小诗懂技术4 小时前
【网络通信UDP】基础 进程间不同主机的通信
运维·服务器·网络
DM今天肝到几点?6 小时前
AI 安全进入「攻防同频」:Gemini 3.8 Flash Cyber 上线、Astra 触及关键级、HiddenLayer 融资 1 亿美元
网络·人工智能·深度学习·安全·语言模型·开源·知识图谱
幼儿园蛋小黑6 小时前
TCP 并发:从原理到高并发实践
网络·网络协议·tcp/ip
我爱cope8 小时前
【计算机网络 | 网络层11:ICMP 协议:Ping 和 Traceroute 的底层原理】
网络·学习·计算机网络
Latticy9 小时前
vulnhub系列靶机-Photographer
网络·网络安全·内网渗透·内网
爱浦路 IPLOOK9 小时前
矿山无人化作业5G专网方案:企业专网核心网络选型分析
网络·分布式·科技·5g·信息与通信
制冷技术咨询与服务9 小时前
某纯电牵引车的CAN网络3
网络·某纯电牵引车的can网络2
驭渊的小故事10 小时前
网络原理04(http协议详细解析3)(2000详细解析HTTPS的工作原理)
网络·网络协议·http
额额额对了10 小时前
Linux 进程间通信(IPC)核心机制:消息队列、共享内存与信号量详解
linux·网络·网络协议