Android Socket 사용법 간단하게 배우 기

11453 단어 AndroidSocket
이 분야 의 지식 은 고립 된 것 이 아니 라 Socket 프로 그래 밍,다 중 스 레 드 작업,그리고 I/O 흐름 에 관 한 작업 이 있 습 니 다.물론 실현 방법 은 한 가지 가 아니 라 그 중의 하나 일 뿐 같은 초보 자 에 게 약간의 생각 을 준다.추천 할 게 있 으 면 조언 을 환영 합 니 다!
먼저 여러분 께 응용 프로그램의 인 터 페 이 스 를 보 여 드 리 면 대체적인 기능 을 기본적으로 알 수 있 습 니 다.
 
activity_main.java

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context=".MainActivity">

 <EditText
 android:id="@+id/editText"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:hint="         "/>
 
 <Button
 android:id="@+id/button01"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="  "/>

 <Button
 android:id="@+id/button02"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="  "/>

 <ScrollView
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:scrollbars="vertical"
 android:fadingEdge="vertical">
 <TextView
  android:id="@+id/textView"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="    :"/>
 </ScrollView>

</LinearLayout>

화면 이 매우 간단 하 다.
다음은 서버 와 클 라 이언 트 가 필요 합 니 다.서버,저 는 Eclipse 가 쓴 자바 서버 를 사용 합 니 다.클 라 이언 트,저 는 Android Studio 로 썼 습 니 다.

package com.ryan.socketdemo01;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;

/**
 *      :            (      )
 *
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

 private Button button01 = null;
 private Button button02 = null;
 private EditText editText = null;
 private TextView textView = null;

 private static Socket ClientSocket = null;
 private byte[] msgBuffer = null;
 Handler handler = new Handler();


 private void initView() {
 button01 = (Button) findViewById(R.id.button01);
 button02 = (Button) findViewById(R.id.button02);
 editText = (EditText) findViewById(R.id.editText);
 textView = (TextView) findViewById(R.id.textView);

 button01.setOnClickListener(this);
 button02.setOnClickListener(this);

 button01.setEnabled(true);
 button02.setEnabled(false);
 }


 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 initView();

 }


 @Override
 public void onClick(View v) {
 switch (v.getId()){
  case R.id.button01:
  // TODO: 15-9-4 socket    
  connectThread();
  break;
  case R.id.button02:
  // TODO: 15-9-4       
  sendMsgThread();
  break;
 }
 }

 private void sendMsgThread() {

 final String text = editText.getText().toString();
 try {
  msgBuffer = text.getBytes("UTF-8");
 } catch (UnsupportedEncodingException e) {
  e.printStackTrace();
 }

 new Thread(new Runnable() {
  @Override
  public void run() {
  try {
   OutputStream outputStream;
   //Socket   
   outputStream = ClientSocket.getOutputStream();

   outputStream.write(msgBuffer);
   outputStream.flush();
   outputStream.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  handler.post(new Runnable() {
   @Override
   public void run() {
   textView.append("    :"+text+"
"); } }); } }).start(); } private void connectThread() { new Thread(new Runnable() { @Override public void run() { try { ClientSocket = new Socket("10.0.2.2",9001); if (ClientSocket.isConnected()){ handler.post(new Runnable() { @Override public void run() { textView.append(" !"+"
"); button01.setEnabled(false); button02.setEnabled(true); } }); }else { handler.post(new Runnable() { @Override public void run() { textView.append(" !"+"
"); } }); } } catch (IOException e) { e.printStackTrace(); } } }).start(); }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // Inflate the menu; this adds items to the action bar if it is present.
 getMenuInflater().inflate(R.menu.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();

 //noinspection SimplifiableIfStatement
 if (id == R.id.action_settings) {
  return true;
 }

 return super.onOptionsItemSelected(item);
 }
}

여기 서 나의 스 레 드 사용 방식 은:

new Thread (new Runnable) {
 @Override
 public void run() {
 } 
} 
  인터넷 에서 어떤 사람 은 이 방식 이 매우 LOW 이 고 좋 지 않다 고 말 하지만,지금 나 는 이것 만 할 줄 알 고,asynctask 도 아직 공부 하고 있다. 
그리고 하위 스 레 드 가 주 UI 를 업데이트 하 는 방법 은 다음 과 같 습 니 다.
제 가 사용 하 는 것 은 Handler.post()입 니 다.마찬가지 로 매우 간단 한 사용 방법.

Handler handler = new Handler(); 

handler.post(new Runnable() {
   @Override
   public void run() {
   textView.append("    :"+text+"
"); } });
메 인 UI 를 업데이트 하 는 몇 가지 피 드 스 레 드 방법 에 대해 서 는 나중에 블 로 그 를 한 편 더 쓸 것 입 니 다.나 는 지금 이미 4 가지 방법 을 알 고 있 으 며,아직 현장 조작 을 하지 않 았 다. 
그리고 I/O 흐름 조작 에 관 한 방법 입 니 다.
여 기 는 제 가 상세 한 소 개 를 하지 않 겠 습 니 다.여러분 스스로 구 글 하 세 요!뭐 공부 해요?직접 FQ 도 구 를 찾 아 보 세 요~
여기 서 I/O 에 대한 간단 한 사용법 을 말씀 드 리 겠 습 니 다.
만물 은 최초의'InputStream,OutputStream'에서 시 작 됩 니 다.그의 방법 은 reader()와 write()밖 에 없습니다.그 위 에 있 는 것,예 를 들 어 가장 많이 사용 하 는 버 프 레 드 리더 대상 은 모두 그 위 에 있 는 업그레이드 포장 으로 옷 을 입고 더욱 화려 해 졌 을 뿐이다.그의 전문 용 어 는 바로 장식 자 모델 로 관심 이 있 는 것 은 자 료 를 뒤 져 볼 수 있다.

처음에 저 는 InputStream 과 OutputStream 의 방법 에 대해 잘 몰 랐 습 니 다.InputStream 을 write()방법 으로 잘못 사용 하 는 경우 가 많 았 습 니 다.어디서 이런 말 을 보 았 는 지 모 르 겠 습 니 다.I/O 흐름 의 조작 은 실질 적 으로 Socket,ServerSocket 연결 후 발생 하 는 데이터 흐름 관 입 니 다.reader 와 write 는 읽 기와 쓰기 라 는 뜻 으로 그 데이터 흐름 관 에 비해 작 동 합 니 다.파이프 에 있 는 정 보 를 읽 고 파이프 에 정 보 를 기록 하 는 것 이다.이러 면 다 들 움 직 일 지 모 르 겠 네. 
마지막 으로 우리 가 배 워 야 할 Socket 이다.
그의 사용 도 간단 하 다.Socket 대상 을 만 들 고 IP 와 포트 를 설정 하여 I/O 흐름 을 얻는다.

ClientSocket = new Socket("10.0.2.2",9001);

outputStream = ClientSocket.getOutputStream();

여기까지 기본 적 인 사용법 이 이렇게 많아 요.
내 가 그 중에서 만난 문 제 를 말 해 봐.
1.시 뮬 레이 터 가 자바 서버 에 연결 되 지 않 습 니 다.IP 설정 이 잘못 되 었 습 니 다.제 가 처음에 설정 한 Ip 는 127.0.0.1 입 니 다.해 결 된 연결:
http://stackoverflow.com/questions/8191192/reaching-a-network-device-by-ip-and-port-using-the-android-emulator/8191487#8191487
http://stackoverflow.com/questions/10336637/how-do-i-socket-an-android-program-to-a-localhost-server
 2.manifest 설정 을 잊 어 버 리 거나 시스템 에서 제공 하 는 android.permission.INTERNET 은 모두 대문자 입 니 다!!말하자면 우 스 꽝 스 럽 지만 저 는 이런 문제 에 부 딪 혔 습 니 다.시스템 이 자동 으로 완성 하 는 코드 힌트 는 모두 대문자 입 니 다.저 는 그런 줄 알 았 습 니 다.결 과 는 분명히 소문 자일 것 입 니 다.

자바 서버 코드 를 붙 이 는 것 을 잊 어 버 렸 습 니 다.보충 하 세 요.

/**
 *      :          
 */
public class Main {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    new SerVerListener().start();
  }

}


 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JOptionPane;


public class SerVerListener extends Thread{
  
  private Socket clientSocket = null;
  private ServerSocket serverSocket = null;
  private InputStream inputStream = null;
  private byte[] buffer = null;
  
  @Override
  public void run() {
    // TODO Auto-generated method stub
    
    try {
      serverSocket = new ServerSocket(9001);
      System.out.println("     ,     〜〜");
      //block
      clientSocket = serverSocket.accept();
      System.out.println("      ");
      inputStream = clientSocket.getInputStream();
      
      BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
      String str;
      
      while((str = br.readLine())!= null){
        System.out.println(str);
      }
      
    }catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }finally{
      try {
        inputStream.close();
        serverSocket.close();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    
    
  }

}

이것 은 서버 에서 받 은 데이터 입 니 다:
 
 
OK,기본적으로 이렇다.
이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기