0: 首先是服务端,界面上面只有一个button,发送广播
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="androidstudio.kodulf.socketfinddemo.MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送广播"
android:id="@+id/send"/>
</RelativeLayout>
清单文件需要添加的权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
MainActivity:
package androidstudio.kodulf.socketfinddemo;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
/*发送广播端的socket*/
private MulticastSocket ms;
/*发送广播的按钮*/
private Button sendUDPBrocast;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
}
/*初始化参数*/
public void init() {
setContentView(R.layout.activity_main);
sendUDPBrocast = (Button) findViewById(R.id.send);
sendUDPBrocast.setOnClickListener(new SendUDPBrocastListener());
try {
/*创建socket实例*/
ms = new MulticastSocket();
} catch (Exception e) {
e.printStackTrace();
}
}
private String intToIp(int i) {
return (i & 0xFF ) + "." +
((i >> 8 ) & 0xFF) + "." +
((i >> 16 ) & 0xFF) + "." +
( i >> 24 & 0xFF) ;
}
/**
* 单击按钮时,发送局域网广播
* */
class SendUDPBrocastListener implements View.OnClickListener {
@Override
public void onClick(View v) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//发送的数据包,局网内的所有地址都可以收到该数据包
DatagramPacket dataPacket = null;
/*创建socket实例*/
try {
ms = new MulticastSocket();
} catch (IOException e) {
e.printStackTrace();
}
try {
ms.setTimeToLive(4);
//将本机的IP(这里可以写动态获取的IP)地址放到数据包里,其实server端接收到数据包后也能获取到发包方的IP的
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String formatedDate = format.format(date);
// InetAddress localhost = InetAddress.getByName("localhost");
// String hostAddress = localhost.getHostAddress();
// String sendData = hostAddress +formatedDate;
//获取wifi服务
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
//判断wifi是否开启
if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
}
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ip = intToIp(ipAddress);
String sendData=ip+formatedDate;
// byte[] data = "192.168.1.109".getBytes();
byte[] data = sendData.getBytes();
//224.0.0.1为广播地址
InetAddress address = InetAddress.getByName("224.0.0.1");
//这个地方可以输出判断该地址是不是广播类型的地址
System.out.println(address.isMulticastAddress());
dataPacket = new DatagramPacket(data, data.length, address,
8003);
ms.send(dataPacket);
ms.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
}
}
1:客户端,只有一个显示结果的
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="androidstudio.kodulf.client.MainActivity">
<TextView
android:id="@+id/result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
清单文件需要申请的权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
MainActivity:
package androidstudio.kodulf.client;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class MainActivity extends AppCompatActivity implements Runnable{
private MulticastSocket ds;
String multicastHost="224.0.0.1";
InetAddress receiveAddress;
TextView result;
String beforeResult;
Handler mHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return false;
}
});
result =(TextView)findViewById(R.id.result);
try {
ds = new MulticastSocket(8003);
receiveAddress=InetAddress.getByName(multicastHost);
ds.joinGroup(receiveAddress);
new Thread(this).start();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
byte buf[] = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, 1024);
while (true) {
try {
ds.receive(dp);
//Toast.makeText(this, new String(buf, 0, dp.getLength()), Toast.LENGTH_LONG);
String x = "client ip : " + new String(buf, 0, dp.getLength())+"\n";
beforeResult = beforeResult+x;
System.out.println(x);
mHandler.post(new Runnable() {
@Override
public void run() {
result.setText(beforeResult);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
参考:
http://blog.youkuaiyun.com/yunjinwang/article/details/8125524

这篇博客详细介绍了如何在Android平台上实现内网环境下的UDP和Socket通信。通过一个简单的服务端应用,该应用包含一个发送广播的按钮,以及一个客户端应用,用于接收和显示通信结果。参考了相关优快云文章进行实现。
764

被折叠的 条评论
为什么被折叠?



