为什么它没有通过线程?

时间:2017-06-06 06:16:38

标签: java multithreading

我正在检查是否点击了注册按钮它是否在另一个线程中执行某些操作但是它没有到​​达线程的末尾?

    if(!(email.isEmpty() ||username.isEmpty() || password.isEmpty())){
     Main.users.add(new User(username, password, email));
                        new Thread(new SocketSender(Main.socket, Main.users)).start();
   Thread.sleep(1000);
   System.out.println("here");
   new Thread(new ServerReciver(Main.socket)).start();
   Thread.sleep(2000);
   System.out.println("here");
   Main.pstage.setScene(new Scene(FXMLLoader.load(getClass().getResource("/sample/logIn.fxml")),700,700))}

套接字发件人

public class SocketSender  implements  Runnable{
    Socket socket;
    Object object;

    public SocketSender(Socket socket, Object object) {
        this.socket = socket;
        this.object = object;
    }

@Override
public void run() {
    try {
        ObjectOutputStream write = new ObjectOutputStream(socket.getOutputStream());
        write.writeObject(object);
        write.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}}

Server Reciver

public class ServerReciver implements  Runnable {
    Socket socket;

    public ServerReciver(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        System.out.println("log1");
        try {
            System.out.println("log2");
            ObjectInputStream read = new ObjectInputStream(socket.getInputStream());
            System.out.println("log3");
            Object o = read.readObject();
            System.out.println("ma");
            if(o instanceof User){
                System.out.println(log4);
                Server.getUsers().add((User) o);
            }
            else if(o instanceof Artist){
                Server.getArtists().add((Artist) o);
            }
            else if(o instanceof PlayList){
                Server.getPlayLists().add((PlayList) o);
            }
            else if(o instanceof Song){
                Server.getSongs().add((Song) o);
            }
            else if(o instanceof Album){
                Server.getAlbums().add((Album) o);
            }
            System.out.println(log6);
            Server.write();
            System.out.println(log7);
            Thread.sleep(100);
            System.out.println(Server.getUsers().get(0));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在服务器接收器中,它打印出2个第一个日志,但它没有打印所有日志!?

2 个答案:

答案 0 :(得分:2)

您的问题很简单:您无法使用相同的套接字对象同时发送和读取数据。

您正在尝试的是:使用您自己的手机拨打自己的号码,然后与您通话(以有效的方式)。

换句话说:不是重用一些Main.socket,而是首先必须创建两个不同的套接字。

但是,当然,这个顺序中有点。不要构建JavaFX应用程序,然后尝试将客户端/服务器连接添加到远程系统。

首先学习如何做客户端/服务器事务,例如通过阅读相应的Oracle tutorial。然后,当你编写了很小的命令行工具,通过套接字很好地进行通信;甚至是远程系统;然后将这些知识转发并将其构建到JavaFX应用程序中。学习使用独轮车时,不要试图学习杂耍。

答案 1 :(得分:0)

要创建服务器的客户端,请使用java.net.Socket

Socket s = new Socket(serverAddress, 9090);
        BufferedReader input =
            new BufferedReader(new InputStreamReader(s.getInputStream()));
        String answer = input.readLine();

创建服务器使用java.net.ServerSocket

ServerSocket listener = new ServerSocket(9090);

        try {
            while (true) {
                Socket socket = listener.accept();

                try {
                    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                    out.println(new Date().toString());
                } finally {
                    socket.close();
                }
            }
        } finally {
            listener.close();
        }