簡體   English   中英

Java網絡-客戶端/服務器

[英]Java Networking - Client / Server

我上課的最后一個項目是組裝一個游戲,包括多人游戲。 因此,我開始嘗試弄清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

}

網絡服務器:

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以匹配我的桌面,反之亦然)在兩個地方都運行時,桌面上的客戶端將發送到筆記本電腦上的服務器,但客戶端將便攜式計算機不會發送到台式機上的服務器。

而且在運行過程中的某個時刻,我得到一個異常,該消息是該客戶端的連接被對等方重置,盡管工作的客戶端/服務器連接繼續。

所以,我想我的問題是,有誰知道為什么它會朝一個方向而不是雙向地起作用?

固定!!

編輯:加,我想通了。 它與啟動兩個服務器的時間有關。

我將網絡更改為:

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

}

編輯您的防火牆。 確保java.exe啟用了入站和出站流量。 另外,將規則添加到防火牆的端口6066。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM