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

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

我有一个 Java 小程序,而且我是 Java 新手。CSIS10a 第一学期 Java 简介。我和我的朋友有一个项目要为我们的期末制作一个 Java 小程序游戏。我们以“A”结束,在我看来这是最好的。想想小行星,但有点像 R-Type 这样的横向卷轴。我的数学朋友做了所有的物理,我不得不说一些很酷的东西,我的另一个朋友是美术师,FX画了船,做了爆炸之类的,也很棒。我猜我是“代码猴子”,因为我在网络方面有丰富的背景,而且我是 Linux 服务器的系统管理员。所以我知道 bash 就像我的手背一样,java 对我来说很容易(我应该说比我的同行容易得多)。所以在决赛之后他们说“嘿,我们应该把它放到网上,让它成为多人游戏!”,当然,我说,“当然,这应该很简单!设置一个 java 服务器并让他们来回发送 X 和 Y 坐标。为 X&Y 制作 getter 和 setter 并开展业务!” 当然我错了哈哈。

所以......经过一个月的努力解决这个问题并每周在这里发布一些小问题后,我决定在这里发布整个问题,看看我是否可以获得一些指导。

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

                                End of intro

我已经转换了一个简单的聊天客户端/服务器系统(基于回显服务器示例)以将整数而不是字符串发送到服务器,并且服务器将整数发送到第二个客户端。到目前为止,客户端仍然是一个应用程序,而不是小程序的一部分,我们一直在通过调用我们单独运行的游戏中的客户端方法来测试它。我不知道如何在游戏启动时运行客户端,因为每次我尝试创建一个创建套接字的方法时,游戏都会冻结并且无法连接。我认为这是因为套接字就像一个无限循环,它永远不会继续使用其余代码。所以我查看了线程,我创建了一个新线程来建立连接并且游戏是分开的,但你猜怎么着?游戏冻结并连接或它播放但不连接大声笑。

任何帮助都会很棒,我不知道该怎么做,如果你想让我发布我所有的代码,我没有想法和 idk,因为它很长,但是如果你愿意,我会发布我的客户课程......

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

我认为您可能遇到的一个问题(或即将遇到的问题)是 Java applet不允许与托管 applet 的服务器以外的任何服务器建立 TCP 连接。因此,除非您在 localhost 上运行 Web 服务器并将您的 Web 浏览器也指向 localhost,否则从 applet 到 127.0.0.1 的 TCP 连接将引发异常并且无法正常工作。

据推测,为了让多人游戏在 Java 小程序上运行,您需要在与 Web 服务器相同的机器上运行一个单独的服务器进程。然后,各种 Java 小程序都可以连接到该服务器进程(因为它们被允许连接到 Web 服务器的 IP 地址),并且服务器进程将负责根据需要将信息从一个 Java 小程序转发到另一个。

于 2012-06-03T02:25:08.273 回答