Серверные сокеты Java: Мой серверный сокет разрешает только клиентские подключения, работающие с тем же Интернет-соединением? - PullRequest
0 голосов
/ 31 января 2012

Хорошо, поэтому я построил рабочий пример клиента и сервера, который может принимать несколько клиентских подключений.Моя проблема в том, что я не могу подключиться к клиенту, который не использует то же подключение к Интернету, что и сервер, на котором размещен сервер.Возможно ли это с помощью серверных сокетов?

Вот код для моего сервера:

import java.io.IOException;
import java.net.*;

public class MultipleSocketServer {

public static Socket connection;
public static String name = "Tyler's Server";
public static int limit = 2;
public static Thread[] clients = new Thread[limit];
public static int current = 0;
public static int port = 25565;
public static String[] connected = new String[limit];
public static ServerSocket socket;

public static void main(String[] args) {
    System.out.println("Server starting...");
    for(int i = 0; i < limit; i++) {
        connected[i] = "";
    }
    try {
        ServerSocket socket = new ServerSocket(port);
        while(true) {
            Socket connection = socket.accept();
            String ip = connection.getRemoteSocketAddress().toString().substring(1, 13);
            loop:
            for(int i = 0; i < connected.length; i++) {
                if(connected[0].equals(ip) || connected[1].equals(ip)) {
                    break loop;
                }else if(!connected[i].equals(ip)) {
                    connected[i] = ip;
                    MultiServer_Client client = new     MultiServer_Client(connection, i);
                    Thread run = new Thread(client);
                    run.start();
                    break loop;
                }
            }
        }
    } catch (IOException e1) {
        System.out.println("Could not bind server on: " + port);
        System.exit(-1);
    }
}
}

А вот и все остальное:

import java.io.*;
import java.net.Socket;

public class MultiServer_Client implements Runnable {

public String time;
public Socket client;
public StringBuffer process = new StringBuffer();

public BufferedInputStream inputStream;
public InputStreamReader reader;

public BufferedOutputStream outputStream;
public OutputStreamWriter writer;

public StringVis check = new StringVis("");
public StringChangeListener checkListener = new StringChangeListener() {
    public void textChanged(StringChangeEvent e) {
        System.out.println("Changed");
        write("Server recieved message...");
    }
};

public boolean connected = true;
public int ID;

public MultiServer_Client(Socket connection, int i) {
    client = connection;
    ID = i;
    try {
        //declare text input/output
        inputStream = new BufferedInputStream(client.getInputStream());
        reader = new InputStreamReader(inputStream);
        outputStream = new BufferedOutputStream(client.getOutputStream());
        writer = new OutputStreamWriter(outputStream, "US-ASCII");
    } catch (IOException e) {
        System.out.println("IOException: " + e);
    }
    System.out.println(MultipleSocketServer.connected[ID] + " connected...");
    write("Connected to " + MultipleSocketServer.name);
}

public void run() {
    while(connected) {
        read();
    }
    System.out.println("Disconnecting client...");
}

public void write(String authen) {
    try {
        time = new java.util.Date().toString();
        String message = time + ": " + authen + (char) 13;
        writer.write(message);
        writer.flush();
    } catch (IOException e) {
        connected = false;
        MultipleSocketServer.connected[ID] = "";
    }
}

public void read() {
    //read from client
    int character;
    process = new StringBuffer();
    try {
        while ((character = reader.read()) != 13) {
            process.append((char) character);
        }
        check.setText(process.toString());
        process.delete(0, process.length());
    } catch (IOException e) {
        connected = false;
        MultipleSocketServer.connected[ID] = "";
    }
}
}

Вот код клиента:

import java.net.*;
import java.util.Scanner;
import java.io.*;

public class SocketClient {

public static String host = "69.182.134.79";
public static int port = 25565;

public static void main(String [] args) {
    StringBuffer imports = new StringBuffer();
    String time;
    System.out.println("Client starting...");

    try {
        //establish client
        InetAddress address = InetAddress.getByName(host);
        Socket connection = new Socket(address, port);

        BufferedOutputStream bos = new     BufferedOutputStream(connection.getOutputStream());
        OutputStreamWriter osw = new OutputStreamWriter(bos, "US-ASCII");

        BufferedInputStream bis = new     BufferedInputStream(connection.getInputStream());
        InputStreamReader isr = new InputStreamReader(bis, "US-ASCII");

        while(true) {
            Scanner scan = new Scanner(System.in);
            String message = scan.nextLine();

            //write to server
            time = new java.util.Date().toString();
            String process = host + ":" + port + " sent data at " +     time + ": " + message + (char) 13;
            osw.write(process);
            osw.flush();

            //read from server
            int c;
            while ((c = isr.read()) != 13) {
                imports.append((char) c);
            }
            System.out.println(imports);
            imports.replace(0, imports.length(), "");

            if(message.equals("--EXIT")) {
                connection.close();
            }
        }

    } catch (UnknownHostException e) {
        System.out.println("UnknownHostException: " + e);
    } catch (IOException e) {
        System.out.println("IOExcepion: " + e);
    }
}
}

1 Ответ

1 голос
/ 31 января 2012

Изменить

MultiServer_Client client = new MultiServer_Client(connection, i);

на

MultiServer_Client client = new MultiServer_Client(new Socket([Server IP], port), i);

Это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...