【问题标题】:JAVA : getting back an instance of an object from a classJAVA:从类中取回对象的实例
【发布时间】:2020-02-11 18:17:34
【问题描述】:

我在返回在类中定义的对象的实例时遇到问题,在下面的代码中,我尝试在扩展 Thread 的类中建立 Socket 连接。 socket_connect 类:

public class socket_connect extends Thread {
    private Socket socket;
    private OutputStream out;
    private String host;
    private int port;
    socket_connect(String host,int port){
        this.host=host;
        this.port=port;
        this.start();
    }
    @Override
    public void run() {
        try {
            this.socket = new Socket(this.host,this.port);
            this.out=new BufferedOutputStream(this.socket.getOutputStream());
            this.out.write("i am here \n\r".getBytes());
            this.out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public int getPort() {
        return port;
    }
    public String getHost() {
        return host;
    }
    public Socket getSocket() {
              return socket;
    }
    public  OutputStream getOut() {
        return out;
    }
}

主类:

public class mymain {
public static void main(String[] args) {
    Socket backsock;
    String backhost;
    int backport;
    String msg ="Second Hi!!!!!";
    socket_connect sc = new socket_connect("127.0.0.1",8080);
    backsock = sc.getSocket();
    backhost = sc.getHost();
    backport = sc.getPort();
    System.out.println(backhost + " " + backport);
    try {
        OutputStream buffer= new BufferedOutputStream(backsock.getOutputStream());
        buffer.write(msg.getBytes());
        buffer.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
    while (true) { }
}

}

连接已建立,OutputstreamSocket_connect 类中将写入“我在这里!!!”到服务器。但是当我尝试使用在 main 中定义的 New Outputstream 执行另一个写入过程时,我在行中出现错误 OutputStream buffer= new BufferedOutputStream(backsock.getOutputStream()); 我在主文件中定义的 backsocket 似乎是 null 。 即使我使用 backsock = sc.getSocket(); 使其与我在实例 sc 中定义的套接字相同。 但是 gethost()getPort() 完美运行:

backhost = sc.getHost();
backport = sc.getPort();
System.out.println(backhost + " " + backport);

这将打印127.0.0.1 8080 我可以取回它们并将它们存储在 int 和 main 中定义的字符串中,并使用System.out 打印它们,但我无法从类中取回Socket 或输出流。他们返回null。 我曾经使用 C++,并且有一个指针可以指向程序中的确切对象,但在这里我不能。

【问题讨论】:

  • 无关:阅读有关 java 命名约定的信息。类名在 java 中总是使用 UpperCamelCase。而且你不要在名称中使用“_”,除非 SOME_CONSTANT。
  • 仅作记录:您在那里所做的几乎毫无意义。除了添加不工作的方法之外,在这里使用线程......真的没有做任何有意义的事情。如果您想了解多线程:阅读一本好书或教程,然后按照它进行操作。当你的知识还没有准备好时,不要试图发明你自己的用例。
  • @ghostcat 我正在尝试在 android 中使用 java,doseent 让我在主线程中使用 write,所以我必须创建 3 个线程,一个用于连接两个用于写入,三个用于连接,但我需要套接字所有三个线程都相同

标签: java object return


【解决方案1】:

尝试运行该程序几次,您可能会发现它在某些情况下可以正常工作。似乎这是一个与线程相关的问题。当你在执行时,main 方法可能会在 socket_connect 线程开始执行run() 方法之前继续执行。 hostport 的 get 方法有效,因为 值已在 run() 方法之外分配。您可以通过使用 Thread.sleep() 等待几分钟进入 main 方法来简单地检查它。 示例:

...
int backport;
String msg ="Second Hi!!!!!";
socket_connect sc = new socket_connect("127.0.0.1",8080);
// add try catch or throw 
// by this time hopefully the socket_connect will start.
Thread.sleep(1000);
backsock = sc.getSocket();
backhost = sc.getHost();
backport = sc.getPort();
System.out.println(backhost + " " + backport);

注意:无限期等待while(true) 也不是一个好习惯。您所能做的就是尝试从套接字输入流中读取一些内容。

【讨论】:

  • YES YES YES,谢谢,我需要让主线程休眠,看来我需要延迟时间来连接连接,然后在主线程中获取输出
【解决方案2】:

问题是您在创建 Socket 之前尝试获取它。你应该像这样将线程同步技术集成到你的代码中。

public class socket_connect extends Thread {
    private Socket socket;
    private OutputStream out;
    private String host;
    private int port;
    private Semaphore sema = new Semaphore(1);

    socket_connect(String host, int port) {
        try {
            this.host = host;
            this.port = port;
            this.sema.acquire();
            this.start();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            this.socket = new Socket(this.host, this.port);
            this.out = new BufferedOutputStream(this.socket.getOutputStream());
            this.out.write("i am here \n\r".getBytes());
            this.out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            sema.release();
        }
    }

    public int getPort() throws InterruptedException {
            return port;
    }

    public String getHost() {
        return host;
    }

    public Socket getSocket() throws InterruptedException {
        try {
            sema.acquire();
            return socket;
        } finally {
            sema.release();
        }
    }

    public OutputStream getOut() throws InterruptedException {
        try {
            sema.acquire();
            return out;
        }finally {
            sema.release();
        }
    }

public static void main(String[] args) throws InterruptedException {
            Socket backsock;
            String backhost;
            int backport;
            String msg = "Second Hi!!!!!";
            socket_connect sc = new socket_connect("google.com", 80);
            backsock = sc.getSocket();
            backhost = sc.getHost();
            backport = sc.getPort();
            System.out.println(backhost + " " + backport);
            try {
                OutputStream buffer = new BufferedOutputStream(backsock.getOutputStream());
                buffer.write(msg.getBytes());
                buffer.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
}

【讨论】:

  • 多罗德。感谢 hadi jan , felan ba gozahstane ye delay toye main moshkelo hal kardam , in chizi ke shoma neveshtiym bayad test konam
猜你喜欢
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2013-02-15
相关资源
最近更新 更多