2012-04-14 2 views
0

Мой последний проект для класса - собрать игру, в том числе многопользовательскую. Поэтому я начал пытаться выяснить, как создать java-сеть, и я как бы застрял.Java Networking - клиент/сервер

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

Как я понял, я бы справился с этим, так это то, что у меня есть объекты NetworkServer и NetworkClient, которые работают в своих потоках.

Я думал, что я бы просто начать их от моего основного приложения игры, но я хотел бы сделать некоторые испытания первой, поэтому я этот проект до:

NetworkClient:

import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.net.Socket; 
import java.util.Timer; 
import java.util.TimerTask; 


public class NetworkClient extends Thread { 

    Socket server; 
    ObjectOutputStream out; 
    Timer timer; 


    public NetworkClient(String hostname, int port) throws IOException 
    { 
     server = new Socket(hostname, port); 
     out = new ObjectOutputStream(server.getOutputStream()); 
     timer = new Timer(); 
     timer.schedule(new SendTask(), 0, 1*1000); 
    } 

    public void sendData(Integer b) throws IOException { 
     out.writeObject(b); 
    } 



    class SendTask extends TimerTask { 
     Integer i = new Integer(1); 

     public void run() { 
      System.out.println("Client: Sending Integer: " + i.toString()); 
      try { 
       sendData(i); 
       i = new Integer(i.intValue()+1); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } // run() 
    } // class SendTask 

} 

NetworkServer:

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.SocketTimeoutException; 


public class NetworkServer extends Thread { 

    private ServerSocket serverSocket; 
    private Socket client; 
    private Integer i; 
    private ObjectInputStream in; 

    public NetworkServer(int port) throws IOException 
    { 
     serverSocket = new ServerSocket(port); 
     //serverSocket.setSoTimeout(10000); 
    } 

    public void run() 
    { 
     try { 
     System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "..."); 
     client = serverSocket.accept();   
     System.out.println("Just connected to " + client.getRemoteSocketAddress()); 
     in = new ObjectInputStream(client.getInputStream()); 
     } catch (IOException e2) { 
      // TODO Auto-generated catch block 
      e2.printStackTrace(); 
     } 

     while(true) 
     { 

      try 
      { 
      i = (Integer) in.readObject(); 
      System.out.println("Server: Received the integer: " + i.toString()); 
      } 
      catch(SocketTimeoutException s) 
      { 
      System.out.println("Socket timed out!"); 
      break; 
      } 
      catch(IOException e) 
      { 
      e.printStackTrace(); 

      try { client.close();} catch (IOException e1) {} 

      break; 
      } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     } 
    } 

} 

Сеть (Дело в том, я использую, чтобы попытаться проверить это):

import java.io.IOException; 


public class Network { 

    NetworkClient client; 
    NetworkServer server; 

    public Network() throws IOException { 
     server = new NetworkServer(6066); 
     server.start(); 

     client = new NetworkClient("192.168.1.196", 6066); 
     client.start(); 
    } 

    public static void main(String [] args) 
    { 
     try 
     { 
      Network n = new Network(); 
     }catch(IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

} 

У меня есть таймер в там, чтобы облегчить отправку данных от клиента к серверу, который обычно делается с помощью моей игры, но так как Я тестирую, мне нужно было как-то отправить его.

Когда я запускаю это, когда клиент и сервер разговаривают друг с другом, я получаю как отправленные, так и полученные сообщения.

Когда я положил его на свой ноутбук (и изменил IP-адрес в NetworkClient в соответствии с моим рабочим столом и наоборот на своем рабочем столе) и запустил его в обоих местах, клиент на рабочем столе отправляет серверу на ноутбук, но клиент на ноутбуке не отправляет сервер на рабочий стол.

И в какой-то момент во время работы я получаю исключение из-за того, что соединение клиента сбрасывается одноранговым узлом, хотя рабочее соединение клиент/сервер продолжается.

Итак, я думаю, мой вопрос: кто-нибудь знает, почему он работает в одном направлении, но не двунаправленно?

FIXED !!

Редактировать: Gah, я понял это. Это связано с сроками запуска двух серверов.

Я изменил сеть для:

import java.io.IOException; 


public class Network { 

    NetworkClient client; 
    NetworkServer server; 

    public Network() throws IOException { 
     startServer(); 

     startClient(); 
    } 

    private void startServer() throws IOException { 
     server = new NetworkServer(6066); 
     server.start(); 
    } 

    private void startClient(){ 
     boolean isConnected = false; 
     while (!isConnected) { 
      try { 
       client = new NetworkClient("192.168.1.196", 6066); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       //e.printStackTrace(); 
       continue; 
      } 
      isConnected = true; 
     } 
     client.start(); 
    } 

    public static void main(String [] args) 
    { 
     try 
     { 
      Network n = new Network(); 
     }catch(IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

} 

ответ

0

Edit брандмауэра. Убедитесь, что в java.exe включен входящий и исходящий трафик. Также добавьте правило на свой брандмауэр для порта 6066.

+0

Я был уверен, что уже сделал это, но я все равно прошел проверку. java.exe имеет разрешения брандмауэра для входящих и исходящих, а порт 6066 открыт – user677786

+0

Я также добавил вывод двух компьютеров, если это вообще помогает :) – user677786