【问题标题】:Java , Socket, sending messagesJava,Socket,发送消息
【发布时间】:2014-06-22 05:23:27
【问题描述】:

我正在尝试制作多人游戏,但首先我想用一个简单的扫描仪和打印代码尝试一下

我有两个文件,“cl.java”是客户端,“server.java”是服务器。

我想做什么?

一个客户端向其他客户端发送一条请求游戏的消息 这个初始消息没有在我的代码中运行,我想我不能在课堂外使用clientThread.sendText(un + " iWantToPlay"); ConnectThread

你怎么看?

此代码发生错误:

        public void sendText(String text) {
        try {
            oos.writeObject(text);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

oos.writeObject(text);

这是 Server.java

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server {

ServerSocket serverSocket;
ArrayList<ServerThread> allClients = new ArrayList<ServerThread>();

public static void main(String[] args) {
    new Server();

}

public Server() {
    // ServerSocket is only opened once !!!

    try {
        serverSocket = new ServerSocket(6000);

        System.out.println("Waiting on port 6000...");
        boolean connected = true;

        // this method will block until a client will call me
        while (connected) {
            Socket singleClient = serverSocket.accept();
            // add to the list
            ServerThread myThread = new ServerThread(singleClient);
            allClients.add(myThread);
            myThread.start();
        }

        // here we also close the main server socket
        serverSocket.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

class ServerThread extends Thread {
    Socket threadSocket;
    String msg;
    boolean isClientConnected;
    InputStream input;
    ObjectInputStream ois;
    OutputStream output;
    ObjectOutputStream oos; // ObjectOutputStream

    public ServerThread(Socket s) {
        threadSocket = s;
    }

    public void sendText(String text) {
        try {
            oos.writeObject(text);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void run() {

        try {
            input = threadSocket.getInputStream();
            ois = new ObjectInputStream(input);
            output = threadSocket.getOutputStream();
            oos = new ObjectOutputStream(output);

            // get the user name from the client and store
            // it inside thread class for later use
            // msg = (String) ois.readObject();
            msg = (String) ois.readObject();

            for (ServerThread t : allClients)
                t.sendText(msg);

            isClientConnected = true;
            System.out.println("connect ... ");

            // System.out.println(msg);
            // for(ServerThread t:allClients)
            // t.sendText("User has connected...");

            // send this information to all users
            // dos.writeUTF(userName + " has connected..");
            // for(ServerThread t:allClients)
            // t.sendText(msg);

            while (isClientConnected) {

                try {
                    msg = (String) ois.readObject();
                    System.out.println(msg);

                    for (ServerThread t : allClients)
                        t.sendText(msg);
                } catch (Exception e) {

                }
            }
            // close all resources (streams and sockets)
            ois.close();
            oos.close();
            threadSocket.close();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

}

这是 cl.java

import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class cl {
public static final String HOST = "127.0.0.1";
public static final int PORT = 6000;

static ConnectThread clientThread;
boolean isConnected;

static boolean isOnline = false;
static Scanner scanner = new Scanner(System.in);
static String msg;
static String un;
static String op = "none";
static int turn = 1;

public static void main(String[] args) {
    boolean running = true;

    System.out.print("Enter a username: ");
    un = scanner.nextLine();

    System.out.print("invite or wait ?");
    msg = scanner.nextLine();

    if (msg.equalsIgnoreCase("invite")) {
        System.out.print("Enter an opponent: ");
        op = scanner.nextLine();
    }

    new cl();

    if (op.equalsIgnoreCase("amjad")) {
        clientThread.sendText(un + " iWantToPlay");
    }


}

public String getWord(String line,int i) {
    String arr[] = line.split(" ", 2);
 return arr[i];

}

public cl() {
    connectUser();
}

public void connectUser() {
    clientThread = new ConnectThread();
    clientThread.start();

}

class ConnectThread extends Thread {
    InputStream input;
    OutputStream output;
    ObjectOutputStream oos;
    Socket s;

    public void sendText(String text) {
        try {
            oos.writeObject(text);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void run() {
        try {
            s = new Socket(HOST, PORT);
            output = s.getOutputStream();
            oos = new ObjectOutputStream(output);

            isOnline = true;
            isConnected = true;

            new ListenThread(s).start();

/*              while (isOnline) {
                    msg = scanner.nextLine();
                    clientThread.sendText(un + ": " + msg);
                }
*/
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

class ListenThread extends Thread {

    Socket s;
    InputStream input;
    ObjectInputStream ois;

    public ListenThread(Socket s) {
        this.s = s;
        try {
            input = s.getInputStream();
            ois = new ObjectInputStream(input);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void run() {
        while (isConnected) {
            try {
                final String inputMessage = (String) ois.readObject();
                String user;
                user = getWord(inputMessage,1);
                String message = getWord(inputMessage,2);

                /*if (!user.equals(un)) {
                    System.out.println(inputMessage);
                }*/

                if (message.equalsIgnoreCase("iwanttoplay")) {
                    System.out.println(user + " wants to play, accept? y\n");
                    msg = scanner.nextLine();
                    clientThread.sendText(un + " " + msg);
                }
                else if (message.equalsIgnoreCase("yesiwanttoplay")) {
                    System.out.println(un + " accepted invitation, "  + un + " against " + user);
                    turn = 1;
                    play(un,user);
                }
                else if (message.equalsIgnoreCase("noidontwanttoplay")) {
                    System.out.println(user + " denied invitation.. ");
                }
                else if (message.equalsIgnoreCase("x") || message.equalsIgnoreCase("o")) {
                    System.out.println(user + " played .. " + message);
                    turn = 1;
                    play(un,user);
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }
}

public void play(String me, String him) {
    if (turn == 1) {
        System.out.println("your turn,... play a move..x or o ..");
        msg = scanner.nextLine();
        clientThread.sendText(un + " " + msg);
        turn = 2;
    }
}

}

这是我的错误

Exception in thread "main" java.lang.NullPointerException
at cl$ConnectThread.sendText(cl.java:68)
at cl.main(cl.java:38)

【问题讨论】:

  • 专业提示:每当您看到“NullPointerException”时,通常意味着您的变量之一为空,并且正在尝试对空值调用方法。在这种情况下,clientThread.sendText 会抛出此错误,因为您从未实例化 clientThread = new ClientThread();

标签: java sockets client-server chat


【解决方案1】:

线程“主”java.lang.NullPointerException 中的异常 在 cl$ConnectThread.sendText(cl.java:68)

您应该能够自己解决这个问题。有问题的行似乎是

oos.writeObject(text);

很明显oos 在那个时候是空的。

你不需要 StackOverflow 来整理NullPointerExceptions.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2013-04-24
    • 2016-11-12
    • 1970-01-01
    • 2018-03-31
    • 2023-03-15
    相关资源
    最近更新 更多