安卓UDP通信
天冷了,躺在被窝里看电影是我等屌丝一个不错的选择,可是问题来了,下床是一件很痛苦的事情,该怎样关笔记本呢?好吧,就是这个题目了。
Android udp通信和其他的基本上无区别,一运行程序就崩溃,一下又找不到原因http://bbs.csdn.net/topics/390141935
所以在onCreate() 里加入下面语句, StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()
.build());
这样就可以正常发送udp数据了。
package com.example.udpandroid;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity{
publicstatic Button press;
publicstatic boolean flag;
private static final int MAX_DATA_PACKET_LENGTH = 40;
private byte[] buffer = new byte[MAX_DATA_PACKET_LENGTH];
privateDatagramPacket dataPacket;
private DatagramSocket udpSocket;
/** Called when the activity is first created. */
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()
.build());
press = (Button)findViewById(R.id.btn);
flag = false;
try
{
udpSocket = new DatagramSocket(5554);
}
catch (SocketException e)
{
// TODO Auto-generated catchblock
e.printStackTrace();
}
dataPacket = new DatagramPacket(buffer, MAX_DATA_PACKET_LENGTH);
dataPacket.setPort(8888);
try
{
InetAddress broadcastAddr =InetAddress.getByName("192.168.1.100");
dataPacket.setAddress(broadcastAddr);
}
catch (IOException e)
{
// TODO Auto-generated catchblock
e.printStackTrace();
}
press.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v)
{
CharSequencestr ="proweroff";
byte out[] =str.toString().getBytes();
dataPacket.setData(out);
dataPacket.setLength(out.length);
try
{
InetAddress broadcastAddr = InetAddress.getByName("192.168.1.100");
dataPacket.setAddress(broadcastAddr);
if(udpSocket != null)
{
udpSocket.send(dataPacket);
Toast.makeText(MainActivity.this, "正在关机中...\n可是您还得下床合上笔记本\n"
+ "唉",Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(MainActivity.this, "您点击了按钮", Toast.LENGTH_SHORT).show();
}
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
C++服务器端 vc6
#include<stdio.h>
#include<windows.h>
#include <string.h>
void main()
{
//mide delete word
WORD wVersionRequested;
int err;
WSADATAwsaData;
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0){
return;
}
if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wHighVersion)!=2)
{
WSACleanup();
return ;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr =htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(8888);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[10];
while(1)
{
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
recvBuf[9]='\0';
printf("%s\n",recvBuf);
if(strcmp(recvBuf,"proweroff")== 0)
{
//system("shutdown-p");//关机
printf("youare now");
}
}
//while(1);
closesocket(sockSrv);
WSACleanup();
}
可以通信了!