آموزش Socket در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش های برنامه نویسی اندروید به آموزش Socket در برنامه نویسی اندروید این برنامه توسط یک آیپی و port کار خواهد کرد که از خود کاربر گرفته می شود و باید در مودم خود port forwarding را فعال کنید تا برنامه کار کند و برای تست برنامه باید بروی دو گوشی که به یک وایفا متصل شده اند نصب شود سپس در هر دو گوشی آیپی مودم و port آن را وارد کرده و متصل می شوند در ادامه با ما همراه باشید.
نحوه port forwarding در مودم را در اینترنت جستجو کنید (حتما باید این کار را انجام دهید در غیر این صورت برنامه کار نخواهد کرد)
خب ابتدا باید یک کلاس درست کنیم که اعمالی رو که می خواهیم انجام دهد (ارسال داده و بررسی های لازم برای اتصال به سوکت)
پس یک کلاس به نام Client.java درست کنید کد های زیر را در آن قرار دهید ما برای اینکه بتوانیم multitask کار انجام دهیم از کلاس Async در کد پایین استفاده کردیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | 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 همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <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://programchi.ir/" 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 هم همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package programchi.ir; 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 اضافه کنید.
1 | <uses-permission android:name="android.permission.INTERNET"/> |
این آموزش هم به پایان رسید.
موفق و موید باشید.
این همه تنوع فوقالعادست .خسته نباشی
خیلی ممنون نظر لطف شماست
موفق و موید باشید.
یه نقطه هم بگم نمیدونم چه طوری خصوصی بهتون بگم که میشه یه کاری کرد که احتیاج نباشه دو گوشی به یک اینترنت وصل باشند حتی یکی از کاربرا اون سر دنیا هم باشه میشه وصل شد با استفاده از ایپی استاتیک که اگه نباشه میشه از طریق بعضی سایتها ایپی رو ثابت کرد
بله میشه از dns استفاده کرد سایت های خارجی هستند که به صورت رایگان این کار رو انجام می دهند کافی است آیپی و پورت را از سایت دریافت کرده و یک برنامه ایجاد کرد البته باید بخشی از کد تغییر کند
موفق و موید باشید.
ممنون که اعلام کردید شاید در آینده نزدیک همچین بخشی را برای کاربران سایت قرار دادیم البته بهتر است از سرور اختصاصی استفاده شود تا بشود برای افرادی بیش از دو نفر امکان چت را ایجاد کرد.
http://s9.picofile.com/file/8301057784/Untitled.png
این ارور برای چیه.به نظر یک { کم داره اخر کدها
سلام دوست عزیز کد اصلاح شد تشکر از اعلامتون
http://s9.picofile.com/file/8301061376/Untitled.png
خواهش میکنم.ما که کپی پست میکنیم شما زحمت میکشید دست خوش
الان هیچ اروری ندارم الا اینی که تو عکسه.در ضمن ایپی باید چی وارد کنم همونی که تو گوگل سرچ کیکنم myip میاره؟
خطا ندارید ؟
باید Port Forwarding روی مودم خودتان انجام دهید در اینترنت سرچ کنید آموزشش هست و آیپی شما همان است ولی باید پورت را در ip forwarding تنظیم کنید خودتان از یک پورت به طور مثال 40 استفاده کنید یا 6060.
موفق و موید باشید.
من کد رو یک بار دیگر آپدیت کردم ولی مشکل ندیدم دوباره بررسی کنید در صورتی که مشکل داشتید بفرمایید
http://s9.picofile.com/file/8301063250/khata.png
قبلا پورت باز کردم چون یک ساله هر روز ازش استفاده میکنم و میدونم درسته.اون ارور رو با پیشنهادهای خود اندروید استودیو حل میکنم ولی موقع اجرا اتفاقی نمیافته.روی شبیه ساز و گوشی هواوی چک کردم
port 81 برای اینترنت است و به صورت معمول باز است از یک port دیگر استفاده کنید.
6622
هم تست زدم نشد
81 رو هم همیشه فوروارد کرد مشکلی نداره.یک فیلم تست بذارین خوب میشه.شب بخیر
قرار میدهیم
برای منم جواب نداد یه جای کار میلنگه
اگر port Forwarding را درست انجام داده باشید مشکلی نیست.
سلام من فکر میکنم مشکل از اندروید 6 به بالاست من خودم به شدت درگیر این موضوع هستم ایا این کد روی اندروید 6 جواب میده و جدا از متصل شدن ارسال و دریافت اطلاعات رو هم داره ؟
ممنون میشم جواب رو ایمیل کنید
با تشکر
روی اندورید 6 تست نشده است ممکن است کار نکند بررسی می شود بهتون اعلام می کنیم
با سلام و سپاس از آموزشهای خوبتون
اگر امکان داره سوکت نویسی برای سرورها هم آموزش بدید.
مثلا یک برنامه اندروید داشته باشیم و تو یکی از اکتیویتی ها اطلاعات با استفاده از socket گرفته بشه و نمایش داده بشه و دریافت داده ها به صورت ریل تایم باشه. در واقع چیزی شبیه تلگرام.
یک سمت برنامه اندروید و سمت دیگه یک سرور که حالا با php یا .Net نوشته شده و ارسال اطلاعات به برنامه اندروید را بر عهده داره.
به زودی آموزش را قرار میدهیم
موفق باشید.
ممنون از شما
مشخص نیست حدودا کی؟
چون من خیلی به این مورد احتیاج دارم
تو نت زیاد گشتم اما زیاد متوجه نشدم
از طرفی چون روی موضوع مرتبط با این موضوع کار کردین قبلا فکر کنم زودتر بتونید این آموزش رو قرار بدید.
حدودا برای هفته دیگه فکر می کنم بتونیم آموزش بدیم.
موفق باشید.
عالیه
منتظر آموزش خوبتون هستیم.
جنب جعفر پور این آموزش آماده نشد بزارینش؟
آماده شود قرار خواهد گرفت.
لطفا تو اولویت قرار بدید چون خیلی میتونه کاربردی باشه
بله درسته
آقای جعفر پور آموزش هاتون واقعا کاربردیه خدا خیرت بده واقعا کارت درسته
خواهش می کنم
موفق و پیروز باشید.
سلام- اگه که بخوایم از طریق سرور شخصی سوکت کنیم کجای کد رو به چه شکل باید تغییر بدیم؟؟
-ممنون
سلام
باید به شکل زیر باشد.
ولی ممکن است کد deprecated شده باشد.
موفق باشید.
با سلام
من کدی که شما نوشتین رو امتحان کردم از من ارور میگرفت که چرا متد doInBackground ؛ void هست ولی داره استرینگ بر میگردونه من به این صورت تغییرش دادم
موفق باشید.
سلام من ی سوال داشتم اونم اینه ک برنامه های مثل بازار – بازی کلش – انستاگرام همشون سوکت پروگرمینگ هستن
سلام و درود
بازار که خیر ولی بقیه بله
وای شما فوق العاده اید. همه چیز در مورد اندروید را بلدید. اصلا انگار خودتون گوگل هستید!
خیلی دوست دارم بدونم که منم می تونم مثل شما یه برنامه نویس حرفه ای بشم؟(حالا ن در حد شما اما خب در این حد که بتونم اپ های خفن را درست کنم) شما چه جوری این قدر بزرگ شدید؟کتاب خوندید؟؟فیلم دیدید؟دوره رفتید؟
ممنون میشم اگر بنده را هم راهنمایی کنید.
سلام و درود ما انقدرم بزرگ نیستیم که شما می فرمایید شما لطف دارید از نظر من خوندن مطالب خارجی و همینطور pdf خیلی کمک می کند کتاب های خیلی خوبی به زبان های انگیلیسی منتشر شده اند به طور مثال شما می تونید کتاب یا pdf معروف big java رو مطالعه کنید که فکر می کنم الان edition 7 باید منتشر شده باشد دیدن فیلم های آموزشی خارجی هم خیلی مفیده .
موفق باشید.
با سلام اگه ما بخوایم به ی آی و پورت سخت افزار وای فای وصل بشه و داده بفرسته همین کد جواب میده؟؟؟
سلام بله باید کمی تغییرات در سورس اعمال کنید.
من خیلی عجله دارم واسه این پروژه اگه مقدور به پاسخگویی هستین لطف کنین اعلام کنید!
اگر در آن سمت از Router استفاده کنید و بتوانید port forwarding را انجام دهید می توانید از همین آموزش استفاده کنید و اگر سرور جاوا باشد فرق می کند اگر سرور بر بستر وب باشد باز هم فرق می کند.
در آن سمت فقط یک ماژول وای فای هست
پس همین کد به احتمال زیاد کار خواهد کرد.
سلام خسته نباشید
ممنون بابت آموزش های عالی سایت.
میخواستم کمکم کنید
هرجا میگردم جوابی نمیگیرم
میخوام یه بازی بسازم که دو نفره یا چند نفره بشه
از طریق بلوتوث یا هات اسپات
چجوری باید این کار رو بکنم.
سوکت باید بنویسیم؟؟
سلام استاد خسته نباشید ، چطور میتونیم با استفاده از سوکت dns گوشی کاربر رو تغییر بدیم ؟