因为本人有时候开着电脑就会床上玩手机,突发奇想用手机控制电脑关机,说写就写,虽然对android编程刚开始不懂,但是android出了个神器编译环境(android studio),比以前的eclipse好用多了,以前配置个环境都头大,现在android studio 就像VS一样方便。刚开始接触android,很多东西都不懂,写出来给一样都是刚开始的友们参考下,有错的地方望大神指出,本例程参考android与PC通讯的多个事例写成特记录之
1、服务器端:
先看运行界面:
运行服务器端程序启动监听,代码如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
namespace SocketTest
{
public partial class Server : Form
{
Thread serverThread;
Thread clientThread;
Socket serverSocket;
Socket clientSocket;
public Server()
{
InitializeComponent();
}
private void ServerStart()
{
//创建IPEndPoint实例
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 3002);
//创建socket套接字
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//将所创建的套接字与IPEndPoint绑定
serverSocket.Bind(ipep);
//设置socket为监听Listen模式
serverSocket.Listen(10);
while (true)
{
try
{
//在套接字上接收接入的连接
clientSocket = serverSocket.Accept();
clientThread = new Thread(new ThreadStart(ReceiveData));
clientThread.Start();
}
catch (Exception ex)
{
MessageBox.Show("listening Error: " + ex.Message);
}
}
}
private void ReceiveData()
{
bool keepalive = true;
Socket s = clientSocket;
Byte[] buffer = new Byte[1024];
//根据收听到的客户端套接字向客户端发送信息
IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint;
this.Invoke((EventHandler)(delegate//同步GUI线程显示
{
lstServer.Items.Add("Client:" + clientep.Address + "(" + clientep.Port + ")");
}));
string welcome = "ok";
byte[] data = new byte[1024];
data = Encoding.ASCII.GetBytes(welcome);
s.Send(data, data.Length, SocketFlags.None);
while (keepalive)
{
//在套接字上接收客户端发送的信息
int bufLen = 0;
try
{
bufLen = s.Available;
s.Receive(buffer, 0, bufLen, SocketFlags.None);
if (bufLen == 0)
continue;
}
catch (Exception ex)
{
MessageBox.Show("Receive Error:" + ex.Message);
return;
}
clientep = (IPEndPoint)s.RemoteEndPoint;
string clientcommand = System.Text.Encoding.ASCII.GetString(buffer).Substring(0, bufLen);//.GetEncoding("GB2312") 中文
Process sysCalculator = null;
switch (clientcommand)
{
case "a":
sysCalculator = Process.Start("calc.exe");//打开计算器,test
break;
case "b":
Process.Start("shutdown", "-s -t 0");//立即关机
break;
default:
break;
}
this.Invoke((EventHandler)(delegate//同步GUI线程显示
{
lstServer.Items.Add(clientcommand + "(" + clientep.Address + ":" + clientep.Port + ")");
}));
}
}
private void Server_Load(object sender, EventArgs e)
{
//新建服务器SOCKET线程
serverThread = new Thread(new ThreadStart(ServerStart));
serverThread.Start();
this.Invoke((EventHandler)(delegate//同步GUI线程显示
{
lstServer.Items.Add("Server Start .....");
}));
}
}
}
2、客户端(android)
Mainfest.xml中添加
//申请联网权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
MainActivity.java
//完整中代码,联网数据必须在子线程里面,主线程不允许,所以建立socket和发送都新建了线程
package com.example.administrator.socketsend; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import java.io.IOException; import java.io.PrintStream; import java.net.Socket; import java.net.UnknownHostException; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import java.io.DataOutputStream; import android.os.Bundle; import android.app.Activity; //import com.google.zxing.client.android.R; public class MainActivity extends AppCompatActivity { private Button btnConnect; private Button btnSend; private EditText editSend; private Socket socket; private PrintStream output; private Thread newThread; //声明一个子线程 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); btnConnect.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { initClientSocket(); } }); btnSend.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //sendMessage(editSend.getText().toString()); new Thread() { @Override public void run() { output.print(editSend.getText().toString()); //try { //DataOutputStream writer = new DataOutputStream(socket.getOutputStream()); //writer.writeUTF("sss"); // 写一个UTF-8的信息 //output.println(editSend.getText().toString()); //System.out.println("发送消息"); // } catch (IOException e) { // e.printStackTrace(); //} } }.start(); } }); } private void initView() { btnConnect = (Button) findViewById(R.id.btnConnect); btnSend = (Button) findViewById(R.id.btnSend); editSend = (EditText) findViewById(R.id.editSend); } private void sendMessage(String str) { output.println(str); } public void closeSocket() { try { output.close(); socket.close(); } catch (IOException e) { //handleException(e, "close Exception: "); } } private void initClientSocket() { // 新建线程 newThread = new Thread(new Runnable() { @Override public void run() { try { //new EditText edit_ip = (EditText) MainActivity.this.findViewById(R.id.edit_hostIp); EditText edit_port = (EditText) MainActivity.this.findViewById(R.id.edit_hostPort); String ip = edit_ip.getText().toString().trim(); String port = edit_port.getText().toString().trim(); socket = new Socket(ip, Integer.parseInt(port)); //get output Stream output = new PrintStream(socket.getOutputStream(), true, "gbk"); // output = new PrintStream(socket.getOutputStream(),true); } catch (UnknownHostException e) { Toast.makeText(MainActivity.this, "请检查端口号是否为服务器IP", Toast.LENGTH_LONG).show(); // handleException(e, "UnknownHostException: " + e); } catch (IOException e) { Toast.makeText(MainActivity.this, "服务器未开启", Toast.LENGTH_LONG).show(); // handleException(e, "IOException" + e); } } }); newThread.start(); //启动线程 } }
运行效果:
客户端发送a打开计算器,用于测试
发送b,即可执行立刻关机