View Full Version : نوشتن یک کد
mosi20
جمعه 09 مهر 1395, 19:59 عصر
سلام
دوستان من نیاز دارم یک نفر برام این کد کوچک را بنویسد
اگر کسی میتونه لطفا کمکم کنه
باید یک پکت به یک سایت ارسال کنم ساختار پکت ارسالی باید به شکل تصویر زیر باشد
اما به هیچ عنوان اطلاعای در مورد چگونگی ساخت این پکت وطرز ارسالش ندارم
اگر میتویند این کد را برام بنویسید یا مشابه آن را بنویسید
142828
vahid-p
یک شنبه 11 مهر 1395, 00:31 صبح
متاسفانه در این انجمن (و اکثر انجمن های آموزشی) امکان انجام تمرین و پروژه های درسی و دانشجویی وجود نداره.
به هر حال این پکیج که احتمالا منظور سوال HTTP هست، به راحتی میتونید با متد POST این بسته رو ارسال کنید. تابع sendPost این آموزش رو ببینید:
https://www.mkyong.com/java/how-to-send-http-request-getpost-in-java
شما با setRequestProperty هدرها رو مینویسید و در متغیر urlParameters قسمت بدنه رو (البته اگر اندازه ها باید فیکس باشه بایت به بایت رو از رو عددها و... تشکیل بدید)
mosi20
یک شنبه 11 مهر 1395, 08:06 صبح
نه عزیز جان نه کد دانشجویی هست نه آموزشی
منظور هم ارسال http نیست
من در ساخت پکت اصلی مشکل دارم وگرنه روش اصلیش را انجام میدادم
باید به صورت byte array باشه
لطفا کمک کنید
خیلی مهمه
vahid-p
دوشنبه 12 مهر 1395, 00:25 صبح
منظور هم ارسال http نیست
خب اگر http نیست چی هست؟ چون گفتید میخواید به یک سایت ارسال کنید
دقیقتر توضیح بدید. منظور از "پکت اصلی" و "روش اصلی" چیه؟
byte array میخواید که فقط این اطلاعات رو داشته باشه؟ اونوقت به چه پروتکلی میخواید ارسال کنید؟
کلا سوال برای من مبهمه تا جایی که نمیدونم چیزی که میخوایید زو میدونم یا نه :لبخند:
نمیتونید کل صورت مسئله رو اینجا آپلود کنید؟ (این جدول به تنهایی خیلی کمکی نمیکنه)
mosi20
دوشنبه 12 مهر 1395, 08:14 صبح
والا همین جدول را بیشتر ندارم + یک آی پی + یک پورت
باید با سوکت بهش وصل بشم و بفرستم
یک ارتباط دو طرفه هست که من کلاینت هستم
vahid-p
چهارشنبه 14 مهر 1395, 11:28 صبح
تو این لینک یک نمونه رو نوشته برای Client و Server:
https://www.tutorialspoint.com/java/java_networking.htm
شما کافیه داده هاتون رو در یک آرایه بریزید و اون آرایه رو با out.write که در مثال بالا اومده بفرستید (اونجا نوشته out.writeUTF که شما از اون استفاده نکنید).
مثلا در این مثال شما 57 بایت داده دارید. 5 تا 4 بایت اول که همگی عدد هستند و اعداد صحیح در جاوا 4 بایتی هستند، پس مشکلی ندارید. سه تا مقدار بعدی چون گفته octet String که منظورش هر کاراکتر یک بایت، کافیه 8 بیت کم ارزش کاراکترهاتون رو ذخیره کنید (برای ASCII همین 8 بیت کم ارزش کافیه ولی برای حروف فارسی و... کافی نیست که طبق سوال مشخصه بقیه رو نمیخواد) و آخریش هم که باز عدده.
شما کافیه فقط پارامترها رو مقدار دهی کنید. دیگه اینکه هر پارامتر چی رو میخواد بگه رو نمیدونم و بسته به سوالتون هست.
یک مثال میزنم. فرض کنید من چنین چیزی دارم:
Length - 4 byte - length of whole package
USER - 11 byte - octet string of username
PASS - 13 byte - octet string of password
از اونجایی که در این مثال اندازه همیشه ثابته، پس Length هم همیشه ثابت خواهد بود و مثلا تو این مثال 28
اینم یک نمونه کد که ببینی چجوری عددها و رشته ها رو به آرایه های با سایز مشخص تبدیل کنیم. شما کافیه بقیه مقادیرتون رو آماده کنید و به این صورت قرار بدید. در مثال شما length=57 قرار بدید.
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) {
int length = 28;
String user = "MyUsername", pass="MyPassword";
ByteBuffer byteBuffer=ByteBuffer.allocate(length);
byteBuffer.putInt(length);
byteBuffer.put(fixedSizeByteArray( user.getBytes( StandardCharsets.US_ASCII ) ,11));
byteBuffer.put(fixedSizeByteArray( pass.getBytes( StandardCharsets.US_ASCII ) ,13));
for(int j=0;j<length;j++){
System.out.print(byteBuffer.get(j)+" ");
}
}
private static byte[] fixedSizeByteArray(byte[] arr,int size){
byte[] fixedArray=new byte[size];
for(int i=0;i < arr.length && i<size;i++){
fixedArray[i]=arr[i];
}
return fixedArray;
}
}
mosi20
چهارشنبه 14 مهر 1395, 11:38 صبح
دستت درد نکنه
به محض اینکه شد تستش میکنم
خدا خیرت بده
==
فقط این octet string of username این را من گشتم یک چیزی پیدا کردم ولی نمیدونم چجوری تو این حالت اونا بفرستم
میتونید اینم راهنماییم کنید؟
در موردش اینا توضیح داده
C-Octet String A series of characters terminated with the NULL (0x00) character.
C-Octet String (Decimal) A decimal numeral character string terminated with the NULL character.
C-Octet String (Hex) A series of hexadecimal characters terminated with the NULL character.
خودم اینا براش پیدا کردم
OctetString AccountName_octetString = new OctetString(AccountName);
باید اولش اینا بزارید import org.snmp4j.smi.OctetString; ولی تو این حالت نتونستم با byteBuffer.put بفرستمش
باید با چی بفرستمش؟
mosi20
چهارشنبه 14 مهر 1395, 12:23 عصر
قسمت header و body را چجوری باید بفرستم؟باید تفکیک کنم و بفرستم یا همش را تویه یه پاکت بفرستیم؟
اونی که نوشته reserved را باید خالی بفرستم؟
vahid-p
چهارشنبه 14 مهر 1395, 15:32 عصر
باید اولش اینا بزارید import org.snmp4j.smi.OctetString; ولی تو این حالت نتونستم با byteBuffer.put بفرستمش
خب شما یک کلاس از کتابخانه خارجی استفاده کردید و ByteBuffer هر نوعی رو که ساپورت نمیکنه. میتونی اون رو به یک آرایه تبدیل کنی بعد بفرستی. اگر همچین متدی داره.
ولی C-Octet اگر منظورش اینه، خب کافیه بعد از آخرین کاراکتر یک 0 قرار بدی. تو این کدی که من نوشتم به صورت پیشفرض تمام خونه هایی که مقدار دهی نمیشن 0 هست پس نیازی به اینکار نیست. مگر اینکه ممکنه مثلا user دقیقا برابر 11 حرف یا بیشتر باشه، و آخرین کاراکتر رو تغییر بده، برای اینکار میتونی هر کدوم یک عدد 0 در اخر بهش اضافه کنی. مثلا متد رو اینجوری تغییر بدی:
private static byte[] fixedSizeByteArray(byte[] arr,int size){ byte[] fixedArray=new byte[size];
for(int i=0;i < arr.length && i<size;i++){
fixedArray[i]=arr[i];
}
fixedArray[size-1]=0;
return fixedArray;
}
در این حالت ماکزیمم مقدار برای username تعداد 10 کاراکتر و password تعداد 12 کاراکتر خواهد بود. تصور من اینه دیگه نمیدونم منظورش دقیقا چی بوده.
قسمت header و body را چجوری باید بفرستم؟باید تفکیک کنم و بفرستم یا همش را تویه یه پاکت بفرستیم؟
اینم بستگی به خودت داره. من که میگم یه جا بفرست. وقتی اندازه هر پارامتر مشخصه، مشکلی پیش نمیاد. ولی بازم هر جور بگی میشه تصور کرد، بلاخره این چیزیه که باید بگن یا به اختیار خودت بذارن.
اونی که نوشته reserved را باید خالی بفرستم؟
به احتمال زیاد. به هر حال از رو این جدول نمیشه هیچی رو با قطعیت گفت. بلاخره همش میشه فرضیات خودت وقتی صورت مسئله مشخص نباشه.
mosi20
چهارشنبه 14 مهر 1395, 15:37 عصر
خیلی ممنون
خیلی کمک کردی منم تقریبا به همچین کدی رسیده بودم ولی شک داشتم
حالا باید برم وقت بزارم و رویه ریز کاری هاش تست کنم
متاسفانه تا چند روز دیگه امکان تست برام وجود نداره
به محض اینکه دسترسیم را باز کردند تست میکنم و اگر مشکلی بود ازتون میپرسم
دستتون درد نکنه
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.