Socket通信讲解及C/S结构实现UDP协议通信

这篇具有很好参考价值的文章主要介绍了Socket通信讲解及C/S结构实现UDP协议通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Sokcet


一. Socket套接字

1.1 什么是套接字


所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制,是支持TCP/IP协议的路通信的基本操作单元

1.2 套接字主要类型


TCP流套接字

流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP协议。即传输层TCP通信满足如下条件:

  • 有连接可靠传输
  • 面向字节流,即可以利用IO流分开进行多次收发
  • 有接受的缓冲区和传输缓冲区,没有传输大小限制

UDP数据报套接字

数据报套接字提供一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。即传输层UDP通信满足如下条件:

  • 无连接不可靠传输
  • 面向数据报,即发送的内容必须一次性收发
  • 有接受的缓冲区,但没有发送的缓冲区,一次性最多传输64k大小

原始套接字

原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送的数据必须使用原始套接。

二. UDP常见API

2.1 DatagramSocket

DatagramSocket 用来构造传输UDP协议的类,表格介绍如何构造类对象

构造方法 含义
DatagramSocket(int port) 创建一个UDP数据报套接字Socket,绑定到指定的端口

表格介绍DatagramSocket 常用的传输和接受数据包方法

方法 含义
void receive(DatagramPacket p) 套接字接收数据报
void send(DatagramPacket p) 套接字发送数据报包
void close() 关闭套接字

2.2 DatagramPacket


DatagramPacket 用来构造传输数据包的类,表格介绍如何构造类对象

构造方法 含义
DatagramPacket(byte[] buffer, int length) 构造数据包接受数据,parm1:接受的内容,parm2:指定接受的长度
DatagramPacket(byte[] buffer, int offset, int length,SocketAddress address) 构造数据包发送数据,parm1:发送内容,parm2:从字符组下标哪里开始发送,parm3:发送的长度、parm4:封装目的IP和端口对象

表格介绍DatagramPacket 常用的方法

方法 含义
InetAddress getAddress() 从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取接收端主机IP地址
int getPort() 从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获取接收端主机端口号
byte[] getData() 获取数据报中的数据

2.3 SocketAddress


在上述DatagramPacket对象发送数据包时,需要构造SocketAddress 来封装IP和端口,我们常使用SocketAddress 的子类InetSocketAddress来构建对象

构造方法 含义
InetSocketAddress(InetAddress address, int port) 创建一个Socket地址,包含IP地址和端口号

三. C/S结构测试


3.1 TCP通信


TCP网络协议通信可查看这篇文章:
利用TCP网络编程实现客户端和服务端简单交互

3.2 UDP通信


下面讲解如何利用Socket实现C/S结构的UDP协议通信,如下图为传输过程
Socket通信讲解及C/S结构实现UDP协议通信

服务端Server

//构建UDP协议的服务端
public class UDPServer {
    //构建套接字
    DatagramSocket socket;

    //构建协议对象(参数表示服务器端口号)
    public UDPServer(int serverPort) throws SocketException {
        socket = new DatagramSocket(serverPort);
    }

    //开启服务器进行监听
    public void startListening() throws IOException {
        System.out.println("===============服务器开启监听===================");
        Scanner scanner = new Scanner(System.in);//用来回复
        while (true){
            //1.构建数据包用来接受数据
            DatagramPacket receivePacket = new DatagramPacket(new byte[1024], 1024);
            //2.等待接受数据(没有返回值,但是已经接收到了数据)
            socket.receive(receivePacket);

            //3.将接受的数据取出
            String receiveData = new String(receivePacket.getData(),0,receivePacket.getLength());
            //如果客户端发送来ex或exit则退出
            if ("ex".equals(receiveData) || "exit".equals(receiveData)){
                System.out.println("===============服务器退出===================");
                break;
            }

            //4.根据请求进行回复
            System.out.println("收到消息:{"+receiveData+"}");
            System.out.println("请输入想要回复的信息:");
            String answer = scanner.nextLine();
            byte[] answerBytes = answer.getBytes();

            //5.将回复封装为数据包发送回客户端
            //注意:这里是根据接受的数据包来获取发送方的ip和端口
            DatagramPacket answerPacket = new DatagramPacket(answerBytes, 0, answerBytes.length, receivePacket.getSocketAddress());
            socket.send(answerPacket);

        }
    }
    

    public static void main(String[] args) throws IOException {
        UDPServer udpServer = new UDPServer(8899);
        udpServer.startListening();
    }

}

客户端Client

//构建UDP协议的客户端
public class UDPClient {
    //服务器端口号
    int serverPort;
    //服务器ip
    String serverIp;
    //构建套接字
    DatagramSocket socket;

    //构建协议对象(参数表示服务器端口号和服务器ip地址)
    public UDPClient(int serverPort, String serverIp) throws SocketException {
        this.serverIp = serverIp;
        this.serverPort = serverPort;
        this.socket = new DatagramSocket();
    }


    public void startSend() throws IOException {
        System.out.println("===============客户端开启接受===================");
        //1.获取输入
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.println("请输入想要发送的信息:");
            String request = scanner.nextLine();
            byte[] requestBytes = request.getBytes();

            //2.构建数据包
            //InetAddress.getByName()表示根据服务器主机名称解析ip地址
            DatagramPacket requestPacket = new DatagramPacket(requestBytes, 0, requestBytes.length, InetAddress.getByName(serverIp), serverPort);

            //3.发送数据包
            socket.send(requestPacket);
            //设定退出
            if ("ex".equals(request) || "exit".equals(request)){
                System.out.println("===============客户端退出===================");
                break;
            }

            //4.构建数据包用来获取响应
            DatagramPacket receivePacket = new DatagramPacket(new byte[1024], 1024);
            socket.receive(receivePacket);

            //5.将获取的数据取出
            String receiveData = new String(receivePacket.getData(),0,receivePacket.getLength());
            System.out.println("收到消息:{"+receiveData+"}");

        }
    }


    public static void main(String[] args) throws IOException {
        UDPClient udpClient = new UDPClient(8899, "192.168.31.104");
        udpClient.startSend();
    }
}

服务器端运行在192.168.31.104上,利用如下代码开启监听:

java -cp NetworkSocket-1.0-SNAPSHOT.jar com.nuaa.mySocket.server.UDPServer               

客户端运行在本地,通信对话如下

Socket通信讲解及C/S结构实现UDP协议通信

Socket通信讲解及C/S结构实现UDP协议通信文章来源地址https://www.toymoban.com/news/detail-472464.html

到了这里,关于Socket通信讲解及C/S结构实现UDP协议通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java实现socket通信详解(UDP/TCP)c/s模式

    在实现具体代码前,我们先来简单了解下TCP/UDP协议 TCP在OSI模型中位于传输层在网络层之上,故在端到端传输的基础上将数据以端口号等标识实现进程/终端设备应用的区分, 将数据精准的传达。 TCP全称为传输控制协议具有以下特点: 面向有连接的服务可靠的数据传输,即在

    2023年04月08日
    浏览(37)
  • 基于 Socket 接口实现自定义协议通信

    访问【WRITE-BUG数字空间】_[内附完整源码和文档] 根据自定义的协议规范,使用 Socket 编程接口编写基本的网络应用软件。 掌握 C 语言形式的 Socket 编程接口用法,能够正确发送和接收网络数据包 开发一个客户端,实现人机交互界面和与服务器的通信 开发一个服务端,实现并

    2024年02月06日
    浏览(43)
  • 【Java网络编程】基于UDP-Socket 实现客户端、服务器通信

    ​ 哈喽,大家好~我是你们的老朋友: 保护小周ღ   本期为大家带来的是网络编程的 UDP Socket 套接字,基于 UDP协议的 Socket 实现客户端服务器通信 ,Socket 套接字可以理解为是,传输层给应用层提供的一组 API,如此程序,确定不来看看嘛~~ 本期收录于博主的专栏 : JavaEE_保

    2024年02月02日
    浏览(71)
  • C# Socket通信从入门到精通(12)——多个同步UDP客户端C#代码实现

    我们在开发Udp客户端程序的时候,有时候在同一个软件上我们要连接多个服务器,这时候我们开发的一个客户端就不够使用了,这时候就需要我们开发出来的软件要支持连接多个服务器,最好是数量没有限制,这样我们就能应对任意数量的服务器连接,由于我们开发的Udp客户

    2024年02月04日
    浏览(60)
  • C# Socket通信从入门到精通(14)——多个异步UDP客户端C#代码实现

    在之前的文章C# Socket通信从入门到精通(13)——单个异步UDP客户端C#代码实现我介绍了单个异步Udp客户端的c#代码实现,但是有的时候,我们需要连接多个服务器,并且对于每个服务器,我们都有一些比如异步发送、异步接收的操作,那么这时候我们使用之前单个异步Udp客户

    2024年02月03日
    浏览(81)
  • 【QT网络编程】实现UDP协议通信

    Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了 一种无需建立连接就可以发送封装的 IP 数据包的方法 。RFC 768 描述了 UDP。 UDP协议根据消息传送模式可以分为: 单播(Unicast)、组播(Multicast)和广播(

    2024年02月02日
    浏览(56)
  • C# Socket通信从入门到精通(16)——单个同步UDP服务器监听多个客户端C#代码实现

    我们在开发UDP通信程序时,有时候我们也需要开发UDP服务器程序,这个服务器只需要和一个客户端实现通信,比如这篇博文C# Socket通信从入门到精通(15)——单个同步UDP服务器监听一个客户端C#代码实现,但是在实际项目中有的时候需要和多个客户端进行通信,这时和一个客

    2024年01月22日
    浏览(64)
  • C# Socket通信从入门到精通(15)——单个同步UDP服务器监听一个客户端C#代码实现

    我们在开发UDP通信程序时,除了开发UDP客户端程序,有时候我们也需要开发UDP服务器程序,这在实际项目中是经常会遇到的,所以说掌握UDP服务器程序的开发是一项必备的技能,尤其在上位机软件开发领域,掌握UDP服务器程序的开发是走向高级工程师的必经之路,也是面试必

    2024年02月03日
    浏览(60)
  • 【Java】网络编程与Socket套接字、UDP编程和TCP编程实现客户端和服务端通信

    为什么需要网络编程? 现在网络普及程序越来越高,网络上保存着我们日常生活中需要的各种资源,使用程序通过网络来获取这些资源的过程就需要网络编程来实现。 什么是网络编程? 网络编程,指网络上的主机,通过不同的进程以程序的方式实现网络通信(网络数据传输)

    2024年02月17日
    浏览(79)
  • TCP/UDP/Socket 通俗讲解

    1.封包和拆包 封包,就是发送数据前把自己本地需要发送的数据包装一下,即把要发送的原始数据附加上接受者可以辨识到自己身份等一些额外信息。有点像寄一封信,信封上填写的寄件人和收件人以及地址。 拆包,是接收到对方封包后发送来的数据后,拆出原始信息和对方

    2023年04月18日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包