gpt4 book ai didi

java - 如何在java服务器客户端中通过套接字传递对象

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

我是 Java 套接字的新手,我看过很多例子,但我不明白如何将参数从服务器传递到客户端,反之亦然。我的目标是传递一个对象,这就是我使用对象 I/O 流的原因。

我必须对服务器和玩家进行分类。

public class Server extends Thread{
public static final int TEST = 165;

ServerSocket serverSocket;
InetAddress address;

Player playerWhite;

public Server() {
start();
}

@Override
public void run() {
try
{
address = InetAddress.getLocalHost();
serverSocket = new ServerSocket(6000);
playerWhite = new Player();

System.out.println("server waits for players");
playerWhite.socket = serverSocket.accept();
playerWhite.start();
sendTestMessage(playerWhite);

}
catch (IOException ex)
{
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}

public void sendTestMessage(Player player) throws IOException
{
ObjectOutputStream testToClient = new ObjectOutputStream(player.socket.getOutputStream());
testToClient.write(TEST);
testToClient.flush();
}

以及 Player 类:

public class Player extends Thread {   
Socket socket;

Player() throws IOException
{
socket = new Socket(InetAddress.getLocalHost(), 6000);
}

@Override
public void run() {
try {
listenTestStream();
}
catch (IOException | ClassNotFoundException ex)
{
Logger.getLogger(CheckerPlayer.class.getName()).log(Level.SEVERE, null, ex);
}
}

public void listenTestStream() throws IOException, ClassNotFoundException
{
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
int message = ois.readInt();

//To test
System.out.println("Server listened: " + message);
}

我执行它时在另一个类中创建一个服务器对象。

当我测试这个应用程序时,我发现有时客户端比服务器更快。是否可以让他“等待”服务器响应?感谢您的回复。

编辑 1:问题解决方案:

从外部我们应该创建:

玩家玩家 = new Player();//(玩家类继承自Thread)
播放器.start();

并删除 Player 变量 - 没有必要,我们只需要 Socket,所以:服务器:

SocketplayerWhiteSocket

public void run() {
try
{
serverSocket = new ServerSocket(PORT);
playerWhiteSocket = serverSocket.accept();
sendMessage(playerWhiteSocket, "Hello");
}
catch(IOException | ClassNotFoundException ex)
{}

public void sendMessage(Socket socket, String message) throws IOException
{
ObjectOutputStream testToClient = new ObjectOutputStream(socket.getOutputStream());
testToClient.writeObject(message);
testToClient.flush();
}

在 Player 类中我们需要 get 方法:

public String receiveMessage() throws IOException, ClassNotFoundException
{
//socket is a variable get from Player class socket = new Socket("severHost", PORT);
ObjectInputStream messageFromServer = new ObjectInputStream(socket.getInputStream());
String message = (String) messageFromServer.readObject();
return message;
}

最佳答案

我建议这样做 public void start(){

try {
ServerSocket = new ServerSocket(this.port,10,this.localAddress);

// set timeout if you want
//this.clientServerSocket.setSoTimeout(timeout);
// infinity loop
while(true)
{
//wait for a client connection
Socket socket = ServerSocket.accept();
// start thread for every new client
Thread t = new Thread(new AcceptClients(this.socket));
t.start();
System.out.println(L"new client connected");
// call garbage collector and hope for the best
System.gc();
}
} catch (IOException e) {
System.out.println("IO Error");
e.printStackTrace();
}
}

然后在另一个类(class)

public class AcceptClients implements Runnable{

// socket
private Socket socket;

public AcceptClients (Socket socket){
this.socket = socket;
}
@Override
public void run() {
// what happens if a client connect
}

}

我一直用这个,效果很好

关于java - 如何在java服务器客户端中通过套接字传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34055357/

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