c语言通过socket控制主机,通过Socket局域网内控制pc关机

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

列表项目

iOS端

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

bVcJG2

这就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();

}

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值