Android 장치 간 와 이 파이 통신 을 통한 예시 코드

PC 와 안 드 로 이 드 간 와 이 파이 통신(Socket 을 통 해 블 로그 에서 검색 가능),PC 는 호스트,안 드 로 이 드 는 클 라 이언 트,현재 수중 에 와 이 파 이 를 통 해 데 이 터 를 전송 하 는 기기 가 있 습 니 다.기기 가 호스트 로 와 이 파이 핫 이 슈 신 호 를 보 내 면 안 드 로 이 드 는 이 핫 이 슈 에 연결 되 어야 통신 을 진행 할 수 있 습 니 다.그러나 호스트 가 네트워크 에 연결 되 지 않 았 기 때 문 입 니 다.그래서 이런 상황 에서 안 드 로 이 드 장 치 는 네트워크 를 사용 하여 관련 네트워크 서 비 스 를 실현 할 수 없다(예 를 들 어 관건 적 인 데이터 의 업로드,네트워크 데이터 의 획득 등).그래서 기 구 는 디자인 을 시작 할 때 이 를 클 라 이언 트 로 하고 안 드 로 이 드 장 치 를 호스트 로 한다(인터넷 의 관련 자 료 는 대부분이 안 드 로 이 드 장 치 를 클 라 이언 트 로 한다).안 드 로 이 드 장치 가 핫 이 슈 를 열 면기 구 는 고정된 핫 이 슈 정 보 를 주동 적 으로 연결 하려 고 시도 할 것 이다.그 중에서 네트워크 SSID 와 비밀 번 호 는 이미 쓰 여 있 기 때문에 핸드폰 에서 핫 이 슈 이름 을 수 동 으로 수정 해 야 한다.


핫 이 슈 를 시작 한 후에 핸드폰 은 하나의 공유 기 에 해당 합 니 다.이 공유 기의 IP 주 소 는 고정 적 입 니 다.(본인 이 안 드 로 이 드 장 치 를 테스트 한 적 이 있 는데 기본 적 인 공유 기 주소:192.168.43.3.1,아이 폰 의 기본 공유 기 주소:172.20.10.1)이 데모 의 주요 목 표 는 안 드 로 이 드 장치 클 라 이언 트 가 메 시 지 를 보 내 는 것 입 니 다.서버 에서 정 보 를 받 은 후에 클 라 이언 트 에 게 메 시 지 를 보 냅 니 다.그러면 Android 장치 에서 만 든 SocketServer 코드 는 다음 과 같 습 니 다.
단 하나의 버튼 만 있 습 니 다.스 레 드 에서 해당 하 는 서 비 스 를 시작 할 수 있 기 때문에 여기 서 그림 을 그리 지 않 고 코드 를 직접 넣 습 니 다.

package com.example.socketserver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.koushikdutta.async.callback.CompletedCallback;
import com.koushikdutta.async.http.WebSocket;
import com.koushikdutta.async.http.WebSocket.StringCallback;
import com.koushikdutta.async.http.libcore.RequestHeaders;
import com.koushikdutta.async.http.server.AsyncHttpServer;
import com.koushikdutta.async.http.server.AsyncHttpServer.WebSocketRequestCallback;
import com.koushikdutta.async.http.server.AsyncHttpServerRequest;
import com.koushikdutta.async.http.server.AsyncHttpServerResponse;
import com.koushikdutta.async.http.server.HttpServerRequestCallback;
public class MainActivity extends Activity {
  private Button btnStart;
  private ServerSocket serverSocket;
  private BufferedReader in;
  private PrintWriter out;
  private Handler hander = new Handler(){

    @Override
    public void handleMessage(Message msg) {
      // TODO Auto-generated method stub
      super.handleMessage(msg);
      String s = (String)msg.obj;
      Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
    }
    
  };
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btnStart = (Button)findViewById(R.id.button1);
    btnStart.setOnClickListener(new View.OnClickListener() {
      
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        new ServerThread().start();//       SocketServer...
      }
    });    
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
      return true;
    }
    return super.onOptionsItemSelected(item);
  }
  @Override
  protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();
  }
  private class ServerThread extends Thread{

    @Override
    public void run() {
      // TODO Auto-generated method stub
      super.run();
      try {
//        serverSocket = new ServerSocket(50005);//         Address: 192.168.43.1
        serverSocket = new ServerSocket(5000);
        while (true) {
          Socket clientSocket = serverSocket.accept();//      ...
           String remoteIP = clientSocket.getInetAddress().getHostAddress();
            int remotePort = clientSocket.getLocalPort();
            System.out.println("A client connected. IP:" + remoteIP+ ", Port: " + remotePort);  
          System.out.println("server: receiving.............");
          //    client        ,        
          in = new BufferedReader(new InputStreamReader(
              clientSocket.getInputStream()));
          out = new PrintWriter(clientSocket.getOutputStream(), false);
          //    client       
          String tmp = in.readLine();
          // String content = new String(tmp.getBytes("utf-8"));
          System.out.println("Client message is: " + tmp);
          //   client        
          out.println("Your message has been received successfully!.");
          //      
          out.close();
          in.close();
           Message message = hander.obtainMessage();
           message.obj=tmp;
           hander.sendMessage(message);
           try {
            Thread.sleep(100);
          } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }      
    }    
  }
}
클 라 이언 트 가 실현 한 코드 는 인터넷 과 관련 된 자료 와 차이 가 별로 없고 비교적 간단 하 다.

package com.example.serverclient;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
  private Button sendBtn,sendMessageBtn;
  private Socket socket;
  private PrintStream output;
  private BufferedInputStream bufferedInputStream;
  private ReadThread readThread;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sendBtn = (Button) findViewById(R.id.button1);
    sendMessageBtn = (Button) findViewById(R.id.button2);
    sendBtn.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        new Thread(runnable).start();//    
      }
    });
    sendMessageBtn.setOnClickListener(new View.OnClickListener() {
      
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
         sendMessage("hello,i am from client message");
      }
    });
  }
  Runnable runnable = new Runnable() {
    
    @Override
    public void run() {
      // TODO Auto-generated method stub
      initClientSocket();
      readThread = new ReadThread();
      readThread.start();
    }
  };

  public void initClientSocket() {
    try {
      socket = new Socket("192.168.43.1", 5000);
      output = new PrintStream(socket.getOutputStream(), true, "gbk");

    } catch (UnknownHostException e) {
      // TODO Auto-generated catch block
      System.out.println("            IP");
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      System.out.println("      ");
      e.printStackTrace();
    }
    output.println("this is the message from client");
  }
  public byte[] receiveData() {
    if (socket == null || socket.isClosed()) {
      try {
        socket = new Socket("192.168.43.1", 5000);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    byte[] data = null;
    if (socket.isConnected()) {
      try {
        bufferedInputStream = new BufferedInputStream(socket.getInputStream());
        data = new byte[bufferedInputStream.available()];
        bufferedInputStream.read(data);
      } catch (IOException e) {
        e.printStackTrace();
      }
    } else {
      data = new byte[1];
    }
    return data;
  }
  private void sendMessage(String str) {
    output.println(str);
  }

  public void closeSocket() {
    try {
      output.close();
      socket.close();
    } catch (IOException e) {
      System.out.println("error"+e);
    }
  }
  private class ReadThread extends Thread{

    @Override
    public void run() {
      // TODO Auto-generated method stub
      super.run();
      while (true) {
        byte[] data = receiveData();
        if (data.length > 1) {
          System.out.println(new String(data));
        }
      }
    }
    
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
      return true;
    }
    return super.onOptionsItemSelected(item);
  }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기