0
            This is a intro to my problem Skip if you don't care.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

私はJavaアプレットを持っていますが、Javaは初めてです。JavaのCSIS10aイントロの最初の学期。私と私の友人は、決勝用の Java アプレット ゲームを作成するプロジェクトを持っていました。私たちは「A」で終了しましたが、私の意見では、それが最高のものでした。小惑星だと思いますが、R-Type のような横スクロール ゲームです。私の数学の友人はその中のすべての物理学を行いました.いくつかのかなりクールなことを言うことができました.私のもう1人の友人はアートガイであり、FXは船を描き、爆発などを行いました.これもかなり素晴らしい. 私はネットワークのバックグラウンドが深く、Linux サーバーのシステム管理者であるため、「コード モンキー」だと思います。だから私は私の手の甲のようにbashを知っています。決勝戦の後に彼らは「これをオンラインにしてマルチプレイヤーにしよう!」と言いました。そしてもちろん私は、「確かにそれは十分に簡単なはずです! Java サーバーをセットアップして、X と Y の座標を送受信させます。X と Y のゲッターとセッターを作成して、ビジネスを始めましょう!」と言いました。もちろん、私は間違っていました笑。

それで... それを理解しようとして毎週ここに小さな質問を投稿してから1か月後、私はここに問題全体を投稿して、何らかのガイダンスが得られるかどうかを確認することにしました.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                                End of intro

シンプルなチャット クライアント/サーバー システム (エコー サーバーの例に基づく) を変換して、文字列の代わりに int をサーバーに送信し、サーバーが int を 2 番目のクライアントに送信します。これまでのところ、クライアントはまだアプリケーションであり、アプレットの一部ではありません。個別に実行するゲームでクライアント メソッドを呼び出してテストしてきました。ソケットを作成するメソッドを作成しようとするたびにゲームがフリーズして接続しないため、ゲームの起動時にクライアントを実行する方法がわかりません。ソケットは無限ループのようで、残りのコードでは決して続かないからだと思います。スレッドを調べたので、接続を確立する新しいスレッドを作成し、ゲームは分離されていますが、何だと思いますか? ゲームがフリーズして接続するか、プレイしても接続しない笑。

何をすればいいのかわからないので、私のコードのすべてを投稿してほしい場合はアイデアがありません。かなり長い笑ですが、必要に応じてクライアントクラスを投稿してください...

package Connection;
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import java.util.Timer;
import java.io.*;
import java.net.*;

class client extends JFrame implements ActionListener {

static String address = "127.0.0.1";
static JLabel text, clicked;
static JButton button;
static JPanel panel;
static JTextField textField;
static JTextArea textArea;
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;

client() {
    text = new JLabel("Send Text Over Socket:");
    textField = new JTextField(20);
    textArea = new JTextArea(5, 20);
    button = new JButton("Send");
    button.addActionListener(this);

    panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.setBackground(Color.white);
    getContentPane().add(panel);
    panel.add("Center", textField);
    panel.add("North", textArea);
    panel.add("South", button);
}

public void actionPerformed(ActionEvent event) {
    Object source = event.getSource();

    if (source == button) {
        String text = textField.getText();
        out.println(text);
        textField.setText(new String(""));
        try {
            String line = in.readLine();
            if (line != null)
                client.textArea.append("Text received :" + line + "\n");
            else
                client.textArea.append("Welcome To James World Messager!");
        } catch (IOException e) {
            client.textArea.append("Read failed\n");
            System.exit(1);
        }
    }
}

public void listenSocket() {
    try {
        socket = new Socket(address, 4444);
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
    } catch (UnknownHostException e) {
        client.textArea.append("Unknown host: " + address + "\n");
        System.exit(1);
    } catch (IOException e) {
        client.textArea.append("No I/O\n");
        System.exit(1);
    }
}

public static void main(String[] args) throws IOException {
    client frame = new client();
    frame.setTitle("Client Program");

    WindowListener l = new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    };

    frame.addWindowListener(l);
    frame.pack();
    frame.setVisible(true);
    frame.listenSocket();
}

}

これは、呼び出すことができるクラスとしてゲームに実装しようとしたコードですが、サイコロはありません...

package Game;
import java.io.*;
import java.net.*;

public class tclient extends Thread{
 String address = "***.***.***.***;
 Socket socket = null;
 PrintWriter out = null;
 BufferedReader in = null;
 tclient tclient[];

 public tclient(Socket socket, tclient[] tclient) {
    this.socket = socket;
    this.tclient = tclient;
    }
 public void run(){
 try{
   socket = new Socket(address, 1234);
   out = new PrintWriter(socket.getOutputStream(), true);
   in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 } catch (UnknownHostException e) {
   System.out.println(e);
 } catch  (IOException e) {
   System.out.println(e); 
 }
 }
 //    public void sendX(int x){
 //        out.println(x);
 //     }
 //    public void sendY(int Y){
 //        out.println(Y);
 //     }
 }
4

1 に答える 1

0

あなたが遭遇しているかもしれない(またはすぐに遭遇するであろう)1つの問題は、Javaアプレットがアプレットをホストするサーバー以外のサーバーへのTCP接続を確立することを許可されていないことだと思います。したがって、ローカルホストでWebサーバーを実行していて、Webブラウザーもローカルホストに向けていない限り、アプレットから127.0.0.1へのTCP接続は例外をスローし、機能しません。

おそらく、Javaアプレットでマルチプレイヤーを機能させるには、Webサーバーと同じマシンで実行される別のサーバープロセスが必要になります。さまざまなJavaアプレットはすべてこのサーバープロセスに接続でき(WebサーバーのIPアドレスへの接続が許可されているため)、サーバープロセスは、必要に応じて、あるJavaアプレットから別のJavaアプレットに情報を転送する責任があります。

于 2012-06-03T02:25:08.273 に答える