这段时间公司在做关于android设备与电脑端通信,让我负责android端,android只学了几个月,压力很大啊 ,只能硬着头皮去做了。
通过UDP方式 android接收pc的发来的信息:
service类 后台运行:
package com.analysisxml.ych.udp_clent.service; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException; public class UdpReceiverService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("tag","进入service"); new Thread() { public void run() { while (true) { try { DatagramSocket dgSocket = null; int port = 3779; if (dgSocket == null) { dgSocket = new DatagramSocket(null); dgSocket.setReuseAddress(true); dgSocket.bind(new InetSocketAddress(port)); } byte[] by = new byte[1024]; DatagramPacket packet = new DatagramPacket(by, by.length); dgSocket.receive(packet); String str = new String(packet.getData(), 0, packet.getLength()); System.out.println("接收到的数据为:" + str); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } }.start(); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy () { // TODO Auto-generated method stub super.onDestroy(); } }
写完该类后,在清单文件中加入权限:
<uses-permission android:name="android.permission.INTERNET" />
注册service:
<service android:name=".service.UdpReceiverService" android:enabled="true" android:exported="true"/>
android启动类:
package com.analysisxml.ych.udp_clent; import android.annotation.SuppressLint; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.Window; import com.analysisxml.ych.udp_clent.service.UdpReceiverService; public class MainActivity extends AppCompatActivity { @SuppressLint("WrongConstant") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); Intent intent=new Intent(this,UdpReceiverService.class); Log.v("WANGRUI", "准备启动service..............."); startService(intent); Log.v("WANGRUI", "开启service..............."); } @Override protected void onDestroy() { super.onDestroy(); Log.v("WANGRUI", "stopservice 被调用。。。。。。。。。"); stopService(new Intent("com.reciver1.rc")); } ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.e("tag","service连接成功"); } @Override public void onServiceDisconnected(ComponentName name) { Log.e("tag","service连接失败"); } }; }
pc端发送信息(通过vs2015编写)
#include "stdafx.h"
#include <WinSock2.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
const int MAX_BUF_LEN = 255;
int main(int argc, _TCHAR* argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
// 启动socket api
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return -1;
}
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2)
{
WSACleanup();
return -1;
}
// 创建socket
SOCKET connect_socket;
connect_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (INVALID_SOCKET == connect_socket)
{
err = WSAGetLastError();
printf("error! error code is %d/n", err);
return -1;
}
SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(3779);
sin.sin_addr.s_addr = INADDR_BROADCAST;
bool bOpt = true;
//设置该套接字为广播类型
setsockopt(connect_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt));
int nAddrLen = sizeof(SOCKADDR);
char buff[MAX_BUF_LEN] = "hhh";
int nLoop = 0;
while (1)
{
nLoop++;
printf(buff, "%8d", nLoop);
// 发送数据
int nSendSize = sendto(connect_socket, buff, strlen(buff), 0, (SOCKADDR*)&sin, nAddrLen);
if (SOCKET_ERROR == nSendSize)
{
err = WSAGetLastError();
printf("error!, error code is %d/n", err);
return -1;
}
printf("杨昌宏/n", buff);
Sleep(1000);
}
return 0;
}
本人初学,如有不对的地方,请指正,谢谢了