Socket和DatagramSocket的区别[通俗易懂]

Socket和DatagramSocket的区别[通俗易懂]简而言之就是:Socket使用的tcp连接,需要先连接之后才能发送数据。DatagramSocket使用的UDP连接,客户端不需要先连接数据,可以直接发送给指定服务端。DatagramSocket:客户端发送(直接发送数据,没有连接的过程):protectedvoidconnectServerWithUDPSocket(Contextcontext,Stringid…

大家好,又见面了,我是你们的朋友全栈君。

简而言之就是:

Socket使用的tcp连接,需要先连接之后才能发送数据。

DatagramSocket使用的UDP连接,客户端不需要先连接数据,可以直接发送给指定服务端。

DatagramSocket:

客户端发送(直接发送数据,没有连接的过程):

protected void connectServerWithUDPSocket(Context context, String id) {
        DatagramSocket socket;
        try {
            //创建DatagramSocket对象并指定一个端口号,注意,如果客户端需要接收服务器的返回数据,
            //还需要使用这个端口号来receive,所以一定要记住
            socket = new DatagramSocket(null);
            //使用InetAddress(Inet4Address).getByName把IP地址转换为网络地址
            InetAddress serverAddress = null;
            mHost = Utils.getLocalIpStr(context);
            Log.d(TAG, "connectServerWithUDPSocket mHost =" + mHost);
            if (null == mHost) return;
            try {
                serverAddress = InetAddress.getByName(mHost);
            } catch (UnknownHostException e) {
                Log.d(TAG, "未找到服务器");
                e.printStackTrace();
            }
            //Inet4Address serverAddress = (Inet4Address) Inet4Address.getByName("192.168.1.32");
            String str = id;//设置要发送的报文
            byte data[] = str.getBytes();//把字符串str字符串转换为字节数组
            //创建一个DatagramPacket对象,用于发送数据。
            //参数一:要发送的数据  参数二:数据的长度  参数三:服务端的网络地址  参数四:服务器端端口号
            DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, PORT);
            try {
                socket.send(packet);//把数据发送到服务端。
            } catch (IOException e) {
                Log.d(TAG, "发送失败");
                e.printStackTrace();
            }
            Log.d(TAG, "socket.send------------------------");
        } catch (SocketException e) {
            Log.i(TAG, "建立接收数据报失败");
            e.printStackTrace();
        }
    }

服务端接收:

public void serverReceviedByUdp() {
        //创建一个DatagramSocket对象,并指定监听端口。(UDP使用DatagramSocket)
        DatagramSocket socket;
        try {
            socket = new DatagramSocket(PORT);
            //创建一个byte类型的数组,用于存放接收到得数据
            byte data[] = new byte[4 * 1024];
            //创建一个DatagramPacket对象,并指定DatagramPacket对象的大小
            DatagramPacket packet = new DatagramPacket(data, data.length);
            while (true) {
                //读取接收到得数据
                socket.receive(packet);
                //把客户端发送的数据转换为字符串。
                //使用三个参数的String方法。参数一:数据包 参数二:起始位置 参数三:数据包长
                String result = new String(packet.getData(), packet.getOffset(), packet.getLength());
                Log.d(TAG, "service result = " + result);
                
            }

        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Socket:

服务端:

public class TcpServer {
    private static ServerSocket serverSocket;
    private static Socket socket;

    public static void startServer(){
        if (serverSocket == null){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        serverSocket = new ServerSocket(8080);
                        Log.i("tcp" , "服务器等待连接中");
                        socket = serverSocket.accept();
                        Log.i("tcp" , "客户端连接上来了");
                        InputStream inputStream = socket.getInputStream();
                        byte[] buffer = new byte[1024];
                        int len = -1;
                        while ((len = inputStream.read(buffer)) != -1) {
                            String data = new String(buffer, 0, len);
                            Log.i("tcp" , "收到客户端的数据-----------------------------:" + data);
                            EventBus.getDefault().post(new MessageServer(data));
                        }
                    } catch (IOException e) {
                        e.printStackTrace();

                    }finally {
                        try {
                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        try {
                            serverSocket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        socket = null;
                        serverSocket = null;
                    }
                }
            }).start();
        }
    }

    public static void sendTcpMessage(final String msg){
        if (socket != null && socket.isConnected()) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        socket.getOutputStream().write(msg.getBytes());
                        socket.getOutputStream().flush();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
}

客户端(这边需要先连接服务端之后,才能发送数据):

public class TcpClient {

    public static Socket socket;

    public static void startClient(final String address ,final int port){
        if (address == null){
            return;
        }
        if (socket == null) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Log.i("tcp", "启动客户端");
                        socket = new Socket(address, port);
                        Log.i("tcp", "客户端连接成功");
                        PrintWriter pw = new PrintWriter(socket.getOutputStream());

                        InputStream inputStream = socket.getInputStream();

                        byte[] buffer = new byte[1024];
                        int len = -1;
                        while ((len = inputStream.read(buffer)) != -1) {
                            String data = new String(buffer, 0, len);
                            Log.i("tcp", "收到服务器的数据---------------------------------------------:" + data);
                            EventBus.getDefault().post(new MessageClient(data));
                        }
                        Log.i("tcp", "客户端断开连接");
                        pw.close();

                    } catch (Exception EE) {
                        EE.printStackTrace();
                        Log.i("tcp", "客户端无法连接服务器");

                    }finally {
                        try {
                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        socket = null;
                    }
                }
            }).start();
        }
    }

    public static void sendTcpMessage(final String msg){
        if (socket != null && socket.isConnected()) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        socket.getOutputStream().write(msg.getBytes());
                        socket.getOutputStream().flush();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }

 

 

参考:

https://blog.csdn.net/qq_29634351/article/details/81458915

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131866.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于DNS的全局负载均衡(GSLB)详解(下篇)[通俗易懂]

    基于DNS的全局负载均衡(GSLB)详解(下篇)[通俗易懂]基于DNS的全局负载均衡(GSLB)详解(下篇)前言基于DNS的流量调度和宕机切换流量负载方式DNS流量调度准确性健康检查和宕机切换基于DNS的混合流量负载(调度)前言上篇我们介绍了DNS流量负载和容灾切换功能的意义如果你想了解DNS访问的整个流程,可以先查看DNS的基本原理(可查看文章DNS原理及解析过程详解)。对于更好地讲解全局流量负载有所帮助。基于DNS的流量调度和宕机切换流量负载…

    2022年6月1日
    67
  • android调用js方法

    android调用js方法

    2021年9月30日
    42
  • 微信看一看有访客记录吗_微信到底能不能看访客

    微信看一看有访客记录吗_微信到底能不能看访客这个访客神器,不仅可以看到多少人看了你的朋友圈。还可以知道他们是谁,看了多久…

    2022年9月18日
    2
  • 重装系统error16_error怎么解决

    重装系统error16_error怎么解决 初看这个错误,让我有点头大,因为我用客户端调用,它竟然告诉我服务器拒绝接收.上网上看了很多资料(90%是英文).各说其词,结果还是无果而终.终于功夫不负有心人,终于在不经意间看到了一个老外的陈词: packagecn.sss_grid.mis.action.gydq.service.client;//importcom.sss.util.JDom;importjava.

    2025年11月6日
    4
  • intellij idea安装步骤2019.3_IDEA java

    intellij idea安装步骤2019.3_IDEA java1.右键点击压缩包—解压到当前文件夹2.右键点击安装包—以管理员身份运行3.选择相应的安装目录,最好不要存在中文4.选择操作系统类型5.打开之前解压后得到的文件夹,点击HostsEdit文件6.在文章末尾添加0.0.0.0account.jetbrains.com和0.0.0.0www.jetbrains.com7.双击打开IDEA,选择第二项8.选择…

    2022年10月2日
    2
  • 图神经网络(GNN)的简介「建议收藏」

    近年来,图神经网络(GNN)在社交网络、知识图、推荐系统甚至生命科学等各个领域得到了越来越广泛的应用。GNN在对图节点之间依赖关系进行建模的强大功能,使得与图分析相关的研究领域取得了突破。本文介绍了图神经网络的基本原理,以及两种高级的算法,DeepWalk和GraphSage。图(Graph)在讨论GNN之前,我们先来了解一下什么是图。在计算机科学中,图是由顶点和边两部分组成的一种数据结构…

    2022年4月18日
    222

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号