السلام عليكم ..
عندي مشكلة أتمنى ان تكون بسيطة في Socket . وهي كالتالي :
برنامج يتكون من ثلاث أقسام و هم Server1 و Server2 و Client
طريقة لإتصال بالشكل التالي :
Server1 هو الخادم الرئيسي ويقدم خدمة معينة.
Server2 خادم ثاني و يقدم خدمة ثانية , وفي نفس اللحظة متصل مع الخادم الأول Server1
Client متصل مع Server2 .
يقوم Client بطلب الخدمة من Server2 فإن كانت موجودة الخدمة عليه يتم الإرسال الخدمة و هي في البرنامج الرسالة التالية : Server2 serve you..
في حال أن Client ارسل إلى Server2 الإشارة التالية "+" يعني أن الخدمة موجود على Server1 , و من المفترض أن يرسل Server1 الرسالة التالية : Server1 serve you..
إلى Server2 , بدوره Server2 يرسلها إلى Client .
المشكلة :
تكمن المشكلة في أنه في حالة ارسال الإشارة الدالة على أن الخدمة متوفرة على Server1 و هي إشارة "+" , فإنه يتم إرسال رد لـ Client بنجاح ,, لكن فقط لمرتين , وبعد المرتين لايكون هناك أي رد
الكود :
Server1
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server1 {
ServerSocket srv;
public Server1() throws IOException{
srv = new ServerSocket(12500);
System.out.println("Server1 : Prepare Connection at 12500 PORT ");
System.out.println("Server1 : wail.. for Server2 ");
Socket socket = srv.accept();
System.out.println("Server1 : Accept Server2 ");
DataInputStream read = new DataInputStream(socket.getInputStream());
DataOutputStream write = new DataOutputStream(socket.getOutputStream());
while(true){
String value = read.readUTF();
write.writeUTF("Server1 serve you..");
}
}
public static void main(String[]args) throws IOException{
new Server1();
}
}Server2
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Server2 {
ServerSocket srv;
DataOutputStream mainOut;
DataInputStream mainIn;
public Server2() throws IOException{
Socket cs = new Socket(InetAddress.getLocalHost(), 12500);
mainOut = new DataOutputStream(cs.getOutputStream());
mainIn = new DataInputStream(cs.getInputStream());
srv = new ServerSocket(6500);
System.out.println("Server2 : Prepare PORT 6500 ");
while( true ){
System.out.println("Server2 : wail.. ");
Socket socket = srv.accept();
System.out.println("Server2 : accept new client ");
DataInputStream in = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
Thread2 t = new Thread2(in, out);
Thread t2 = new Thread(t);
t2.start();
}
}
public static void main(String[]args) throws IOException{
new Server2();
}
public class Thread1 implements Runnable{
DataOutputStream out;
public Thread1(DataOutputStream out) throws IOException{
this.out = out;
}
public void run(){
while(true){
try {
String resp = mainIn.readUTF();
out.writeUTF(resp);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
public class Thread2 implements Runnable{
DataInputStream in;
DataOutputStream out;
public Thread2(DataInputStream in,DataOutputStream out) throws IOException{
this.in = in;
this.out = out;
}
public void run(){
while(true){
try {
String value = in.readUTF();
if (value.equals("+")) {
java.lang.Thread t = new java.lang.Thread(new Thread1(out));
t.start();
mainOut.writeUTF(value);
}
else
out.writeUTF("Server2 serve you..");
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
}Client
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Client extends Thread{
static Socket socket;
static DataOutputStream out;
static DataInputStream in;
public static void main(String[]args) throws IOException{
socket = new Socket(InetAddress.getLocalHost(), 6500);
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
Client c = new Client();
c.start();
Scanner scn = new Scanner(System.in);
System.out.println("Client>> ");
String value = scn.next();
System.out.println("Client>> ");
while(!value.equals("exit")){
out.writeUTF(value);
out.flush();
System.out.println("Client>> ");
value = scn.next();
}
System.exit(0);
}
@Override
public void run(){
while(true){
try {
System.out.println(in.readUTF());
} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}