gpt4 book ai didi

java - 如何在 run 方法之外发送对象?

转载 作者:行者123 更新时间:2023-12-02 01:42:26 24 4
gpt4 key购买 nike

我希望能够使用我的 sendMessage() 方法向我的客户端发送一些内容,同时还等待客户端消息(客户端应该能够执行相同的操作)。我试图在任何地方定义 Socket 和 Streamobjects,但我想我并不真正理解它们是如何工作的。

    public class Server extends Thread{
private ObjectOutputStream oos;

public void sendMessage(String message){
try
{
oos.writeObject(message);
} catch (IOException e)
{
e.printStackTrace();
}
}




public void run() {
try {
ServerSocket server = new ServerSocket(4444);
Socket socket = server.accept();
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
this.oos = oos;
while(true) {
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String message = (String) ois.readObject();
System.out.println("Server Received: " + message);
ois.close();
socket.close();
}
} catch (Exception e) {
}
}


public class Main {

public static void main(String[] args)
{
Server s = new Server();
s.start();
new Client().start();
s.sendMessage("test");

}

编辑

好吧,我尝试为每个客户端创建一个线程,但我仍然遇到无法访问 objectoutputstream 的问题...

public class SuperServer {
private Server s = new Server();

public void startServer(){
s.setDaemon(true);
s.start();

if(s.isAlive()){
System.out.println("server started");
}
}

public void sendMessage(String message) throws IOException
{
s.handler.sendMessage(message);
}
}

public class Server extends Thread {
ServerSocket server;
Socket socket;


ServerHandler handler;



public void run()
{
try {
server = new ServerSocket(4444);


while (true)
{
socket = server.accept();
ServerHandler serverHandler = new ServerHandler(socket);
handler = serverHandler;

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

public class ServerHandler extends Thread {

protected Socket socket;
private ObjectOutputStream oos;
private ObjectInputStream ois;

public ServerHandler(Socket socket){
this.socket = socket;
}

public void sendMessage(String message) throws IOException
{
oos.writeObject(message);
}

public void run()
{
try(
ServerSocket server = new ServerSocket(4444);
Socket socket = server.accept();
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
)
{
this.socket = socket;
this.oos = oos;
while (true)
{
String message = (String) ois.readObject();
System.out.println("Server Received: " + message);
}
} catch (IOException e)
{
e.printStackTrace();
} catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}


}

public class Main {



public static void main(String[] args) throws IOException
{
SuperServer s = new SuperServer();
s.startServer();

SuperClient c = new SuperClient();
c.clientStart();

Scanner sc = new Scanner(System.in);
System.out.println("input 1:");
int a = Integer.parseInt(sc.nextLine());
if(a == 1) s.sendMessage("test");


}
}

最佳答案

您错误地使用了 Thread 和 Socket。

1) 在服务器端,通常您希望为每个与客户端的新连接创建一个新线程,以并行化服务器与其客户端之间的通信。
这里你创建了一个线程用于整个服务器处理...

2)这会产生另一个问题,因为 Threads.start() 并不一定使线程立即运行。所以这里:

Server s =  new Server();
s.start();
new Client().start();
s.sendMessage("test");

s.sendMessage("test"); 可以在 ServerClient 线程执行和终止之前调用。因此,ObjectOutputStream 字段可能仍为 null

3) 一旦读取到第一条消息,就关闭 ServerSocket。
因此,即使 s.sendMessage("test"); 在正确的时间被调用(幸运的是),ois 也不会是 null 而是这次关闭。

总结一下:

  • 在正确的时间进行 Activity 。
  • 仅在需要时创建新线程。这些都不是细节。
  • 如果您仍想发送/接收消息,请不要关闭套接字。

关于java - 如何在 run 方法之外发送对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54266746/

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