0

我的最后一个课程项目是组合一个游戏,包括多人游戏。所以我开始试图弄清楚java网络,我有点卡住了。

两个游戏客户端中的每一个都需要能够与另一个客户端发送和接收消息。

我想我会处理这个问题的方式是我有一个在它们自己的线程中运行的 NetworkServer 和 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

}

网络服务器:

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();
       }
    }

}

我在那里有计时器,以方便将数据从客户端发送到服务器,这通常由我的游戏完成,但由于我正在测试,我必须以某种方式发送它。

当我在客户端和服务器相互交谈的地方运行它时,我会同时收到 Sent 和 Received 消息。

当我把它放在我的笔记本电脑上(并更改 NetworkClient 中的 IP 以匹配我的桌面,反之亦然)并在两个地方运行它时,桌面上的客户端发送到笔记本电脑上的服务器,但客户端笔记本电脑不会发送到桌面上的服务器。

在运行过程中的某个时刻,我收到一个关于该客户端的连接被对等方重置的异常,尽管工作的客户端/服务器连接仍在继续。

所以,我想我的问题是,有谁知道为什么它在一个方向上工作而不是双向?

固定的!!

编辑: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();
       }
    }

}
4

1 回答 1

0

编辑您的防火墙。确保 java.exe 启用了入站和出站流量。此外,为端口 6066 添加一条规则到您的防火墙。

于 2012-04-14T01:41:02.523 回答