前言: 学习,掌握Android下套接字的使用.与MFC套接字的通信.
1. 需求: 手机端控制电脑酷狗播放, 上/下一曲, 声音增/减
2. 分析: 手机端用Android , 电脑使用MFC框架实现.酷狗中有全局热键,因此我们可以通过模拟键盘按键从而达到切歌等操作.
3. 手机端实现:
digraph G{
fontname="kaiti";
label="酷狗手机遥控";
edge[fontname="kaiti"];
node[shape=record, fontname="kaiti"]{
ServiceKugou[label="{(ServiceKugou)连接电脑服务端|发送消息 \|接收消息(Runnable)}"];
ControlKugou[label = "{(ControlKugou)响应界面消息|产生相应消息通过ServiceKugou发送出去}"];
CommandType[label="{(CommandType)控制消息集(enum)|播放\|暂停\|上下曲\|声音增减|NEXT_MUSIC\| LAST_MUSIC\| PLAY\| PAUSE\| SOUND_MINUS\| SOUND_PLUS;}"];
Main[label="(MainActivity)主界面"];
};
Main -> ControlKugou -> ServiceKugou[label="消息:播放\|暂停\|上下曲\|声音增减"];
ServiceKugou->CommandType[arrowhead = none];
node[shape=plaintext]{
ControlKugou:w -> 单例;
Main:w -> 界面布局;
}
}
4.电脑端实现:具体操作封装成一个类.
digraph G{
fontname="kaiti";
label="电脑控制端";
edge[fontname="kaiti"];
node[shape=record]{
TcpLuv[label="{TcpLuv|- sListen:SOCKET\l|+ StartServer(void): void\l+ ListenProc(LPVOID): DWORD WINAPI\l+ RecvMessageProc(LPVOID): DWORD WINAPI \l+ GetHostIp(CString&): void\l+ SendMessage(void): void\l+ SendKeyEvent(char*): void\l}"];
};
}
最后实现效果:
电脑:
手机:
总结:
Android端:
1.在使用socket时 需要在AndroidManifest.xml清单声明使用权限:
<uses-permission android:name="android.permission.INTERNET" />
并且在MainActivity中的onCreate()添加如下代码:
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
}
2. 在输入输出流中:
// pWriter.println(content); //此句..对MFC socket阻塞,对方收不到消息
pWriter.print(content);// 发送给服务器
pWriter.flush();
输入中:
try {
//此处也不可用readline
len = bReader.read(buffer);
string = new String(buffer, 0, len);
Log.i("TAG", string);
3. 正则表达式验证是否输入正确ip:
private boolean checkIp(String ipString) {
if (TextUtils.isEmpty(ipString)) {
Toast.makeText(this,
getResources().getText(R.string.ip_is_empty),
Toast.LENGTH_SHORT).show();
return false;
}
// 正则表达式ip:port
// String pat = "^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d+";
//ip
String pat = "^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";
Pattern p = Pattern.compile(pat);
if (!p.matcher(ipString).matches()) {
Toast.makeText(this,
getResources().getText(R.string.ip_is_error),
Toast.LENGTH_SHORT).show();
return false;
}
return true;
}
电脑端:
模拟按键消息:
if (strcmp(dataBuf, "PLAY")==0 || strcmp(dataBuf, "PAUSE")==0)
{
keybd_event(VK_MENU, 0, 0, 0);
keybd_event(VK_F5, 0, 0, 0);
keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_F5, 0, KEYEVENTF_KEYUP, 0);
}
else if (strcmp(dataBuf, "NEXT_MUSIC")==0)
{
本来想获得酷狗的hwnd 从而可发送给手机客户端当前的歌曲信息等信息, 但貌似酷狗的主界面是无标题的,kugou_ui类也不对哦.