***最近因爲項目須要了學習了些ios中簡單網絡編程(socket),這個小的關機demo,ios端無疑用oc寫了,pc用Java寫(其中請教了基友)java
iOS端
儘可能簡化了代碼,只寫了核心功能的代碼
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
。。。。}json
代碼@_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;(其實這個我也不是很瞭解,不過如今尚未用到)segmentfault
在代碼@_2處,AF_INET 設置IPV4地址;
在代碼@_3處,是給咱們建立的Socket綁定地址;網絡
到此ios端核心代碼就這麼多。app
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;dom
TextField tfTxt = new TextField();socket
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(); } } }