原 android用socket与PC用C#的socket通讯使PC关机

7 篇文章 0 订阅
2 篇文章 0 订阅

因为本人有时候开着电脑就会床上玩手机,突发奇想用手机控制电脑关机,说写就写,虽然对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,即可执行立刻关机
 

 

 

原文地址: https://blog.csdn.net/gaoweiweiw/article/details/53159463

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值