gpt4 book ai didi

JAVA : getting back an instance of an object from a class

转载 作者:行者123 更新时间:2023-12-02 01:17:06 25 4
gpt4 key购买 nike

我在返回类内部定义的对象实例时遇到问题,在下面的代码中,我尝试在扩展 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) { }
}

}

连接已建立,Socket_connect 类中的 Outputstream 将写入“我在这里!!!”到服务器。但是当我尝试使用 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我可以取回它们并将它们存储在 main 中定义的 int 和 string 中,并使用 System.out 打印它们,但我无法从类中取回 Socket 或输出流。他们返回null。我以前使用 C++,并且有一个指针可以指向程序中的确切对象,但在这里我不能。

最佳答案

在某些情况下,尝试运行该程序几次,您可能会发现它有效。看来这是一个与线程相关的问题。当您执行时,即使在socket_connect线程开始执行run()方法之前,main方法也可能会继续执行。 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) 也不是一个好的做法。您所能做的就是尝试从套接字输入流中读取一些内容。

关于JAVA : getting back an instance of an object from a class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58388362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com