ببخشید در مورد این پروسه یا پروتکل p2p یا هر چی که تو نت سرش بحثه دقیقا چی هست (طبق سرچی که زدم) اموزش فارسی خوبی نبود که کد به کد یا کمی دقیق در مورد پیاده سازیش توضیح داده باشه میتونین یه توضیح و برداشت شخصیتون رو بگین و یک اموزش که چه طوری شروع کنیم و تابعها یا کلاسهاش چین و هر کدوم چه کاری نمیکنن رو بزارین
این p2p نه پروسه است و نه پروتکل. p2p یا peer to peer یجور معماری توزیع شده است که خیلی مفهوم کلی ای هم داره و پیاده سازیش فقط یا یکی دو روش نیست.
مفهوم کلی اش اینه که هر گره تو شبکه هم نقش Server رو داشته باشه و هم Client و برای ارتباطش با سایر گره ها یک Server مرکزی در کار نباشه، دیگه از این ساده تر معماری شبکه ای وجود نداره.
کد نویسی خاصی نداره، چون یک مفهوم کلی ئه. وقتی شما با کابل شبکه دو تا کامپیوتر رو به هم وصل می کنید یک شبکه p2p بین شون ایجاد کردید، حالا اگه ارتباط این دو تا کامپیوتر با Bluetooth یا Wifi یا کابل Parallel پرینتر یا کابل رابط USB بود باز هم این معماری p2p ایجاد میشد، این چیزی نیست که ربطی به کد نویسی داشته باشه.
برنامه نویسی سوکت هم بخشی اش مربوط به سیستم عامله و بخشی اش مربوط به زبان برنامه نویسی. تو زبان هایی مثل جاوا که مستقیما درگیر سیستم عامل نیستید خیلی ساده تر.
اون سیستمی که میخواد ارتباط رو روی سوکت ایجاد کنه یک ServerSocket ایجاد می کنه روی پورت فلان :
کد:
ServerSocket socket = new ServerSocket(PORT);
این سوکت با start منتظر میشینه تا کسی بهش وصل بشه و پیامی ارسال کنه، تا وقتی ارتباط مشکل نداشته باشه این دریافت پیام ها ادامه داره، ولی وقتی سوکت به خطا برخورد کرد دیگه باید سوکت با close بسته بشه :
کد:
try {
while (true) {
new Handler(socket.accept()).start();
}
} finally {
socket.close();
}
چون اون سیستم سوکت رو ایجاد کرده بود و مسئولیتش رو داشت باید سوکت رو در انتها می بست تا پورت آزاد بشه وگرنه در بقیه سیستم ها دیگه اون چند خط کد هم لازم نیست.
هر سیستمی دیگه ای که بخواد از این ارتباط سوکتی استفاده کنه دیگه نمیاد یه ServerSocket جدید بسازه، بجاش با ساختن Socket وصل میشه به همون سوکتی که قبلا در سیستم دیگری ایجاد شده و البته باید آدرس میزبانی که سازنده اش بوده بدونه :
کد:
Socket socket = new Socket(serverAddress, PORT);
هم اون ServerSocket و هم اون Socket یک InputStream دارن و یک OutputStream، اولی ورودی ئه که پیام بگیره مثل cin در ++C و دومی خروجی ئه که پیام بفرسته مثل cout در ++C.
با getInputStream اون Stream ورودی رو میگیرند و با getOutputStream اون Stream خروجی رو. از تو Stream ورودی میشه مقدار برداشت و تو Stream خروجی میشه مقدار نوشت، حالا اینکه پیام ها چه پروتکلی دارن دیگه ربطی به سوکت نداره، مطابق تعریف کد نویسه. برنامه نویس تصمیم میگیره که ورودی و خروجی ها با چه پروتکلی باشند، کاملا شخصی و دست برنامه نویس بازه. این stream ها شبیه به cin و cout تو ++C ئه.
کد:
in = new BufferedReader(new InputStreamReader(
socket.getInputStream(),"ISO-8859-1"));
کد:
out = new PrintWriter(new OutputStreamWriter(
socket.getOutputStream(),"ISO-8859-1"), true);
حالا اینکه این مقادیر رد و بدل شده رمز نگاری میشه یا نمیشه، برای درستی و نویز چک میشه یا نمیشه و چه اطلاعاتی داخلشون هست دیگه بحث ارتباط سوکتی نیست، مربوط به پروتکل دلخواه برنامه نویسه.