默认
发表评论 12
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
小白初学im入门1(基于java)
阅读(51380) | 评论(12 收藏2 淘帖 2
受到警告
本人后期转学的java。文笔不好 代码很菜。喜欢开发并喜欢im。
网站版主大佬有从零学im一篇就够 但是我感觉有很多东西基础的小白不知道,我想从我的实际出发写一篇im开大基础文章系列 这是第一片 希望各位大牛不要笑,都有从零开始的时候,作为自己的笔记 同时与大家分享。
文章代码全是基于java(代码demo我尽量写的很简单 而且注释每一步都会写的很明白把阻塞点 包括各个注意事项都会写到 也正因为是一点点写所以更新比较慢 因为要测试 经理不出错 当然bug少不了的。希望大家指证共同学习)
===============================================================华丽的分割线
1、协议开始(吐槽为啥就是理论和什么垃圾协议 放心我都会举例子,一定让大家都懂)
              在国际上有各种各样的规定,当然互联网肯定是有的   osi模型和tcp/ip大家都知道  也有对应关系 tcp/ip中把osi上三层封装为应用层 下两层封装为主机至网络层 最关心的就是网络层(简单理解为ip)和传输层(简单理解为端口)。
其中javaweb 方面 其实是应用层开发 而大家所学习的java socket 是网络层和传输层(所有的语言都叫socket 当然这里是我所知道的)

2、网络通讯的要素
            ip地址(就跟快递一样 我要和你通讯我必须知道你在哪里)
            端口(类似什么程序显示  我要给你东西 是从门口 还是窗户 还是别的方式)
           传输协议:国际上有两种定义好的  tcp和udp 这个大家都知道了  大家常说的QQ是udp其实可以这么说但是肯定是有区别的。比如QQ的离线消息能保存7天等等具体的区别以后慢慢道来  

3、socket是tcp udp的软件抽象 把tcp和udp隐藏在后面 所以代码之间网络传输就是socket的之间的通讯。(socket可以想想成插座 两天电脑一连接上就能通讯了)所以说我们就是关注socket之间的通讯
下面是java实现的udp的的代码 从代码我们根本看不到用的是udp还是tcp  其实在我们使用的时候已经有不同的api方法多tcp和udp进行了封装,所以网络通信是socket的通讯。

很多时候当遇到tcp、udp和socket的关系的时候看到网上的解释都不太明确 所以这里进行一个简单啊的小总结

4、ip地址和子网掩码的关系
如果ip是
        192.168.1.222
子网掩码
        如果子网掩码是255.255.0.0那么192.168是网络位  1.222是主机地址
        
        如果255.255.255.0

        那么192.168.1是网络地址 222是主机地址 那么这个子网掩码可以放从1~254台主机 就是254台电脑
        192.168.1.0是网络地址 192.168.1.255最后这个ip是广播地址
        (如果发送信息到192.168.1.12那么只有折腾主机能收到如果发送到255 那么这个网络段的所有主机都能收到)(这里网络群聊或者说世界频道 这个区别与QQ群或者其他聊天软件的群聊 因为那个是应用层 我们现在说的是传输层和网络层)

我自己电脑的图片
小白初学im入门1(基于java)_小白初学im入门1(基于java)
===================================说再多还是上代码更清楚(udp的简单demo)=================================
从下面代码可以看出 socket已经对udp进行了封装 不用管底层的协议 所以网络通讯就是socket的通讯。
以下代码是基于java的udp通讯。纯udp  区别QQ  先启动那个都可以 因为是阻塞式的。参见java.net包
              public class UDPSendDemo {
                public static void main(String[] args) throws IOException {
                        /*
                         * 需求:建立udp的发送端
                         * 1、建立可以实现udp传输的socket服务
                         * 2、明确具体发送的数据
                         * 3、通过socket服务讲具体的数据发送出去
                         * 4、关闭服务
                         * */
                        //1、创建udp服务
                        DatagramSocket ds = new DatagramSocket();//(这里没有制定端口号,发送端为随机端口)
                        //2、明确发送数据
                        String str="这是udp";
                        //3、发送数据 讲数据封装到数据包中(DatagramPacket)在这个对象的构造函数中带ip和端口的是发送的数据包不带的是接收的数据包
                                //3.1数据封装到数据包对象中。数据包会明确目的地址和端口
                        byte[] buf = str.getBytes();
                        DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName(""), 10000);
                                //3.2发送
                        ds.send(dp);
                        //4关闭
                        ds.close();
                }

--------------------------------------------------------------------------------------------------------
public class UDPReceDemo {

        public static void main(String[] args) throws IOException {
                // TODO Auto-generated method stub
                /*
                 * 创建udp的接收端
                 * 思路
                 *          1、创建socket服务。明确一个端口
                 *          2、收数据
                 *          3、将其中所需要的数据取出来 ip data 端口
                 * */
                //1创建socket服务
                DatagramSocket ds =new DatagramSocket(10000);
               
                //使用socket的接收方法.接收数据。需要将收到的数据存储到数据包中
                //可以通过数据包对象的方法对收到的数据进行解析
                        //2.1创建数据包
                byte[] buf =new byte[1024];
                        DatagramPacket dp =new DatagramPacket(buf, buf.length);
                ds.receive(dp);//阻塞式方法(收不到信息会阻塞在这里)
                //3通过数据包对象解析收到的数据,使用数据包的方法
                String ip=dp.getAddress().getHostAddress();
                int  port =dp.getPort();
                //获取文字数据
                String str=new String(dp.getData(),0,dp.getLength());
                System.out.println(ip+"==="+port+"==="+str);
                //关闭资源
                ds.close();
        }

}

====================================我们从代码可以看到udp的特点
分两端 一端是接收端 一段是发送端(这一点特别重要很明显的区别于tcp  这两端先启动那一端都可以
其他特点(代码感觉不到  因为这是socket java的上层封装)
无连接的方式
相对tcp要快
数据支持64kb
因为无连接不保证数据的完整性和顺序等特点
下一章节将用udp写一个局域网群聊的小demo。




即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:关于IM即时通讯群聊消息的乱序问题讨论下一篇:小白初学im入门1外传系统资源(基于java)
推荐方案
评论 12
很好很好,支持分享!
等逻辑清楚后,文章格式再慢慢调整。
作为小白的我 来捧个场  ~(。≧3≦)ノ⌒☆
引用:小平 发表于 2018-03-08 13:57
作为小白的我 来捧个场  ~(。≧3≦)ノ⌒☆

大佬太笑话了 我慢慢学习中  我会努力提高自己的帖子的质量的
签名: 好久不来了 现在不忙了 好好学习
引用:奶瓶 发表于 2018-03-08 14:22
大佬太笑话了 我慢慢学习中  我会努力提高自己的帖子的质量的

慢慢来,抽空你在灌水区里练练手,把帖子格式捣鼓捣鼓。
好的文字,一定要好的阅读体验,加油!
纯正小白过来捧场。
期待下一篇。
引用:okh258 发表于 2018-03-10 15:09
纯正小白过来捧场。
期待下一篇。

又活捉小白一枚
引用:JackJiang 发表于 2018-03-10 16:54
又活捉小白一枚

来这打酱油有段时日了,准备找个时间来抱你叉开的大腿。
楼主加油!

楼主已经改行当老师了。。 已经成功从入门到放弃了。
引用:JackJiang 发表于 2019-12-19 23:25
楼主已经改行当老师了。。 已经成功从入门到放弃了。

好出路,可以让他写一个当老师的入门教程,给大家瞅瞅怎么脱坑的
引用:JackJiang 发表于 2019-12-19 23:25
楼主已经改行当老师了。。 已经成功从入门到放弃了。

现在已经到了自己实验室的时间了
签名: 好久不来了 现在不忙了 好好学习
引用:奶瓶 发表于 2020-04-21 08:39
现在已经到了自己实验室的时间了

现在是事业编制了?
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部