android设备与pc端通过UDP通信

这段时间公司在做关于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;

}

本人初学,如有不对的地方,请指正,谢谢了

猜你喜欢

转载自blog.csdn.net/yangchanghong1995/article/details/80232354