Java网络 - 客户端/服务器

时间:2012-04-14 01:19:31

标签: java sockets networking serversocket

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

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

我认为我会处理这个问题的方法是我有一个在自己的线程中运行的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();
       }
    }

}

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

当我在客户端和服务器彼此通话的情况下运行时,我同时收到已发送和已接收的消息。

当我把它放在我的笔记本电脑上(并在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();
       }
    }

}

1 个答案:

答案 0 :(得分:0)

编辑防火墙。确保java.exe启用了入站和出站流量。另外,在防火墙上为端口6066添加规则。