java - 无法发现客户端/服务器程序中的死锁

标签 java multithreading tcp

我正在构建一个在客户端和服务器之间交互的程序:

客户端发送一个对象,服务器操作它并将其发送回客户端。

通过命令行下发的ip是121.0.0.1(同一台电脑)。

但是,当我按下“开始”按钮时,似乎出现了我无法发现的僵局。

我做错了什么?

我所有的类(class)都在这里:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

    @SuppressWarnings("serial")
    public class ClientPanel extends JPanel {

        JTextArea textArea;
        JTextField textField;
        JButton goButton;

        InetAddress ip;

        public ClientPanel(InetAddress ip) {
            this.ip=ip;

            setLayout(new BorderLayout());
            setSize(200, 200);

            textArea = new JTextArea();
            textArea.setSize(50, 50);
            add(textArea, BorderLayout.NORTH);

            textField = new JTextField();
            textField.setSize(100, 100);
            add(textField, BorderLayout.CENTER);


            goButton = new JButton("Go");
            add(goButton, BorderLayout.PAGE_END);
            goButton.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    // TODO Auto-generated method stub
                    IntData intData=new IntData(Integer.parseInt(textField.getText()));
                    textArea.append("Go button pressed. Text in field: " + textField.getText() + "\n "
                            + "sending to server:"+intData);
                    Socket socket;
                    try {
                        socket = new Socket(ip,4444);
                        new GetBinaryThread(socket, intData);
                    } catch (IOException e1) {e1.printStackTrace();}


                }
            });

            repaint();
        }


        private class GetBinaryThread extends Thread {

            private Socket socket;
            private ObjectOutputStream out;
            private ObjectInputStream in;
            private IntData dataToSend;

            public GetBinaryThread(Socket socket, IntData data) {
                this.socket = socket;
                try {
                    out = new ObjectOutputStream(socket.getOutputStream());
                    out.flush();
                    in = new ObjectInputStream(socket.getInputStream());

                    dataToSend = data;
                } catch (IOException e) {
                    e.printStackTrace();
                }


            }

            public void run() {
                try {

                    out.writeObject(dataToSend);
                    Object recievedObject = in.readObject();

                    // TODO show the object in text area
                    ClientPanel.this.textArea.append(", recieved" + ((IntData)recievedObject).getBinary());
                    out.close();
                    in.close();
                    socket.close();

                } catch (IOException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }

    }
<小时/>
import java.net.InetAddress;
import java.net.UnknownHostException;

import javax.swing.JFrame;

public class LaunchClient {
    static final int FRAME_WIDTH = 500, FRAME_HEIGHT = 500;

public static void main(String[] args) {

        InetAddress ip = null;
        if (args.length==0){
            System.out.println("No args so no IP!");
        }

        try {
            ip = InetAddress.getByName(args[0]);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        System.out.println(ip);
        JFrame frame = new JFrame();
        frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        frame.add(new ClientPanel(ip));
        frame.setVisible(true);


    }


}
<小时/>
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class BinaryServer {

    public static void main(String[] args) {

        Socket socket;
        ServerSocket serverSocket;
        try {
            serverSocket = new ServerSocket(4444);
            boolean listening = true;
            System.out.println("server ready...");

            while (listening) {
                socket = serverSocket.accept();
                System.out.println("got socket");
                new BinaryServerThread(socket).start();

            }
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
<小时/>
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class BinaryServerThread extends Thread {
    Socket socket = null;
    ObjectInputStream in;
    ObjectOutputStream out;

    public BinaryServerThread(Socket socket) {
        this.socket = socket;
        try {
             in = new ObjectInputStream(socket.getInputStream());
             out = new ObjectOutputStream(socket.getOutputStream());

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

    public void run() {
        IntData dataFromClient;
        try {
            dataFromClient = ((IntData) in.readObject());
            dataFromClient.generateBinary();
            System.out.println("got data: "+dataFromClient);
            out.writeObject(dataFromClient);

            in.close();
            out.close();
            socket.close();
        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace();
        }


    }

}
<小时/>
public class IntData {
    private Integer integer;
    private String binary = "Not set";

    public IntData(int x){
        integer=x;
    }
    public void generateBinary() {
        binary = Integer.toBinaryString(integer);
    }

    public int getInteger() {
        return integer;
    }

    public void setInteger(int integer) {
        this.integer = integer;
    }

    public String getBinary() {
        return binary;
    }

    public void setBinary(String binary) {
        this.binary = binary;
    }
    public String toString(){
        return integer.toString();
    }

}

最佳答案

如果我理解您的问题,问题是您在命令行上提供的 IP 地址

121.0.0.1

不是环回地址。你需要

127.0.0.1

localhost

关于java - 无法发现客户端/服务器程序中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32019921/

相关文章:

c++ - IOCP - 发布重叠或读取数据包?

.net - 在 Windows/.NET 上禁用 TCP 慢速重启

java - 音频文件Android

java - 可以生成报告的可定制差异工具(XML、HTML 格式)

java - 当我在 EDT 之外的线程上调用打印方法时没有任何反应?

c++ - 在工作线程完成 MFC 时禁用控制变量

sockets - 什么是 TCP 连接的开销流量(加上 TCP 说明)?

java - 是否可以在浏览器中运行 JavaFX 应用程序?

java - JSP : JSTL's <c:out> tag

java - 线程池工作线程被 Runnables 淹没导致 JVM 崩溃