通过Socket局域网内控制pc关机

346 查看

***最近由于项目需要了学习了些ios中简单网络编程(socket),这个小的关机demo,ios端无疑用oc写了,pc用Java写(其中请教了基友)

  • 列表项目

iOS端
尽量简化了代码,只写了核心功能的代码

这就ui了,,,其实这就一个textfield+button
其中的textfield就是输入命令,而button就是将命令发送给pc端。
所以给button帮定了发送的方法:
- (IBAction)send:(id)sender {
if(isline)
{
NSString niam = [NSString stringWithFormat:@"%@",self.texteidt.text];
self.texteidt.text = nil;
const char
data = [niam UTF8String];
send(CFSocketGetNative(_socket),data,strlen(data)+1,1);
}
else
NSLog(@"error_line");
}

而_socket 一个CFSocketRef,通过查资料,发现在iOS中实现Socket(客户端)有三种技术:
1.NSStream 它是oc语言实现的,是oc的Foundation框架的API;
2.CFstream c语言实现的,oc的Core Foundation的API;
3.BSD Socket 也是c实现而且是一群NB大学生搞的,别名(伯克利),它在unix用的多。
本dome用到是方法2,
完整的实现化一个可用Socket:
_socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketConnectCallBack,nil , NULL); //@_1
if(_socket!=nil)
{ struct sockaddr_in add4;
memset(&add4, 0, sizeof(add4));
add4.sin_len = sizeof(add4);
add4.sin_family = AF_INET; //@_2
add4.sin_addr.s_addr = inet_addr("192.168.1.131");
add4.sin_port = htons(30000);
CFDataRef addres = CFDataCreate(kCFAllocatorDefault, (UInt8*)&add4, sizeof(add4)); //@_3
。。。。}

代码@_1处 CFSocketCreate(
CFAllocatorRef allocator,
SInt32 protocolFamily,
SInt32 socketType,
SInt32 protocol,
CFOptionFlags callBackTypes,
CFSocketCallBack callout,
const CFSocketContext *context);
创建Socket对象,
第一个参数(kCFAllocatorDefault)指创建对象时内存的分配方式,其实也可写NULL其实大多我都写的NULL;
第二参数(PF_INET)其实是你创建的Socket的协议族类型,PF_INET传的为0||负数。
第三个参数(sock_stream)是创建Socket的类型,sock_steam的是tcp的(也是我们用的),sock_dgram的是udp,其实看到udp与tcp没什么怕的,就是两个概念对于我们来说。
第四个参数(IPPROTO_TCP)协议类型,其实与第三个参数有关,tcp->IPPROTO_TCP;udp->IPPROTO_UDP.
第五个参数(kCFSocketConnectCallBack)回调类型,本dome中用的类型是接受客服端回调,看到这你可能会想这不是客户端吗?不要慌,接着看。
第六个参数(nil),回调函数名,其实就是一个地址,简单来说就是第四个参数说我要这种,第五个就是你帮它实现这种的函数的函数名,所以我只是说了,但没有实现,更不会执行。
最后一个,它是个结构体,为了配置你创建的socket;(其实这个我也不是很了解,不过现在还没有用到)

在代码@_2处,AF_INET 设置IPV4地址;
在代码@_3处,是给我们创建的Socket绑定地址;

到此ios端核心代码就这么多。

pc端,java实现
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socke

public class AA extends Frame{
Socket s = null;
ServerSocket ss=null;
DataOutputStream dos = null;
DataInputStream dis = null;

TextField tfTxt = new TextField();

TextArea taContent = new TextArea();

public static void main(String[] args) throws AWTException {

new AA().launchFrame();

}

public void launchFrame() {
// TODO Auto-generated method stub
setLocation(400, 300);
this.setSize(300, 300);

add(tfTxt, BorderLayout.SOUTH);
add(taContent, BorderLayout.NORTH);
pack();
this.addWindowListener(new WindowAdapter() {

@Override
public void windowClosing(WindowEvent arg0) {
disconnect();
System.exit(0);
}
});
tfTxt.addActionListener(new TFListener());
setVisible(true);
connect();
}

private void connect() {
// TODO Auto-generated method stub
try {
ss = new ServerSocket(30000);

while(true)
{
s=ss.accept();

dos = new DataOutputStream(s.getOutputStream());
dis = new DataInputStream(s.getInputStream());
//System.out.println("connected! OK!!");
processConnection();
}
} catch (IOException e) {
e.printStackTrace();

}
}

private void processConnection() throws IOException{
// TODO Auto-generated method stub
String message="";
byte[] buff = new byte[2048];
int hasRead =-1;
byte[] butt = new byte[16];
String mm = "shutdown -s";
do{
hasRead = dis.read(buff);
dos.write(message.getBytes("utf-8"));
String str= new String(buff , 0 , hasRead, "utf-8");
this.taContent.append(t+"客户端: "+str+"\n");
JSONObject json=JSONObject.fromObject(str);
message = new String(buff , 0 , hasRead, "utf-8");
System.out.println(message);
if(mm.equals(message))
{
System.out.println("pc_down");
Runtime.getRuntime().exec("shutdown -s");
}
taContent.setCaretPosition(taContent.getText().length());
}while(!message.equals("88"));
}

private void disconnect() {
// TODO Auto-generated method stub
try {
dos.close();
dis.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

private class TFListener implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
sendMessage(e.getActionCommand());

}
private void sendMessage(String message) {
// TODO Auto-generated method stub
try {
dos.write(message.getBytes("utf-8"));
dos.flush();
taContent.append(t+"主机端: "+message+"\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}