前言
哥最近被一家叫做上海** 网络科技有限公司的 坑了,这个家伙经过哥鉴定,是假程序员,每年能赚钱,但总自称企业家,脸不红,真是可以的。所以在哥为了救他于水火中的那两个月中,彻底花力气搞定了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那种提个醒,以后招生的时候,麻烦长个心眼,今年哥是第二次被你们家的学生坑到了。