java网络编程(2)socket通信案例(TCP和UDP)

简介: java生下来一开始就是为了计算机之间的通信,因此这篇文章也将开始介绍一下java使用socket进行计算机之间的通信,在上一篇文章中已经对网络通信方面的基础知识进行了总结,这篇文章将通过代码案例来解释说明。

一、网络编程基础


因为java网络编程这块是从基础开始讲解的,所以知识点也是由浅入深,因此还是有必要对一些基础的知识进行回顾和掌握,如果你是大神,不喜勿喷。


1、两台计算机之间的通信


两台计算机如何实现通信呢?人类交流是通过定义一定的语言,计算机也是,他们之间必须要有相应的协议才可以。

v2-b15b763edcd751d458684fcca44eb4f3_1440w.jpg也就是说,两台计算机要想通信必须要遵循一定的规则协议。通信流程基本上就是,一台计算机上的一个端口号数据,然后通过协议发送到另外一台计算机上的同一个端口号。这里面有三个重要的部分需要我们去理解一下,当然不会细讲,因为在上一篇文章中已经提出。


(1)TCP/IP协议

(2)IP地址

(3)端口


我们先讲一下TCP/IP模型。


2、TCP/IP模型


TCP/IP模型就是上面的协议,它定义了一些规则来用于计算机之间的通信,同时也是世界上应用最为广泛的协议。这个协议模型建立在TCP和IP协议上面(从名字也可以看出来)。

v2-24184ab4f040f93c565b9ed930953b19_1440w.jpg

从上图我们可以看到TCP/IP其实是处于传输层的,也就是我们的协议核心所在,TCP/IP协议定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。


3、IP地址


为了实现两个网络中不同计算机之间的通信,每台计算机都必须有一个唯一的标识,就是中国公民每一个人都有一个惟一的身份证号码一样。


4、端口


我们知道一台计算机其实是可以跑很多个程序的,那么我们的程序怎么就能准确无误的到达另外一个程序呢?这其实就是使用了端口号来区分不同的应用程序。

v2-c3d560ed0f54876e9bed731a8b8d6501_1440w.jpg

端口号的范围也很大0到65535。其中0到1023是保留的,也就是我们不能用的。那我们的今天所讲的socket是如何组成的呢?其实就是由IP地址和端口号组成的。


二、socket通信


在上面其实我们对通讯需要掌握的一些基础知识进行了分析,这里我们开始使用java语言来演示一下这个过程。


socket通信其实是有两种方式:TCP和UDP过程。

(1)TCP是可靠地面向连接的通信过程,含有三次握手四次挥手的机制。

(2)UDP是不可靠的无连接的通信过程,客户端只管发,不管服务端有没有接受到。


那这两种通信方式的基本模型是什么呢?我们使用一张图来看一下:

v2-31f17ecd99e5253a1a745736bd319213_1440w.jpg

从上图我们可以看到,Socket实现的步骤大体包含一下几个步骤:


(1)创建Server和client的ServerSocket和Socket。

(2)打开链接到Socket的输入输出流

(3)按照协议对Socket进行读取操作

(4)关闭输入输出流、关闭Socket。


下面我们就直接来看例子,然后再来分析这个例子:


1、基于TCP的socket通信


我们拿男孩做客户端,女孩因为有很多人追求,所以做服务端,一个服务端可被多个男孩客户端请求表白。我们这里先看女孩服务端的具体步骤:


(1)创建ServerSocket对象,绑定监听端口。

(2)通过accept()方法监听客户端请求

(3)连接建立后,通过输入流读取客户端的数据

(4)通过输出流,向客户端回应信息

OK,基本的步骤就是这,我们就看一下代码。

public class Server {
    public static void main(String[] args) throws IOException {
        // 端口号
        int port = 8888;
        // 保留客户端发来的信息
        String info=null;
        // 1、创建ServerSocket并监听指定的端口
        ServerSocket serverSocket = new ServerSocket(port);
        // 2、使用accept监听来自客户端的连接
        Socket socket = serverSocket.accept();
        //3、获取输入流,读取客户端信息(将字节流转化为字符流),并保存在缓冲区中
        InputStreamReader is=new InputStreamReader(socket.getInputStream());
        BufferedReader br=new BufferedReader(is);
        while ((info=br.readLine())!=null) {
            System.out.println("女孩收到了男孩的来信,内容是:"+info);
        }
        socket.shutdownInput();//关闭输入流
        //4、通过输出流回应客户端
        PrintWriter os=new PrintWriter(socket.getOutputStream());
        os.write("我同意你的请求");
        os.flush();//将缓冲区输出
        socket.shutdownOutput();
        //5、关闭资源
        is.close();
        os.close();
        br.close();
        socket.close();
        serverSocket.close();
    }
}

具体的步骤已经很清晰了,我们再来看看男孩客户端的步骤:


(1)创建Socket并指定端口

(2)通过输出流向服务端发送一个请求

(3)等待服务端的回应 获取输入流,读取客户端信息(将字节流转化为字符流),并保存在缓冲区中

(4)关闭资源


下面同样使用java代码来演示一下。

public class Client {
    public static void main(String[] args) {    
        try {
            //1、创建Socket并指定端口
            Socket socket = new Socket("localhost",8888);
            //2、向服务端发送一个请求
            PrintWriter os = new PrintWriter(socket.getOutputStream());
            System.out.println("男孩要向女孩表白,消息是:我是张三客户端,做我女朋友可好");
            os.write("我是张三客户端,做我女朋友可好");
            os.flush();//将缓冲区输出
            socket.shutdownOutput();
            //3、等待服务端的回应 获取输入流,读取客户端信息(将字节流转化为字符流),并保存在缓冲区中
            InputStreamReader is=new InputStreamReader(socket.getInputStream());
            BufferedReader br=new BufferedReader(is);
            String info=null;
            while ((info=br.readLine())!=null) {
                System.out.println("男孩焦急等待收到了女孩的回应是:"+info);
            }
            socket.shutdownInput();//关闭输入流
            //4、关闭资源
            os.close();
            is.close();
            br.close();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这就是男孩追求女孩的代码示例,说起来也很简单。如果我们之前学习过socket编程,可能上述的这些代码难不倒我们,不过如果从基础开始入门学习,还是有必要对其两个类进行说明一下。高手可跳过:


第一个:Socket

当我们想要在Java中使用TCP/IP通过网络连接到服务器时,就需要创建Socket对象并连接到服务器。在服务端的Socket对应着连接的一个个客户端。

第二个:ServerSocket

用ServerSocket实现java服务通过TCP/IP监听客户端连接,他只存在于服务端。


2、基于UDP的Socket通信


UDP的通信模式其实是无连接的不可靠的通信协议,举个例子,花心男孩向女孩表白,就给女孩写了一封情书,然后不管女孩有没有收到情书,自己继续向其他女孩表白。我们这里还是以女孩为服务端。


我们首先来看一下服务端的步骤:


接收客户端发送的数据

(1)创建服务器端DatagramSocket指定端口

(2)创建数据报DatagramPacket,接收客户端发送的数据

(3)接收客户端发送的数据

(4)读取数据


向客户端响应数据


(1)定义客户端的地址、端口号、数据

(2)创建数据报,包含响应的数据信息

(3)响应客户端

(4)关闭资源

具体代码来演示一下。

public class UDPServer {
    public static void main(String[] args) throws IOException {
        /*
         * 接收客户端发送的数据
         */
        //1.创建服务器端DatagramSocket,指定端口
        DatagramSocket socket=new DatagramSocket(8800);
        //2.创建数据报,用于接收客户端发送的数据
        byte[] data =new byte[1024];//创建字节数组,指定接收的数据包的大小
        DatagramPacket packet=new DatagramPacket(data, data.length);
        //3.接收客户端发送的数据
        System.out.println("****服务器端已经启动,等待客户端发送数据");
        socket.receive(packet);//此方法在接收到数据报之前会一直阻塞
        //4.读取数据
        String info=new String(data, 0, packet.getLength());
        System.out.println("女孩收到了男孩的信息:"+info);
        /*
         * 向客户端响应数据
         */
        //1.定义客户端的地址、端口号、数据
        InetAddress address=packet.getAddress();
        int port=packet.getPort();
        byte[] data2="我不同意,你个渣男".getBytes();
        //2.创建数据报,包含响应的数据信息
        DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);
        //3.响应客户端
        socket.send(packet2);
        //4.关闭资源
        socket.close();
    }
}

然后再来看一下客户端的请求:


向服务器端发送数据


(1)定义服务器的地址、端口号、数据

(2)创建数据报,包含发送的数据信息

(3)创建DatagramSocket对象

(4)向服务器端发送数据报


接收服务器端响应的数据


(1)创建数据报DatagramPacket,用于接收服务器端响应的数据

(2)接收服务器响应的数据

(3)读取数据

(4)关闭资源


我们再使用java语言来演示一下客户端代码

public class UDPClient {
    public static void main(String[] args) throws IOException {
        /*
         * 向服务器端发送数据
         */
        //1.定义服务器的地址、端口号、数据
        InetAddress address=InetAddress.getByName("localhost");
        int port=8800;
        byte[] data="我是花心男,我要和你做男女朋友".getBytes();
        //2.创建数据报,包含发送的数据信息
        DatagramPacket packet=new DatagramPacket(data, data.length, address, port);
        //3.创建DatagramSocket对象
        DatagramSocket socket=new DatagramSocket();
        //4.向服务器端发送数据报
        socket.send(packet);
        /*
         * 接收服务器端响应的数据
         */
        //1.创建数据报,用于接收服务器端响应的数据
        byte[] data2=new byte[1024];
        DatagramPacket packet2=new DatagramPacket(data2, data2.length);
        //2.接收服务器响应的数据
        socket.receive(packet2);
        //3.读取数据
        String reply=new String(data2, 0, packet2.getLength());
        System.out.println("我是花心男,女孩给我回复了:"+reply);
        //4.关闭资源
        socket.close();
    }
}

OK,以上就是socket通信的两种基本方式,这里只是给出了一个最最简单的例子演示,这也是最基础的代码,后续文章会继续加深难度。我们现在来总结一下这个Socket通信

从上面我们可以看到Java提供了非常易用的网络API,调用这些API我们可以很方便的通过建立TCP/IP或UDP套接字,在网络之间进行相互通信,但是其中TCP要比UDP更加常用。但是在一些场景下面。使用无连接的UDP要优于TCP。

相关文章
|
4天前
|
网络协议 Java API
Java 网络编程
5月更文挑战第19天
|
5天前
|
设计模式 监控 网络协议
socket通信处于网络协议那一层和两种接收发送消息方式
socket通信处于网络协议那一层和两种接收发送消息方式
13 2
|
7天前
|
Java 调度
【JAVA学习之路 | 提高篇】线程的通信
【JAVA学习之路 | 提高篇】线程的通信
|
9天前
|
消息中间件 Java Linux
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
|
10天前
|
Java
Java一分钟之-并发编程:线程间通信(Phaser, CyclicBarrier, Semaphore)
【5月更文挑战第19天】Java并发编程中,Phaser、CyclicBarrier和Semaphore是三种强大的同步工具。Phaser用于阶段性任务协调,支持动态注册;CyclicBarrier允许线程同步执行,适合循环任务;Semaphore控制资源访问线程数,常用于限流和资源池管理。了解其使用场景、常见问题及避免策略,结合代码示例,能有效提升并发程序效率。注意异常处理和资源管理,以防止并发问题。
34 2
|
14天前
|
Java 开发者 Spring
Java一分钟之-Java网络编程基础:Socket通信
【5月更文挑战第13天】本文介绍了Java Socket编程基础知识,包括使用`ServerSocket`和`Socket`类建立连接,通过`OutputStream`和`InputStream`进行数据传输。常见问题涉及忘记关闭Socket导致的资源泄漏、网络异常处理及并发同步。理解Socket通信原理并掌握异常处理、资源管理和并发控制,能帮助开发者构建更稳定的网络应用。
40 1
|
14天前
|
网络协议 Java 网络安全
【计算机网络】—— Socket通信编程与传输协议分析
【计算机网络】—— Socket通信编程与传输协议分析
|
14天前
|
网络协议 算法 Java
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
28 3
|
14天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
15 0
|
14天前
|
存储 算法 网络协议
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
20 0