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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Sqlite #1 命令行工具sqlite3

    Sqlite #1 命令行工具sqlite3

    2021年9月3日
    61
  • java interface 里面的抽象方法默认public[通俗易懂]

    java interface 里面的抽象方法默认public[通俗易懂]①interface里声明的方法,会自动在方法名之前加上publicabstract②interface里声明的field,会自动在field之前加上publicstaticfinal这是因为,interface存在的目的就是要和外界公开如要在别的类里,实现interface里面的,抽象方法。这个方法的修饰符,也一定要public.也就是说,不能用比public还要受限制的修饰符。…

    2022年10月7日
    0
  • mybaits入门(含实例教程和源码)

    mybaits入门(含实例教程和源码)

    2020年11月12日
    165
  • 200 : parsererror错误

    200 : parsererror错误原因ajax请求中返回data,与controller中requestMapping方法返回类型不一致导致,或者controller中方法无返回值即void,都可引起该错误。

    2022年6月23日
    28
  • 微信开放平台 获取用户信息(微信公众号获取用户列表时间)

    前言:初次尝试微信公众号的开发,对于学习方法的探索都是来源于网上的博客、问答,对于参差不齐的信息,自己也是有苦说不出,抽出一点时间写点文章,既是对自己的学习总结,也希望给予同是菜鸟的学渣一点帮助背景介绍:我需要用户接收微信分享的链接后,点击进入给参加活动的用户【点赞】,然后需要后台获取该微信用户的openid作为唯一的标记信息,以便保证该用户下次进入后进行数据库的比对,直接提取其对应的操作信息…

    2022年4月12日
    49
  • 雅虎优化和排名技术

    雅虎优化和排名技术关于YAHOO优化和排名技术基础.把页面本身优化好,就能在Yahoo中取得很好的排名,而这些页面优化都是自己可以控制的,所以说Yahoo优化比Google优化更容易,所用时间更短,特别是对于热门关键词,两者的区别更明显。从另一个角度来说,能把Google优化好的人,不一定水平有多高,可能只不过是手头有较多的链接资源可以利用;若服务期过了以后,把指向你的链接一撤,你的排名就会掉下来。而若能把Yaho

    2022年7月13日
    11

发表回复

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

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