View Full Version : سوکت با واسطه
pro_mvb
سه شنبه 01 اسفند 1391, 15:56 عصر
سلام
یه برنامه ای داریم که از 3 قسمت کلی تشکیل میشه. کار برنامه اینه که یه مقدار رو از طریق سوکت به سرور برسونه!
حالا این وسط ما یه واسط داریم برای اینکه کلاینت و سرور به طور مستقیم با هم وصل نباشن.
هدف اینه که کلاینت به مثلا پورت 123 واسط وصل بشه و یه مقداری رو روی stream مربوطش بنویسه.
از اونور هم سرور هم به پورت 123 واسط وصل میشه و قصدش اینه که مقداری رو که کلاینت فرستاده از روی واسط بخونه!
اما نمیشه!
مشکل به نظرم به خاطر این هست که وقتی کلاینت به واسط وصل میشه و چیزی رو write میکنه این مقدار در stream مربوط به خودش و واسط هست. درسته که سرور به واسط وصل میشه اما از طریق streamای که فقط خودش و واسط هست
(مثل 2 نی در یک لیوان)
راه حل چیه ؟:متفکر:
مرسی
dracula_killer
سه شنبه 01 اسفند 1391, 19:16 عصر
نمیشه دوتا سوکت برای واسط نوشت؟
یکی برای ارسال داده به سرور و دیگری دریافت داده از کلاینت؟
pro_mvb
چهارشنبه 02 اسفند 1391, 12:51 عصر
شدن میشه ولی کار قشنگی نیست!
اجرای برنامه یه چیز هست این که به چه صورت و چه نظم و معماری کد برنی یه چیز دیگه!
تا اونجایی که فهمیدم اگه از udp به جای tcp استفاده بشه وقتی مقداری رو دریافت کنه ، واسط اون مقدار رو broadcast میکنه برای همه. اما خوب من هدفم udp نیست!
کسیم اینجا که کمکی نمیکنه!!1
L u k e
چهارشنبه 02 اسفند 1391, 14:11 عصر
:دی
ببین در این معماری که گفتی
واسط ه نقش سرور رو اجرا می کنه و اون 2 تا کلاینت
که وقتی یه پیغامی دریافت می کنه به سوکت دومی می فرسته
sina_oonline
چهارشنبه 02 اسفند 1391, 15:32 عصر
من مشکل شما را دقیقا متوجه نشدم؟
اما هر سری واسط خونده هاشو به همراه بیت های valid/invalid یه جایی به عنوان متغیر یا توی دیتابیس نگه داره از اون ور اون یکی سوکت بخونه از این متغیر و دیبی و بده به سرور دیگه
مشکل این چیه؟
pro_mvb
چهارشنبه 02 اسفند 1391, 15:44 عصر
:دی
ببین در این معماری که گفتی
واسط ه نقش سرور رو اجرا می کنه و اون 2 تا کلاینت
که وقتی یه پیغامی دریافت می کنه به سوکت دومی می فرسته
حرفت درسته بعدا خودم فهمیدم ولی اینجا دیگه ادیت نکردم.
در مورد database هم مسئله اینجاس که قرار نیست دیتا بیسی وجود داشته باشه و یا از طریق سوکت دیگه ای خونده بشه !
dracula_killer
چهارشنبه 02 اسفند 1391, 19:10 عصر
چه جالب الان درباره ی پروژه ی خودم هم دقیقا به همین مشکل برخوردم
دوستان اگه نظری دارین لطفا کمک کنید به دوستمون که سوالشون بسیار کاربردیه
pro_mvb
جمعه 04 اسفند 1391, 15:03 عصر
من یه چنین راهی رو در نظر گرفتم راهنمایی کنین آیا عاقلانست؟
در سمت سرور 2 کلاس داریم به نام های ArrayRead و Listener که در کلاس listener ما روی پورت در حال listen هستیم،
حالا
زمانی که کلاینت 1 به سرور وصل میشه موقع اتصال به سرور یه string رو هم میفرسته به نام responser که با این کار خودش رو سمت سرور معرفی میکنه سرور وقتی میبینه مقدار ورودی responser هست از کلاس ArrayRead یه obj میسازه و سوکت کلاینت رو هم بهش پاس میده!
در سمت کلاس ArrayRead یه حلقه while(true) هست که مدااااام داره بررسی میکنه آیا ArrayList که وجود داره خالیه یا مقدار داره؟ (ااین arraylist به صورت static در کلاس Listener تعریف شده) و زمانی که arraylist مقدار دار شد سریع مقدار شو روی سوکتی که بهش پاس داده بودیم (یعنی socket بین کلاینت 1 و سرور) می نویسه!
اینم بگم که مقدار این arraylist توسط کلاینت 2 پر میشه به این صورت که ووقتی به سرور وصل میشه یه مقداریو به سرور میفرسته (string) سرور نگاه میکنه میبینه که خوب این مقدار عبارت responser نیست پس مقدار رو میریزه داخل arraylist و دوباره منتظر میشه که اطلاعات بعدی رو براش بفرستن ( DataInputStream.readUTF)
پس به این ترتیب تا به اینحا یه مقداریو که از کلاینت 2 اومده به سمت کلاینت 1 میفرسیتم!
اما مسئله اصلی اینجاس که وقتی من از کلاینت 1 ، وقتی مقدار روی سوکت رو گرفتم و مثلا پردازشش کردم موقعی که دوباره میگم بریزش به روی سوکت تا به سرور منتقل بشه ،( DataInputStream.writeUTF) این کارو انجام میده اما سرور مقدار رو نمیگیره انگار که مقداری فرستاده نشده!
اینجاشو گیر کردم نمیدونم چرا همچین اتفاقی میافته؟
درضمن بگین آیا این مکانیزمی که برای ردو بدل کردن data بین 2 کلاینت مد نظر گرفتم شیوه صحیح و خوبی هست؟
pro_mvb
جمعه 04 اسفند 1391, 20:14 عصر
package jspider;
import java.net.*;
import java.io.*;
import java.util.Vector;
public class Listener {
ServerSocket server_socket;
Socket client_socket;
static Vector<String> arr=new Vector();
static Vector arr_read=new Vector();
public Listener() {
try {
server_socket = new ServerSocket(1322);
while (true) {
client_socket = server_socket.accept();
new RequestHandler(client_socket).start();
}
} catch (IOException io) {
io.printStackTrace();
}
}
private static class RequestHandler extends Thread {
String data_read="";
Socket client_socket;
String path;
ObjectInputStream in_obj;
ObjectOutputStream out_obj;
public RequestHandler(Socket client_socket) {
this.client_socket = client_socket;
}
public void run() {
try {
DataInputStream in_data = new DataInputStream(client_socket.getInputStream());
// DataOutputStream out_data=new DataOutputStream(client_socket.getOutputStream());
// ObjectOutputStream out_obj=new ObjectOutputStream(client_socket.getOutputStream() );
while(client_socket!=null){
data_read= in_data.readUTF();
System.out.println("first da`ta_read is: "+data_read);
if(data_read.equals("responser")){
new ArrayReader(client_socket);
}else if (data_read.equals("result")) {
try{
in_obj=new ObjectInputStream(client_socket.getInputStream());
arr_read=(Vector)in_obj.readObject();
System.out.println("arr_Read khande shod");
for(int i=0;i<arr_read.size();i++)
System.out.print("meghdare arr_read "+arr_read.get(i));
}catch(Exception e){
e.printStackTrace();
}
}
if(!data_read.equals("responser")){
if(!data_read.equals("result"))
arr.add(data_read);
}
}
} catch (IOException io) {
io.printStackTrace();
}
}
}
}
package jspider;
import java.io.*;
import java.net.*;
public class ArrayReader extends Thread {
private Socket client_socket;
String path;
DataOutputStream out_data;
public ArrayReader(Socket client_socket) {
try{
this.client_socket=client_socket;
out_data=new DataOutputStream(client_socket.getOutputStream());
Thread thread =new Thread(this);
thread.start();
}catch(Exception e){
e.printStackTrace();
}
}
public void run(){
Listener.arr.add("drive");
while(client_socket!=null){
if(!Listener.arr.isEmpty()){
try{
path=Listener.arr.get(0);
out_data.writeUTF(path);
Listener.arr.remove(0);
}catch(IOException io){
io.printStackTrace();
}
}
}
}
}
spiderman200700
شنبه 05 اسفند 1391, 01:05 صبح
اینم کد همون شکلی که بهت دادم:
package server;
import java.io.DataInputStream;
import java.io.DataOutputStream;
/**
*
* @author omidfaraji
*/
public interface Client{
public DataInputStream getDataInputStream();
public DataOutputStream getDataOutputStream();
}
package server;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author omidfaraji
*/
public class ClientHandller implements Runnable, Client {
private DataInputStream dataInputStream;
private DataOutputStream dataOutputStream;
private Socket client_socket;
public ClientHandller(Socket client_socket) {
try {
this.client_socket = client_socket;
dataInputStream = new DataInputStream(client_socket.getInputStream());
dataOutputStream = new DataOutputStream(client_socket.getOutputStream());
} catch (IOException ex) {
Logger.getLogger(ClientHandller.class.getName()).l og(Level.SEVERE, null, ex);
}
}
public void start() {
new Thread(this).start();
}
@Override
public DataInputStream getDataInputStream() {
return dataInputStream;
}
@Override
public DataOutputStream getDataOutputStream() {
return dataOutputStream;
}
@Override
public void run() {
while (client_socket != null) {
try {
String sendData = dataInputStream.readUTF();
String recivedData = Listener.MAIN_CLIENT_HANDLLER.sendAndReciveDataWit hServer(sendData);
dataOutputStream.writeUTF(recivedData);
} catch (IOException ex) {
Logger.getLogger(ClientHandller.class.getName()).l og(Level.SEVERE, null, ex);
}
}
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package server;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author omidfaraji
*/
public class MainClientHandller implements Client {
private DataInputStream dataInputStream;
private DataOutputStream dataOutputStream;
public MainClientHandller(Socket client_socket) {
try {
dataInputStream = new DataInputStream(client_socket.getInputStream());
dataOutputStream = new DataOutputStream(client_socket.getOutputStream());
} catch (IOException ex) {
Logger.getLogger(ClientHandller.class.getName()).l og(Level.SEVERE, null, ex);
}
}
public synchronized String sendAndReciveDataWithServer(String data) throws IOException {
dataOutputStream.writeUTF(data);
return dataInputStream.readUTF();
}
@Override
public DataInputStream getDataInputStream() {
return dataInputStream;
}
@Override
public DataOutputStream getDataOutputStream() {
return dataOutputStream;
}
}
package server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
/**
*
* @author omidfaraji
*/
public class Listener {
public static final Vector<Client> CLIENTS_HANDLLERS = new Vector();
public static MainClientHandller MAIN_CLIENT_HANDLLER = null;
public Listener() {
try {
ServerSocket server_socket = new ServerSocket(1322);
while (true) {
Socket client_socket = server_socket.accept();
Client ch = new ClientHandller(client_socket);
String firsData = ch.getDataInputStream().readUTF();
if (firsData.trim().equals("MainClient")) {
MAIN_CLIENT_HANDLLER = new MainClientHandller(client_socket);
} else if (firsData.trim().endsWith("Client") && MAIN_CLIENT_HANDLLER != null) {
CLIENTS_HANDLLERS.add(ch);
((ClientHandller) ch).start();
}
}
} catch (IOException io) {
io.printStackTrace();
}
}
}
این کل کد سرور هست.
البته کد خلی سادس و فقط برای اینه که کار رو درک کنی. در خیلی جاها باید امنیت رو بالا ببری که یکی از مهمترین جاها وقتیه که نوع کلاینتی که به سرور وصل میشه رو میخوای بفهمی .
امیدوارم مشکلتو حل کنه :چشمک:
pro_mvb
شنبه 05 اسفند 1391, 10:32 صبح
اول ازت تشکر کنم چون واقعا زحمت کشیدی و وقت گذاشتی کد زدی! خیلییییییییی واقعا ازت ممنون هستم
دوم اینکه کی گفته این کدش سادست ؟ :بامزه:
سوم اینکه نحوه کارو دیدم خیلی جالبه نحوه کار ClientHandler خیلی جالبه و باید اعتراف کنم در مورد اون objecte استاتیک MainClientHandler خیلی جالب و با خلاقیت عمل کردی و عمرا به ذهن خودم نمیرسید.
در کل روشی که استفاده کردی خیلی جالبه ولی خوب باعث شد از خودم نا امید بشم .:ناراحت:
spiderman200700
شنبه 05 اسفند 1391, 12:12 عصر
خواهش میکنم.
به هر حال امیدوارم به دردت خورده باشه
موفق باشی
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.