2012-01-30 61 views
-2

好的,我構建了一個可以接受多個客戶端連接的客戶端和服務器的工作示例。我的問題是,我無法連接與運行服務器的客戶端不同的客戶端。這可能使用服務器套接字嗎?Java服務器套接字:我的服務器套接字只允許客戶端連接在同一個Internet連接上運行?

這裏是我的服務器代碼:

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); 
    } 
} 
} 
+0

定義_same互聯網連接_還有,您的服務器託管在哪裏? (在家中,數據中心等) – 2012-01-30 23:09:38

+0

與服務器中的相同Internet連接正在運行在我家互聯網上,並且我的客戶端也只能在連接到我家互聯網時才連接 – MrDrProfessorTyler 2012-01-30 23:10:40

+0

因此,您無法從哪裏連接,外部你的局域網?如果是這樣,你是否轉發了必要的端口等? – 2012-01-30 23:11:34

回答

1

變化

MultiServer_Client client = new MultiServer_Client(connection, i);

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

這應該工作。

+0

MultiServer_Client對象傳遞連接套接字,因爲這是需要接受的傳入客戶端連接。我試過,但客戶端沒有連接。 – MrDrProfessorTyler 2012-01-30 23:17:19

+0

我需要從客戶端使用我的電腦的外部IP嗎? – MrDrProfessorTyler 2012-01-30 23:23:19

+0

是的。如果您從外部客戶端訪問,則必須使用服務器的互聯網IP。 Buf如果你在同一臺服務器上訪問,localhost OR 127.0.0.1應該可以工作。 – 2012-01-30 23:30:07

相關問題