socket实现客户端与服务端通信(一)服务端

时间:2021-01-18 00:03:05

因为经常用PC开wifi信号坐床上玩手机,但晚上要睡觉了又不想下床去关电脑,就想做个Android控制PC的软件。但是想实现Android控制PC,就得实现客户端和服务端来保持通信,不然无法实现。

所以我先做了服务端。服务端还是比较简单,上代码

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class PCService{

	static ServerSocket serversocket = null;// 服务socket
	static DataInputStream data_input = null;// 输入流
	static DataOutputStream data_output = null;// 输出流

	public static void main(String[] args) {
		try {
			// 监听30000端口
			serversocket = new ServerSocket(30000);
			System.out.println("listening 30000 port");

			while (true) {
				// 获取客户端套接字
				Socket client_socket = serversocket.accept();
				String send_msg = "";
				try {

					// 获取输入流,读取客户端传来的数据
					data_input = new DataInputStream(client_socket.getInputStream());
					String msg = data_input.readUTF();
					System.out.println(msg);
					// 判断输入,进行相应的操作
					data_output = new DataOutputStream(client_socket.getOutputStream());
					if ("shutdown".equals(msg)) {
						 Shutdown();
						// 发送消息回Android端
						send_msg = "60秒后关机 ";
					} else if ("restart".equals(msg)) {
						 Restart();
						send_msg = "60秒后重启";
					} else if ("cancel".equals(msg)) {
						cancel();
						send_msg = "关机已取消";
					}
				} catch (Exception e) {
				} finally {
					try {
						if (data_output != null) {
							data_output.writeUTF(send_msg);
							data_output.close();
						}
						data_input.close();
						// 关闭连接
						client_socket.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	// 关机
	private static void Shutdown() throws IOException {
		Runtime.getRuntime().exec("shutdown -s -t 60");
		System.out.println("shutdown ,60 seconds later ");
	}

	// 重启
	private static void Restart() throws IOException {
		Runtime.getRuntime().exec("shutdown -r -t 60");
		System.out.println("restart ,60 seconds later ");
	}

	// 取消关机或重启
	private static void cancel() throws IOException {
		Runtime.getRuntime().exec("shutdown -a");
		System.out.println("cancel ");
	}
}

服务端会根据客户端发来的数据进行判断再执行相应的操作。真正实现关机重启等操作的是利用Runtime.getRuntime()得到运行时环境,类似于得到了一个cmd窗口,然后执行shutdown命令就可以实现关机,重启等操作了。还有要注意的是,在new ServerSocket(port)时,里面的port端口号必须是空闲的才行,端口号的范围从0到65535,像网络端口80,FTP端口21,mysql默认端口3306,我用的30000端口,一般不会使用。
这样服务端就可以跑起来,不信,试试。