我正在写一个游戏棋的游戏,情况是这样的:有一个服务器端,负责监听各个玩家的请求,每有一个玩家加入我就给他开设一个线程。当游戏开始后,玩家就不能加入了。游戏一开始会有一个标准答案,比如说某个人(character),在某个地方(place),用什么武器(weapon)杀了人。游戏过程中玩家走到特定位置后可以向服务器提出猜想(hypothesis),服务器将(Hypothesis)传递给其他玩家让他们根据手中的信息进行反驳(refute),服务器将反驳的结果再回复给提出假设的人。我就不知道在这个过程中网络编程应该是怎样实现的的。
因为其他玩家移动的时候自己客户端必须监听其他玩家的移动信息,因此必须保持一个跟服务器一直连接的一个线程,于是建立了一个clientlistener类,游戏一开始就初始化一个对象,调用它的prosess函数跟服务器建立连接,服务器给他分配一个线程。我希望这个clientlistener一直监听从服务端发过来的信息。
当我在游戏过程中,点击hypothesis按钮时,会弹出一个对话框,但我选定相关信息点击确定后,会调用Hypothesis类中的相关函数将选定的信息发送给服务器,这个时候我的服务器又建立了一个线程来接受这个信息。本来我想
将服务器Hypothesis的处理结果通过clientlistener传过来,可这个时候却通过后来这个线程传来,我原来那
clientlistener里面写的关于各种信息处理的调用就无法实现了。我很迷惑,不知道应该怎么实现。
public class ClientListener
{
private boolean done = false;
private Scanner in;
private PrintWriter out;
public ClientListener()
{
try{
Socket s = new Socket("localhost",5555);
InputStream inStream = s.getInputStream(); //the input stream from the server
OutputStream outStream = s.getOutputStream(); //the output stream to the server
BufferedReader inputStream = new BufferedReader(new InputStreamReader(System.in)); //
out = new PrintWriter(outStream, true); //write to the stream to server
in = new Scanner(inStream);
}
catch (IOException e) {e.printStackTrace();}
}
public void listenToServer()
{
}
public void sendToServer(String message)
{
out.println(message);
}
}
我想把这个类的对象myClientServer设置为全局变量,然后在整个客户端无论哪个类的什么函数想要给服务器发送信息的时候只用调用一下
myClientServer.send(message)
就可以了
不知道这个全局变量怎么操作呢?
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;public class ClientListener {
private boolean done = false; private Scanner in; private PrintWriter out; private ClientListener() { } private static ClientListener instance; public synchronized ClientListener getInstance() {
if (instance == null) {
instance = new ClientListener();
try {
instance.init();
} catch (Exception ex) {
instance = null;
}
}
return instance;
} private void init() throws Exception { Socket s = new Socket("localhost", 5555);
InputStream inStream = s.getInputStream(); //the input stream from the server
OutputStream outStream = s.getOutputStream(); //the output stream to the server
BufferedReader inputStream = new BufferedReader(new InputStreamReader(
System.in)); //
out = new PrintWriter(outStream, true); //write to the stream to server
in = new Scanner(inStream); } public void listenToServer() {
} public synchronized void sendToServer(String message) {
out.println(message);
}
}全局调用
ClientListener.getInstance().sendToServer(message)
即可
我可以这么做吗,就是比如游戏开始的时候会启动startgame class里的main(),运行的主函数在这里,在class类里面我有个public static ClientListener myClientListner = new ClientListener,作为他的变量,这个变量在游戏一开始就被初始化,也就是说建立了一个ClientListener对象,ClientListener的构造函数就跟服务端建立了连接并且做好了instream, outstream,以后在整个程序里任何一个类的函数想要跟服务器发送信息的时候就调用StartGame.myClientListener.sendToServer(message),不知道这样做好不好。我昨天试了一下,用户做了一个
假设(Hypothesis)给服务器,也还行,收到了反馈信息,一切也都正常。
singletance我没怎么做过,了解的不多,还有待学习。
public synchronized ClientListener getInstance()里面的synchronized是什么意思?
还有private void init() throws Exception是不是起到一个构造函数的作用?