在返回在类中定义的对象的实例时遇到了问题,在下面的代码中,我试图在扩展Socket的类中建立一个Thread连接。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) { }
}}
连接已经建立,Outputstream在Socket_connect类中将写到“我在这里!”到服务器上。但是,当我试图执行另一个带有main内部定义的新Outputstream的写进程时,我在OutputStream buffer= new BufferedOutputStream(backsock.getOutputStream());行中得到了一个错误,我在主文件中定义的backsocket似乎是空的。尽管我使用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或outputstream。他们返回null。我过去经常使用C++,有一个指针指向程序中的确切对象,但在这里我不能。
发布于 2019-10-15 06:57:28
尝试运行这个程序几次,您可能会发现它是有效的,在某些情况下。这似乎是一个与线程有关的问题。在执行时,main方法甚至可以在socket_connect线程开始执行run()方法之前继续执行。host和port的get方法工作,因为已经在run()方法之外分配了值。您可以通过使用Thread.sleep()等待几分钟进入主方法来简单地检查它。示例:
...
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)不是一个好做法。您所能做的就是尝试从套接字输入流中读取某些内容。
发布于 2019-10-15 07:07:23
问题是在创建套接字之前尝试获取它。您应该将线程同步技术集成到代码中,如下所示。
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();
}
}
}https://stackoverflow.com/questions/58388362
复制相似问题