View Full Version : سوال: گرفتن یک مقدار از کاربر و انتقال آن از طریق socket و استریم به سمت سرور و ذخیره آن در یک String
pro_mvb
پنج شنبه 14 دی 1391, 23:07 عصر
سلام
من یه چیز ساده میخوام
اونم اینه که مثلا من سمت کلاینت هرچی میزنم از طریق socket و استریم فرستاده بشه روی یک پورت و آی پی
و سرور اون مقدار رو بگیره و مثلا بریزه در یک متغیر string
اینم بگم که نمیخوام فقط یک بار این مقدار گرفته بشه یعنی مثلا سری اول میزنم salam بعد از enter سرور مقدار رو میگیره و طبق اون متغیر کاراشو انجام میده. و بعد از اتمام منتظر گرفتن کلمه بعدی باشه
من یه همچین کاری کردم اما هرچی میزنم اصلا سمت سرور نمیره:
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
try{
Socket socket=new Socket("127.0.0.1",1368);
OutputStream os= socket.getOutputStream();
PrintWriter out = new PrintWriter(os,true);
out.println(sc.next());
socket.close();
os.close();
out.close();
و اینم کد سرور:
try{
ServerSocket listener = new ServerSocket(1234);
System.out.println("server is ready for request......");
Socket socket=listener.accept();
InputStream is=socket.getInputStream();
int c;
while((c=is.read())!= -1){
System.out.printf("%c",c);
socket.close();
is.close();
}
البته در این کد من دارم چاپ میکنم چون بلد نبودم چطوری خروجی is.read رو بریزم داخل string.
امیدوارم زودی جواب بدین :قلب:
ممنون
spiderman200700
جمعه 15 دی 1391, 03:44 صبح
سلام
باید از Thread استفاده کنی
در مورد کار با Thread ها مطالعه کن
باید کارت رو توی یه Thread انجم بدی که بدون درگیر کردن برنامه ، یه صورت موازی منتظر فرستادن پاسخ از سمت فرستنده باشه
pro_mvb
جمعه 15 دی 1391, 12:58 عصر
اوکی باید مطالعه کنمش
اما الان میخوام حداقل برنامه برای یک بار اجرا بشه و فقط یک مقدار string رو از طرف client به سرور بفرستم و اون مقدار در سمت سرور در یک متغیر string ذخیره کنم.
چطوری می تونم؟
چون من فقط اینو بلدم
System.out.printf("%c",c);
spiderman200700
جمعه 15 دی 1391, 14:33 عصر
همون کدی که نوشتی درسته، تنها ایرادش اینه که شماره Port در سمت کلاینت و سرور مشابه نیست. اینطوری باید بنویسی:
Socket socket=new Socket("127.0.0.1",1234);//client
ServerSocket listener = new ServerSocket(1234);//server
pro_mvb
جمعه 15 دی 1391, 16:40 عصر
ono dorostesh kardam
alan ye moshkel ke daram ine ke man daram ye String az client mifrestam samte server hala mondam too server InputStream.read ro chetori be halate String bekhonam (yani chetori berziamesh too ye STRING)
its client:
Scanner sc= new Scanner(System.in);
System.out.print("enter name");
String a=sc.next();
try{
Socket socket=new Socket("127.0.0.1",1368);
System.out.print("connected to server...........");
OutputStream os= socket.getOutputStream();
PrintStream printstream= new PrintStream(os);
printstream.print(a);
os.close();
server:
try{
ServerSocket listener = new ServerSocket(1368);
System.out.println("server is ready for request......");
Socket socket=listener.accept();
InputStream is=socket.getInputStream();
int c;
System.out.println("az roo socket khond");
System.out.println(is.available());
while((c=is.read())!= -1){
//System.out.printf("%c",c);
این قسمت چطوری باید مقدار رو بریزم داخل یک String????
//socket.close();
is.close();
spiderman200700
جمعه 15 دی 1391, 17:25 عصر
اینطوری:
StringBuilder sb=new StringBuilder();
while((c=is.read())!=-1){
sb.append((char)c);
}
System.out.println(sb);
pro_mvb
شنبه 16 دی 1391, 11:31 صبح
یه سوال
من میخوام وقتی سمت سرور خروجی رو تولید کرد output کنه روی همین پورتی که کلاینت بهش وصله اما مشکل اینجاس وقتی کلاینت مقدارشو میفرسته سمته سرور باید out.close کنه تا سرور کاره inputاش رو بتونه به پایان برسونه ، خوب وقتیم که ما out.close کنیم دیگه scoket بسته میشه و امکان اینکه خروجی پردازش سرور رو روی همون socket سمت کلاینت ببینیم نداریم.
درواقع من میخوام socket باز بمونه به حالتی که من یه چی به سرور میدم و سرور هم یه چیز به من میده!
چطوری میشه؟
(آیا باید از thread استفاده کرد؟ )
ممنون
spiderman200700
شنبه 16 دی 1391, 13:42 عصر
یه نگاهی به این بنداز. بدون بستن ارتباط سوکت دیتا رو انتقال میده.
public static void main(String args[]) throws IOException {
new Thread(new Runnable() {
@Override
public void run() {
try {
ServerSocket listener = new ServerSocket(1368);
System.out.println("server is ready for request......");
Socket socket = listener.accept();
InputStream is = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(is);
System.out.println("from client: " + dataInputStream.readUTF());
} catch (IOException ex) {
Logger.getLogger(getClass().getName()).log(Level.S EVERE, null, ex);
}
}
}).start();
Socket csocket = new Socket("127.0.0.1", 1368);
System.out.print("connected to server...........");
OutputStream os = csocket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(os);
Scanner sc = new Scanner(System.in);
System.out.print("\nenter name: ");
String a = sc.next();
dataOutputStream.writeUTF(a);
dataOutputStream.flush();
}
pro_mvb
شنبه 16 دی 1391, 15:10 عصر
اوم والا من هنوز thread رو نخوندم ولی چیزی که از این کد متوجه شدم اینه که کلاینت همزمان داره روی پورت و ای پی خودش listen میکنه و همینطور به پورت مربوطه سرور وصل شده و داده خودش رو سمت سرور وارد میکنه. و همچنان منتظر تا سرور بهش وصل بشه و مقادیرشو بفرسته رو پورتش(یعنی رو کلاینت)
اول بگین این چیزی که من فهمیدم درسته؟
اگه درست باشه باید بگم هدف من چیز دیگه ای هست.
من میخوام سرور خروجی خودش رو بریزه روی پورت خودش بعد من از کلاینتم از روی پورتش ایندفعه جای output کردن input کنم.
spiderman200700
شنبه 16 دی 1391, 16:30 عصر
درسته.
ولی من فقط برای تست اینجوری کد نوشتم. شما میتونی قسمت سرور رو ببری روی یه سیستم دیگه اجرا کنی و از این کد حذفش کنی.
یعنی کد سرور این میشه:
ServerSocket listener = new ServerSocket(1368); System.out.println("server is ready for request......");
Socket socket = listener.accept();
InputStream is = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(is);
و کد کلاین این میشه:
Socket csocket = new Socket("127.0.0.1", 1368); System.out.print("connected to server...........");
OutputStream os = csocket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(os);
Scanner sc = new Scanner(System.in);
System.out.print("\nenter name: ");
String a = sc.next();
dataOutputStream.writeUTF(a);
dataOutputStream.flush();
البته من فقط به این خاطر از Thread استفاده کردم که بتونم کد کلایت و سرور رو همزمان توی یه برنامه اجرا کنم. یعنی برای یه بار دریافت و ارسال داده ، حتما نیازی به Thread نیست.
pro_mvb
شنبه 16 دی 1391, 17:22 عصر
اول یه سوال وقتی کلاینت به پورت 1368 سرور وصل میشه پورت 1368 خودشم busy میشه؟
پس اگه busy میشه همزمان روی1368 نمیشه هم listen کرد (که شاید روش چیزی نوشته بشه که بخواد بخونه) و هم اینکه خودش اول از طریق اون پرت یه چی برای سرور بنویسه!؟
spiderman200700
شنبه 16 دی 1391, 20:29 عصر
ببین. وقتی یه سرور یه پورت رو در اختیار میگیره، اون پورت اشغال میشه، ولی بی نهایت کلاینت میتونن از اون سرور با همون پورت خدمات دریافت کنن (بهش وصل بشن).
امیدوارم جوابتو گرفته باشی. به نظرم باید روی مفاهیم سوکت بیشتر مطالعه داشته باشی
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.