前言
哥最近被一家叫做上海**网络科技有限公司的坑了,这个家伙经过哥鉴定,是假程序员,每年能赚钱,但总自称企业家,脸不红,真是可以的。所以在哥为了救他于水火中的那两个月中,彻底花力气搞定了Socket通信中那些坑。
那么下面我们就来讲讲,Socket中的那些坑和大家都懂的事情吧。

一、找到你的硬件 UDP
找到你的硬件是件不容易的事情,所以你最好一上来广播一下,然后设备要是收到特定的字符串,然后直接返回一下自己的IP地址就可以了(这招特别常见,所以大家不要顾虑是不是会有泄露别人协议或者得坐牢的风险。妈蛋地你不用这招,你能用哪招?!那么常见的招,还要算什么狗屁只知识产权,就真TMD无语了)。

【Android】

//发起一个UDP
    public void connectServerWithUDPSocket(String IP,int PORT,String message,String type) {
        DatagramSocket socket_send;
        try {
            //创建DatagramSocket对象并指定一个端口号,注意,如果客户端需要接收服务器的返回数据,
            //还需要使用这个端口号来receive,所以一定要记住
            socket_send = new DatagramSocket(PORT);
            //使用InetAddress(Inet4Address).getByName把IP地址转换为网络地址
            InetAddress serverAddress = InetAddress.getByName(IP);
            //Inet4Address serverAddress = (Inet4Address) Inet4Address.getByName("192.168.1.32");
            String str = message;//设置要发送的报文
            byte data[] = str.getBytes();//把字符串str字符串转换为字节数组
            //创建一个DatagramPacket对象,用于发送数据。
            //参数一:要发送的数据  参数二:数据的长度  参数三:服务端的网络地址  参数四:服务器端端口号
            DatagramPacket packet = new DatagramPacket(data, data.length ,serverAddress ,48899);
            socket_send.send(packet);//把数据发送到服务端。
            flag=1;
            System.out.println("发送成功");
            socket_send.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

//接受UDP的广播返回
    public void ReceiveServerSocketData(int PORT,String type) {
            DatagramSocket socket_receive;
            try {

                System.out.println("开始接收");
                //实例化的端口号要和发送时的socket一致,否则收不到data
                socket_receive = new DatagramSocket(PORT);
                byte data[] = new byte[4 * 1024];
                //参数一:要接受的data 参数二:data的长度
                DatagramPacket packet = new DatagramPacket(data, data.length);
                int sr = 1;

                    while (sr == 1) {
                        socket_receive.receive(packet);
                        System.out.println("接受中……");
                        alertUdp = (TextView) findViewById(R.id.alertUDP);
                        alertUdp.setVisibility(View.GONE);
                        break;
                    }
                    //把接收到的data转换为String字符串
                    String result = new String(packet.getData(), packet.getOffset(), packet.getLength());
                    socket_receive.close();//不使用了记得要关闭
                    System.out.println("the number of reveived Socket is  :" + flag + " udpData:" + result);
                    if (type.equals("Start")) {
                        String[] result_arr = result.split(",");
                        SERVER_IP = result_arr[0];
                        System.out.println("新SERVER_IP:" + SERVER_IP);
                    } else if (type.equals("F0")) {
                    } 
//                A1
                    }else if (type.equals("G5")){
                        renew_v();
                        System.out.println(wifi_udp);
                        new AlertDialog.Builder(MyActivity.this)
                                .setTitle("收到G5的信息返回")
                                .setMessage("弹出一个警告框 告知大家内容")
                                .setPositiveButton("我知道了", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        System.exit(0);
                                    }
                                })
                                .show();

                    }else if (type.equals("G0")){
                        wifi_udp=0;
                    }
                    if (result.equals("...某指定内容...如果要计数时使用...")){
                        wifi_udp++;
                    }
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }

【iOS】
(待续...)

================
哥有点不想写了,至于后面的,哥为了避免法律纠纷,在代码中把相关的一些变量给删除一下下,然后直接搞个百度云盘挂出来,欢迎大家学习和交流。

百度云盘链接:http://pan.baidu.com/s/1c0fBDQg

哥电话是15201950688。

欢迎在上海的朋友交流一下下,另注:哥只提供代码上的指导,不提供关于协议部分的指教,那个是人家的写的,不是哥写的,哥自己过段时间也会自己拟一套,一定改三处以上不同,保证改三百处不一样,那TMD就是套新的,呵呵。

最后同那个坑人的人说一句:哥比你有节操,哥的代码属于全人类,你用了哥不介意,但是你赚昧良心的钱,还理直气壮,就不对了,哥在这里批评你这个70后一下,顺便替上海交通大学MBA那种提个醒,以后招生的时候,麻烦长个心眼,今年哥是第二次被你们家的学生坑到了。


夏力维
55 声望7 粉丝

自由哲学家&创业者