开发步骤分为以下几点:
1.在 AndroidManifest 中声明相关权限(网络和文件读写权限)
声明权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
这里我写了四个文件供大家参考,首先是主菜单:
只是包含了发送和接收,这个界面的代码实现很简单,只需要,在xml文件里面放俩个button按钮,然后,绑定另外的发送端和接收端就可以了:
public class MainActivity extends AppCompatActivity {
private Button startBtton, stopButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
//super的意思是继承父类
super.onCreate(savedInstanceState);
//初始化xml组件
setContentView(R.layout.activity_main);
//初始化按钮组件
startBtton=findViewById(R.id.bth_start);
stopButton=findViewById(R.id.bth_stop);
//当按钮按下去时候的监听器然后进行跳转到发送端界面
startBtton.setOnClickListener(v->startActivity(new Intent(MainActivity.this ,ServerActivity.class)));
//当按钮按下去时候的监听器然后进行跳转到接收端界面
stopButton.setOnClickListener(view ->startActivity(new Intent(MainActivity.this,ClientActivity.class)) );
}
}
其实比较难的就是用到socket编程,然后还用到多线程:
这里给大家截取部分供大家参考一下
接下里是客户端功能:
然后还用服务器功能:
public class NSDDeviceAdapter extends RecyclerView.Adapter<NSDDeviceAdapter.ViewHolder> {
//定义了一个私有变量device,用来存储NsdServiceInfo的对象
private List<NsdServiceInfo> devices = new ArrayList<>();
//这里面接收了NsdServiceInfo的参数device
public void addDevice(NsdServiceInfo device){
//将传入的设备信息添加到devices集合中。这个集合可能是一个列表,用于存储所有设备信息。
devices.add(device);
// 调用这个方法来通知列表视图(比如RecyclerView)在指定位置插入了一个新的项目。
// devices.size()-1是新添加的项目在列表中的索引位置
notifyItemInserted(devices.size()-1);
}
public void removeDevice(NsdServiceInfo device){
Iterator<NsdServiceInfo> iterator = devices.iterator();
boolean hasRemoved = false;
while (iterator.hasNext()){
//这行代码从迭代器获取下一个元素
NsdServiceInfo tmp = iterator.next();
//这是一个条件判断,如果当前遍历的元素与返回值相等,就执行大括号内的代码
if(tmp.getServiceName().equals(device.getServiceName())){
//如果天剑满足,这行代码会从集合中删除当前遍历到的元素
iterator.remove();
//表示有元素被删除
hasRemoved = true;
}
}
//如果在遍历过程中有元素被删除,这行代码会调用notifyDataSetChanged方法
if(hasRemoved) {
notifyDataSetChanged();
}
}
@NonNull
@Override
public NSDDeviceAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new ViewHolder(new TextView(viewGroup.getContext()));
}
@Override
public void onBindViewHolder(@NonNull NSDDeviceAdapter.ViewHolder viewHolder, int i) {
NsdServiceInfo serviceInfo = devices.get(i);
viewHolder.textView.setText(serviceInfo.toString());
}
@Override
public int getItemCount() {
return devices.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
protected TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView = (TextView) itemView;
}
}
public interface ItemClick{
void onClick(NsdServiceInfo nsdServiceInfo);
}
}
每一行什么作用,我都做了注释,希望能帮到大家!