آموزش Socket در برنامه نویسی اندروید

امتیاز 2.00 ( 1 رای )

سلام دوستان در این سری از آموزش های برنامه نویسی اندروید به آموزش Socket در برنامه نویسی اندروید این برنامه توسط یک آیپی و port کار خواهد کرد که از خود کاربر گرفته می شود و باید در مودم خود port forwarding را فعال کنید تا برنامه کار کند و برای تست برنامه باید بروی دو گوشی که به یک وایفا متصل شده اند نصب شود سپس در هر دو گوشی آیپی مودم و port آن را وارد کرده و متصل می شوند در ادامه با ما همراه باشید.
نحوه port forwarding در مودم را در اینترنت جستجو کنید (حتما باید این کار را انجام دهید در غیر این صورت برنامه کار نخواهد کرد)
خب ابتدا باید یک کلاس درست کنیم که اعمالی رو که می خواهیم انجام دهد (ارسال داده و بررسی های لازم برای اتصال به سوکت)
پس یک کلاس به نام Client.java درست کنید کد های زیر را در آن قرار دهید ما برای اینکه بتوانیم multitask کار انجام دهیم از کلاس Async در کد پایین استفاده کردیم.

package ir.programchi;
/**
 * Created by jefferson on 7/19/2017.
 */
import android.os.AsyncTask;
import android.widget.TextView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client extends AsyncTask<Void, Void, Void> {
    String dstAddress;
    int dstPort;
    String response = "";
    TextView textResponse;
    Client(String addr, int port, TextView textResponse) {
        dstAddress = addr;
        dstPort = port;
        this.textResponse = textResponse;
    }
    @Override
    protected Void doInBackground(Void... arg0) {
        Socket socket = null;
        try {
            socket = new Socket(dstAddress, dstPort);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(
                    1024);
            byte[] buffer = new byte[1024];
            int bytesRead;
            InputStream inputStream = socket.getInputStream();
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, bytesRead);
                response += byteArrayOutputStream.toString("UTF-8");
            }
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "UnknownHostException: " + e.toString();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "IOException: " + e.toString();
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return response;
    }
    @Override
    protected void onPostExecute(Void result) {
        textResponse.setText(response);
        super.onPostExecute(result);
    }
}

پس یک ip و یک port ورودی کلاینت ما است و یک response یا نتیجه هم بر خواهد گشت یعنی اون پیامی که کاربر ارسال می کند و از inputStream برای خواندن داده ها استفاده کردیم در صورتی که خطا دهد وارد catch شده و شما می توانید خطا را در بخش AndroidMonitor ببینید.
و بخش layout ما یا activity_main.xml همانند زیر می شود.

<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" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:autoLink="web"
        android:text="http://orjinakteb.com/"
        android:textStyle="bold" />
    <EditText
        android:id="@+id/addressEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Server ip address" />
    <EditText
        android:id="@+id/portEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Server port number" />
    <Button
        android:id="@+id/connectButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="Connect..." />
    <Button
        android:id="@+id/clearButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Clear" />
    <TextView
        android:id="@+id/responseTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

در اینجا ما دو EditText داریم اولی آدرس آیپی مودم و دومی شماره port است (از بخش port forwarding باید به دست بیاریدش) و یک دکمه برای اتصال و یک دکمه دگیر برای پاک کردن اطلاعت تعبیه شده و یک TextView در پایین برای نمایش response یا نتیجه .
و کد بخش MainActivity.java هم همانند زیر می شود.

package orjinakteb.com;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
    TextView response;
    EditText editTextAddress, editTextPort;
    Button buttonConnect, buttonClear;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editTextAddress = (EditText) findViewById(R.id.addressEditText);
        editTextPort = (EditText) findViewById(R.id.portEditText);
        buttonConnect = (Button) findViewById(R.id.connectButton);
        buttonClear = (Button) findViewById(R.id.clearButton);
        response = (TextView) findViewById(R.id.responseTextView);
        buttonConnect.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Client myClient = new Client(editTextAddress.getText()
                        .toString(), Integer.parseInt(editTextPort
                        .getText().toString()), response);
                myClient.execute();
            }
        });
        buttonClear.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                response.setText("");
            }
        });
    }
}

کار خاصی در بالا انجام نداده ایم فقط از کلاسی که ایجاد کرده  استفاده کردیم و برای اینکه اتصال برقرار شود بعد از گرفتن آیپی و پورت Client را excute یا اجرا کردیم.
و یادتان نرود باید حتما دسترسی اینترنت را در بخش AndroidManifest.xml اضافه کنید.

    <uses-permission android:name="android.permission.INTERNET"/>

 
این آموزش هم به پایان رسید.
 
موفق و موید باشید.

مطالعه بیشتر