gpt4 book ai didi

java - 服务器向客户端发送消息

转载 作者:太空宇宙 更新时间:2023-11-04 14:24:22 24 4
gpt4 key购买 nike

我对 Java 比较陌生,在创建多客户端/服务器聊天时遇到问题。

我需要实现服务器,使其可以从一个或多个客户端接收多条消息,并将所有这些消息发送到所有客户端。因此,假设有两个客户端,client1 向服务器发送消息“hi”。服务器会将该消息发送到客户端 1 和客户端 2(它会发回到所有可能连接到服务器的客户端)。

此外,如何将客户的用户名与其消息关联起来?如果 client1 发送“hi”,我希望 Client1 和 Client2 中显示消息的 TextAreas 说“client1:hi”。

实现是在 JavaFX 中完成的。

服务器代码:

package server;

import java.io.*;
import java.net.*;
import java.util.*;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextArea;

public class ServerFormController implements Initializable{
@FXML
public TextArea svrLog;
private int clientNo = 0;

ArrayList<HandleAClient> clients = new ArrayList<>();

//@Override
// public void run()
// {

// }

@Override
public void initialize(URL url, ResourceBundle rb) {
new Thread( () ->
{
try{

ServerSocket serverSocket = new ServerSocket(8000);
svrLog.appendText("Server started at " + new Date() + '\n');

while (true)
{
Socket socket = serverSocket.accept();
svrLog.appendText("Worked \n");

clientNo++;

//svrLog.appendText("Starting thread for client " + clientNo + "at"
// + new Date() + '\n');

// InetAddress inetAddress = socket.getInetAddress();
//svrLog.appendText("Client " + clientNo + "'s host name is "
//+ inetAddress.getHostName() + "\n");
// svrLog.appendText("Client " + clientNo + "'s IP Address is "
// + inetAddress.getHostAddress() + "\n");

new Thread(new HandleAClient(socket)).start();
}

} catch (IOException ex) {
svrLog.appendText("Couldn't create ServerSocket! \n");
}
}).start();
}

/** Creates individual client socket*/
class HandleAClient implements Runnable {
private Socket socket;
DataInputStream inputFromClient = null;
DataOutputStream outputToClient = null;
//ServerFormController svr;

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

public void run()
{
try{
inputFromClient = new DataInputStream(socket.getInputStream());
outputToClient = new DataOutputStream(socket.getOutputStream());

while (true)
{
String msg = inputFromClient.readUTF();
// for(int i = 0; i < clients.size(); i++) // probably because object in client contain null datastreams
// clients.get(i).outputToClient.writeUTF(msg); // nope.
outputToClient.writeUTF(msg);
svrLog.appendText(msg);
svrLog.appendText("New message received from client. Sent to all clients.");

}
} catch (IOException ex) {
svrLog.appendText("Could not create data stream with client! \n");
}
}
}
}

客户端代码:

package handlerclient;

import java.io.*;
import java.net.*;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;

public class HandlerClientFormController implements Initializable {
@FXML
private TextField ipAdrText; // TextField to get the IP Address
@FXML
private TextField usernameText; // TextField to get the user's chat name
@FXML
private Button clientConnectBtn; // Tries to connect to server
@FXML
private TextArea msgLogTxtArea; // Displays all the messages between the clients
@FXML
private TextArea msgSendTxtArea; // TextArea to get the message from the client
@FXML
private Button clientSendBtn; // Sends the message from the client to the server

DataOutputStream toServer = null;
DataInputStream fromServer = null;

/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}

@FXML
private void onConnectBtnClick(ActionEvent event) {
try{
Socket socket = new Socket(ipAdrText.getText(), 8000);
fromServer = new DataInputStream(socket.getInputStream());
toServer = new DataOutputStream(socket.getOutputStream());
}
catch (IOException ex)
{
msgLogTxtArea.appendText("Could not connect to server!");
}
}

@FXML
private void onSendBtnClick(ActionEvent event) {
try{
toServer.writeUTF(msgSendTxtArea.getText());
toServer.flush();

String newmsg = fromServer.readUTF();

msgLogTxtArea.appendText(newmsg + '\n');
}
catch (IOException ex)
{
msgLogTxtArea.appendText("Could not send/receive message! \n");
}
}

}

最佳答案

例如,可以通过扩展 HandleAClient 的构造函数来完成。
想法 - 保存在客户端处理程序中客户端的信息。
在您的 ServerFormController 中创建 HandleAClient 实例时,我们有有关客户端号码的信息。我们可以将其作为构造函数的附加参数传递给 HandleAClient,这样当客户端处理程序从客户端接收消息时,它将能够使用具体客户端的名称生成“个性化”消息。

关于java - 服务器向客户端发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26829296/

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