首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JAVA :从类中获取对象的实例

JAVA :从类中获取对象的实例
EN

Stack Overflow用户
提问于 2019-10-15 06:21:43
回答 2查看 179关注 0票数 0

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

代码语言:javascript
运行
复制
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;
    }
}

主修班:

代码语言:javascript
运行
复制
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内部定义的新Outputstream的写进程时,我在OutputStream buffer= new BufferedOutputStream(backsock.getOutputStream());行中得到了一个错误,我在主文件中定义的backsocket似乎是空的。尽管我使用backsock = sc.getSocket();使其成为我在实例sc中定义的相同的套接字。然而,gethost()getPort()工作得很好:

代码语言:javascript
运行
复制
backhost = sc.getHost();
backport = sc.getPort();
System.out.println(backhost + " " + backport);

这将打印127.0.0.1 8080 --我可以将它们取回并存储在main中定义的int和string中,并使用System.out打印它们,但是我无法从类中获取Socket或outputstream。他们返回null。我过去经常使用C++,有一个指针指向程序中的确切对象,但在这里我不能。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-15 06:57:28

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

代码语言:javascript
运行
复制
...
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);

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

票数 1
EN

Stack Overflow用户

发布于 2019-10-15 07:07:23

问题是在创建套接字之前尝试获取它。您应该将线程同步技术集成到代码中,如下所示。

代码语言:javascript
运行
复制
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();
            }
        }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58388362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档