Java TCP套接字,在线程中发送和接收对象

时间:2012-12-04 12:34:29

标签: java multithreading sockets tcp multiplayer

我是一名初学程序员,目前仍处于Java项目中。我有一个完全工作的单人扫雷游戏,面向对象,我正在尝试实现TCP多人游戏功能。游戏有一个控制类,它处理视图,游戏场,计时器,标签,有动作听众等。 对于多人游戏,我正在尝试创建一个单独的线程,它具有Socker和ServerSocket,并且取决于构造函数传递的参数,充当主机或客户端。在运行时,它应该尝试从输入流中读取我的自定义Packet类,而另一种方法可以发送数据包。这是代码:

公共类MultiThread扩展了线程{

GameControl gc;
ServerSocket servSocket;
Socket socket;
Packet data;
ObjectInputStream incoming;
ObjectOutputStream outgoing;
Boolean isHost;
Boolean commEnd;

public MultiThread(GameControl gc, Boolean isHost) {
    this.gc = gc;
    this.isHost = isHost;
    this.commEnd = false;
    gc.chatDialog.setVisible(true);
}

public void run() {
    try {
        if (isHost) {
            servSocket = new ServerSocket(1234);
            gc.chatDialog.status.setText("Awaiting connection...");
            socket = servSocket.accept();
            gc.chatDialog.status.setText("Connected.");
            incoming = new ObjectInputStream(socket.getInputStream());
            outgoing = new ObjectOutputStream(socket.getOutputStream());
        }
        else if (!isHost){
            socket = new Socket("localhost", 1234);
            if (socket.isConnected()) {
                gc.chatDialog.status.setText("Connected.");
                incoming = new ObjectInputStream(socket.getInputStream());
                outgoing = new ObjectOutputStream(socket.getOutputStream());
            }
            else {
                gc.chatDialog.status.setText("No connection.");
            }
        }


        while (!commEnd) {
            try {
                Thread.sleep(100);
                data = (Packet)incoming.readObject();
                System.out.println(data.msg);
                gc.chatDialog.chatArea.append(data.getMsg());   
            }
            catch (IOException e) {e.printStackTrace();}
        }

        System.out.println("asd");
        gc.chatDialog.status.setText("No connection");
        incoming.close();
        outgoing.close();
        socket.close();
        servSocket.close();
    }

        catch (Exception e) {e.printStackTrace();}
}

public void sendPacket(Packet p) {
    try {
        outgoing.writeObject(p);
    }
    catch (IOException e) {e.printStackTrace();}
}

}

连接在localhost上建立,但是在尝试初始化传入和传出字段时,我会抛出异常。 对不起,如果代码很乱,我觉得我有一些严重的误解,所以感谢任何帮助。

0 个答案:

没有答案