专栏首页Java旅途手撸实现UDP和TCP通信

手撸实现UDP和TCP通信

UDP

UDP是一种面向无连接的协议,因此传输过程中不能保证数据的完整性。jdk提供了网络通信包,在java.net包下提供了两个类DatagramPacket和DatagramSocket来实现UDP通信。这两个类可以这样理解,DatagramSocket是路,DatagramPacket路上装有人的车。也就是DatagramSocket决定了通信目标,DatagramPacket则代表封装好的数据。

UDP的特性决定了UDP协议的应用场景,在我身边最常见的应用场景就是物联网设备与服务端的通信。

UDPClient实现

public class UDPClient {
    public static void main(String[] args) throws Exception {
           byte[] data = "我是客户端,我发送了一条消息".getBytes();
        InetAddress address = InetAddress.getByName("localhost");
        DatagramPacket packet = new DatagramPacket(data,data.length,address,8888);
        DatagramSocket socket = new DatagramSocket();
        socket.send(packet);

        byte[] message = new byte[1024];
        DatagramPacket packet1 = new DatagramPacket(message,message.length);
        socket.receive(packet1);
        String replyContent = new String(message,0,message.length);
        System.out.println("UDPClient 接收到了消息:"+replyContent);
        socket.close();
    }
}

UDPServer实现

public class UDPServer {
    public static void main(String[] args) throws Exception {
         DatagramSocket socket = new DatagramSocket(8888);
        byte[] data = new byte[1024];
        DatagramPacket packet = new DatagramPacket(data,data.length);
        socket.receive(packet);
        String message = new String(data,0,packet.getLength());
        System.out.println("UDPServer 接收到了消息:"+message);

        InetAddress address = packet.getAddress();
        int port = packet.getPort();
        byte[] replyContent = "我是服务端,我回复了一条消息".getBytes();
        DatagramPacket packet1 = new DatagramPacket(replyContent, replyContent.length, address, port);
        socket.send(packet1);
        socket.close();
    }
}

TCP

TCP是一种面向连接的服务,经过三次握手建立连接,通过传输字节流的方式进行通信。因此可以保证消息的完整性。同样,在java.net包下也提供了两个包Socket和ServerSocket来实现TCP通信。

TCPClient

public class TCPClient {

    public static void main(String[] args) throws Exception {

        Socket socket = new Socket("localhost",8081);
        DataOutputStream out = new DataOutputStream(socket.getOutputStream());
        String data = "我是客户端,我发了一条消息";
        out.writeUTF(data);

        DataInputStream in = new DataInputStream(socket.getInputStream());
        String message = in.readUTF();
        System.out.println("TCPClient:"+message);
        socket.close();
    }
}

TCPServer

public class TCPServer {

    public static void main(String[] args) throws Exception{
        ServerSocket serverSocket = new ServerSocket(8081);
        Socket socket = serverSocket.accept();
        DataInputStream in = new DataInputStream(socket.getInputStream());
        String message = in.readUTF();
        System.out.println("TCPServer:"+message);

        DataOutputStream out = new DataOutputStream(socket.getOutputStream());
        out.writeUTF("我是服务器,我回复了一条消息");
        socket.close();
        serverSocket.close();
    }
}

本文分享自微信公众号 - Java旅途(Javatrip),作者:Java旅途

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • API接口设计规范

    说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法...

    Java旅途
  • rabbitmq系列(三)消息幂等性处理

    我们启动生产者,然后请求send接口,然后打开rabbitmq控制台发现多了一个名为”byte-zb“的交换机和队列,并且队列中出现了一个未消费的消息,然后启动...

    Java旅途
  • Spring Boot读取配置文件的几种方式

    Spring Boot获取文件总的来说有三种方式,分别是@Value注解,@ConfigurationProperties注解和Environment接口。这三...

    Java旅途
  • Python实现HMACSHA1生成加密签名

    按key升序,key不为sign,value不为空时,把key和value拼装成x=a&y=b格式,然后使用HmacSHA1算法生成签名。

    橙子探索测试
  • JDK14中record实践尝鲜

    他来了他来了,不好意思, 他来晚了. 大家好, 我是小刀,前几天看到朋友圈被jdk14的GA版本刷屏了,我一直忍到现在才写,,,唉,实在是惭愧惭愧.

    微笑的小小刀
  • Python监视进程创建情况和系统服务状态

    (1)监视Windows系统中进程创建情况 import wmi c = wmi.WMI() process_watcher = c.Win32_Proce...

    Python小屋屋主
  • 小朋友学Java(5):静态方法

    先编写程序: class Demo { public void fun1() { System.out.println("Hello")...

    海天一树
  • C++核心准则:R.10: 避免使用malloc()和free()

    malloc() and free() do not support construction and destruction, and do not mix ...

    面向对象思考
  • 在Actframework中使用依赖注入

    老码农
  • 一分钟理解Java公平锁与非公平锁

    和朋友聊天他提到:ReentrantLock 的构造函数可以传递一个 bool 数据,true 时构造的是“公平锁”、false 时构造的是“非公平锁”。我的印...

    李红

扫码关注云+社区

领取腾讯云代金券