java实现UDP及TCP通信

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

简介

UDP(User Datagram Protocol)用户数据报协议,TCP(Transmission Control Protocol) 传输控制协议,是传输层的两个重要协议。

UDP是一种无连接、不可靠传输的协议。其将数据源IP、目的地IP和端口封装成数据包,不需要建立连接,每个数据包的大小限制在64KB内;发送不管对方是否准备好,接收方收到也不确认,故是不可靠的;可以广播发送,发送数据结束时无需释放资源,开销小,速度快。UDP协议适合于即时通信场景,丢失少量数据包也不影响,例如语音通话、视频等。

TCP协议的使用必须双方先建立连接,即是一种面向连接的可靠通信协议。传输前,采用“三次握手”方式建立连接。在连接中可进行大数据量的传输 。连接、发送数据都需要确认,且传输完毕后,还需释放已建立的连接,通信效率较低。TCP协议适用于对信息安全要求较高的场景,例如文件下载等需要安全的数据通信。

Internet协议(IP)

Internet协议类 — InetAddress ,主要包括以下API:

public static InetAddress getLocalHost()

返回本主机的地址对象

public static InetAddress getByName(String host)

得到指定主机的IP地址对象,参数是域名或者IP地址

public String getHostName()

获取此IP地址的主机名

public String getHostAddress()

返回IP地址字符串

public boolean isReachable(int timeout)

判断是否可在指定毫秒内连通该IP地址对应的主机

        //本机ip
        InetAddress ip1=InetAddress.getLocalHost();
        System.out.println(ip1.getHostName());
        System.out.println(ip1.getHostAddress());
        //域名IP
        InetAddress ip2=InetAddress.getByName("www.baidu.com");
        System.out.println(ip2.getHostAddress());
        InetAddress ip3=InetAddress.getByName("112.80.248.75");
        System.out.println(ip3.getHostAddress());
        //判断是否可以连通 ping
        System.out.println(ip3.isReachable(5000));

使用UDP通信

假定从客户端(clientP)给服务端(serverP)发消息,我们先实现客户端发消息功能。

  1. 首先创建DatagramSocket对象socket,作为发送端UDP对象不需要定义端口号,使用随机分配的就可以了。

  1. 然后使用DatagramPacket:数据包对象,将我们的数据内容进行包装,在这里需要设置好接收端口号。

  1. 最后使用send方法把数据包发出去。

  1. 释放通信资源

        DatagramSocket socket=new DatagramSocket();
        System.out.println("本机端口:"+socket.getLocalPort());//发送端端口号
        for (int i = 0; i < 5; i++) {
            //内容
            byte[] buff = ("你好 "+i).getBytes();
            DatagramPacket packet = new DatagramPacket(buff, buff.length,
                    InetAddress.getLocalHost(), 8888);//接收端口
            //发送
            socket.send(packet);
        }
        socket.close();

再来实现服务端接收功能。

  1. 首先也是创建DatagramSocket对象socket,作为接收端UDP对象就需要定义端口号了,与服务端一致。

  1. 然后使用DatagramPacket,数据包对象,来存放我们需要接收的内容数据包。

  1. 最后使用receive方法把数据包收回来。

        DatagramSocket socket=new DatagramSocket(8888);
        for (int i = 0; i < 5; i++) {
            //内容
            byte[] buff = new byte[1024 * 10];
            DatagramPacket packet = new DatagramPacket(buff, buff.length);
            //接收
            socket.receive(packet);
            //数据
            int len = packet.getLength();//获取收到内容的长度
            String rs = new String(buff, 0, len);
            System.out.println("收到 " +packet.getSocketAddress().toString()+":"+ rs);
        }
        socket.close();

以上就实现了客户端往服务端发送消息。这个实现的还只是单方面通信,那我们如何实现互相通信呢。

实现UDP的C-S互通信

基于前面内容我们知道如何实现一方给另一方发消息,这里我们加一个线程进行反过来操作就实现了一个简单的互相通信。

  1. 服务端

我们设置一个线程来进行数据接收打印,在主线程进行数据发送,再根据关键字识别进行通信中断功能。

public class serverP {
    public static void main(String[] args) throws Exception {
        System.out.println("服务端+++");

        Thread t=new myThread();//服务端接收线程
        t.start();

        //发送 对象
        DatagramSocket socketp =new DatagramSocket();
        Scanner sc=new Scanner(System.in);
        while(true) {
            //内容
            String msg=sc.nextLine();

            byte[] buff = msg.getBytes();
            DatagramPacket packet = new DatagramPacket(buff, buff.length,
                    InetAddress.getLocalHost(), 8888);
            //接收
            socketp.send(packet);
            if("再见".equals(msg)) {
                socketp.close();
                System.out.println("断开连接~");
                break;
            }
        }
    }
}

/**
 * 接收线程
 */
class myThread extends Thread{
    @Override
    public void run() {
        //对象
        DatagramSocket socket= null;
        try {
            socket = new DatagramSocket(8889);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        while (true) {
            //内容
            byte[] buff = new byte[1024 * 10];
            DatagramPacket packet = new DatagramPacket(buff, buff.length);
            //接收
            try {
                socket.receive(packet);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //数据
            int len = packet.getLength();//获取收到内容的长度
            String rs = new String(buff, 0, len);
            System.out.println("收到 " +packet.getSocketAddress().toString()+
                    ":"+ rs);
            if("再见".equals(rs)) {
                socket.close();
                break;
            }
        }
    }
}
  1. 客户端,类似的有:

public class clientP {
    public static void main(String[] args) throws Exception {
        System.out.println("客户端+++");

        Thread t=new myThreadC();//服务端接收线程
        t.start();

        //发送 对象
        DatagramSocket socket=new DatagramSocket();
        Scanner sc=new Scanner(System.in);
        while(true) {
            //内容
            String msg=sc.nextLine();

            byte[] buff = msg.getBytes();
            DatagramPacket packet = new DatagramPacket(buff, buff.length,
                    InetAddress.getLocalHost(), 8889);
            //接收
            socket.send(packet);
            if("再见".equals(msg)) {
                socket.close();
                System.out.println("断开连接~");
                break;
            }
        }
    }
}

/**
 * 接收线程
 */
class myThreadC extends Thread{
    @Override
    public void run() {
        //对象
        DatagramSocket socket= null;
        try {
            socket = new DatagramSocket(8888);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        while (true) {
            //内容
            byte[] buff = new byte[1024 * 10];
            DatagramPacket packet =  new DatagramPacket(buff, buff.length);
            //接收
            try {
                socket.receive(packet);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //数据
            int len = packet.getLength();//获取收到内容的长度
            String rs = new String(buff, 0, len);
            System.out.println("收到 " +packet.getSocketAddress().toString()+":"+ rs);
            if("再见".equals(rs)) {
                socket.close();
                break;
            }
        }
    }
}
  1. 至此我们实现了UDP互相发消息

java实现UDP及TCP通信

TCP通信

java中只要是使用java.net.Socket类实现通信,底层即是使用了TCP协议。

public Socket(String host , int port)​,创建发送端的Socket对象与服务端连接,参数为服务端程序的ip和端口。

方法:getOutputStream、getInputStream,分别是获得字节输出、输入流对象。

public ServerSocket(int port),注册服务端端口。

方法:accept,等待接收客户端的Socket通信连接,连接成功返回Socket对象与客户端建立端到端通信

具体来说,客户端发送实现:

  1. 创建客户端的Socket对象,请求与服务端的连接。

  1. 使用socket对象调用getOutputStream()方法得到字节输出流。

  1. 使用字节输出流完成数据的发送,发送一行内容就要flush。

  1. 释放资源:关闭socket管道。

            Socket socket=new Socket("127.0.0.1",6666);
            OutputStream os= socket.getOutputStream();
            PrintStream ps=new PrintStream(os);
            while(true) {
                ps.println("hello~");
                ps.flush();
            }

服务端接收:

  1. 创建ServerSocket对象,注册服务端端口。

  1. 调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象。

  1. 通过Socket对象调用getInputStream()方法得到字节输入流、完成数据的接收。

  1. 释放资源:关闭socket管道

            ServerSocket serverSocket=new ServerSocket(6666);            
            Socket socket=serverSocket.accept();           
            InputStream is=socket.getInputStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String msg;
            while((msg=br.readLine())!=null){
                System.out.println(socket.getRemoteSocketAddress()+" "+msg);
            }

先运行服务端,然后打开客户发送端,成功发送。

java实现UDP及TCP通信

TCP的B-S通信

要实现浏览器端的消息(浏览器显示服务端的内容),就要使得消息符合http响应数据协议格式:

java实现UDP及TCP通信
        System.out.println("***服务端***");
        try {
            //注册端口
            ServerSocket serverSocket=new ServerSocket(8080);
            while(true) {
                //接到一个socket管道
                Socket socket = serverSocket.accept();
                System.out.println(socket.getRemoteSocketAddress()+"访问了~");
                //新线程处理socket连接消息
                new serverReaderThread(socket).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

//处理进来的socket管道消息读取
public class serverReaderThread extends Thread {
    private Socket socket;
    public serverReaderThread(Socket socket){
        this.socket=socket;
    }

    @Override
    public void run() {
        try {
            PrintStream ps=new PrintStream(socket.getOutputStream());
            //HTTP
            ps.println("HTTP/1.1 200 OK");
            ps.println("Content-Type:text/html;charset=UTF-8");
            ps.println();

            ps.println("<span>hello </span>");
            ps.close();
        }catch (Exception e){
            System.out.println(socket.getRemoteSocketAddress()+"下线了~");
//            e.printStackTrace();
        }
    }
}

运行服务端后浏览器端就可以访问了。文章来源地址https://www.toymoban.com/news/detail-436047.html

java实现UDP及TCP通信

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

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

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

相关文章

  • 基于UDP/TCP的网络通信编程实现

    红色是心中永不褪色的赤诚 操作系统为网络编程提供了 Socket api , Socket是基于TCP/IP协议的网络通信的基本单元, 基于Socket的网络程序开发就是 网络编程. 由于直接与应用层联系的是传输层, 所以针对应用层协议(TCP, UDP), Shocket提供了三种套接字, 分别是 流套接字(使用TCP) , 数据报

    2024年02月08日
    浏览(55)
  • 基于python socket实现TCP/UDP通信

    两个应用程序如果需要进行通讯最基本的一个前提就是能够唯一的标示一个进程,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。能够唯一标示网络中的进程后

    2024年02月16日
    浏览(52)
  • Java网络编程之IP,端口号,通信协议(UDP,TCP)

    ① C/S :客户端/服务器 在用户本地需要下载安装客户端程序,在远程有一个服务器端程序。 优点:画面精美,用户体验好 缺点:用户需要下载更新 ② B/S :浏览器/服务器 只需要一个浏览器,用户通过指定网址访问对应的服务器。 优点:不需要开发客户端,只需要页面+服务

    2024年02月03日
    浏览(84)
  • 【Java 网络编程】网络通信原理、TCP、UDP 回显服务

    互联网从何而来? 这要追溯到上个世纪 50 - 60 年代,当时正逢美苏争霸冷战, 核武器 给战争双方提供了足够的威慑力,想要保全自己,就要保证自己的 反制手段 是有效的。 如何保证能够反击: 保存指挥机构 保存核弹头和发射井 指挥机构和核弹头之间的通信链路 需要保证

    2023年04月10日
    浏览(50)
  • 使用 python socket 实现UDP/TCP网络通信

    目录 目录 1.socket简介 2.创建socket 2.1创建UDPSocket 2.2创建TCPSocket 3.使用UDPSocket发送数据并接收 4.使用UDPSocket发送广播 5.UDPSocket聊天器 (多线程实现消息的收发功能) 6.使用TCPSocket建立客户端 7.使用TCPSocket建立服务端        socket(简称:套接字),是支持TCP和UDP(网络传输方式

    2023年04月10日
    浏览(65)
  • Socket套接字编程(实现TCP和UDP的通信)

      🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔 🦾🦾🦾 目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个🐒嘿嘿 谢谢

    2024年02月03日
    浏览(92)
  • socket概述 python中如何使用TCP/UDP协议实现通信-教程

    很多编程语言中,都 使用scoket套接字实现网络通信。 Socket是对TCP/IP协议的封装,Socket本身就是一个调用接口(API),方便程序员用Socket使用TCP/IP协议簇,实现网络通信。 不同编程语言,shiyongSocket通信的语法有所区别,但基本原理类型相似。 它的两种方式,分别是TCP和UDP协

    2024年02月13日
    浏览(42)
  • Java中网络的基本介绍。网络通信,网络,ip地址,域名,端口,网络通信协议,TCP/IP传输过程,网络通信协议模型,TCP协议,UDP协议

    - 网络通信 概念:网络通信是指 通过计算机网络进行信息传输的过程 ,包括数据传输、语音通话、视频会议等。在网络通信中,数据被分成一系列的数据包,并通过网络传输到目的地。在数据传输过程中,需要确保数据的完整性、准确性和安全性。常见的网络通信协议有T

    2024年02月10日
    浏览(71)
  • 什么是 TCP 和 UDP?Java 中如何实现 TCP 和 UDP 协议

    在计算机网络中,TCP(传输控制协议)和UDP(用户数据报协议)是两种最常用的传输层协议。它们都用于在网络上传输数据,但是它们之间有很多不同之处。本文将介绍TCP和UDP的基本概念,以及在Java中如何实现TCP和UDP协议。 TCP和UDP都是传输层协议,用于在网络上传输数据。

    2024年02月16日
    浏览(101)
  • 【Java】实现UDP通信

    🎈博客主页:🌈我的主页🌈 🎈欢迎点赞 👍 收藏 🌟留言 📝 欢迎讨论!👏 🎈本文由 【泠青沼~】 原创,首发于 CSDN🚩🚩🚩 🎈由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!🌠个人主页 TCP —传输控制协议,提供的是面向连接、

    2024年02月07日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包