gpt4 book ai didi

java - java套接字的问题

转载 作者:太空宇宙 更新时间:2023-11-04 15:07:19 25 4
gpt4 key购买 nike

我正在尝试重现客户端-服务器架构以理解java套接字。所以我有一个客户端向服务器发送消息,服务器只是“说”类似“(服务器)”的内容

所以我们开始吧:

public class ServeurTCP {

static ServerSocket socketServeur;
static Socket socketVersUnClient;
static BufferedReader in;
static PrintWriter out;

public static void main(String[] args){
//attente des connexions sur le port 9999

//traitement des exceptions
try {
socketServeur = new ServerSocket(9999);

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


//dans une boucle pour chaque socket clientes, appeler traiterSocketClient
while(true)
{
try {
socketVersUnClient = socketServeur.accept();
System.out.println("Attente des clients");

in = creerReader(socketVersUnClient);
out = creerPrinter(socketVersUnClient);
envoyerMessage(out,"test");
System.out.println(recevoirMessage(in));
traiterSocketClient(socketVersUnClient);

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


}

public static void traiterSocketClient(Socket socketVersUnClient) {
//Créer printer et reader


//Tant qu'il y'a message à lire via recevoirMessage
while(!recevoirMessage(in).equals("fin"))
{
System.out.println("ici");
//Envoyer message client via envoyerMessage
try {
envoyerMessage(out,"(Serveur) message : "+in.readLine());
} catch (IOException e) {
e.printStackTrace();
}
finally
{
try{
socketVersUnClient.close();
} catch(IOException e){
e.printStackTrace();
}
}
}
}

public static BufferedReader creerReader(Socket socketVersUnClient)
{
//crée BufferedReader associé à la socket
try {
return new BufferedReader(new InputStreamReader(socketVersUnClient.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

public static PrintWriter creerPrinter(Socket socketVersUnClient)
{
//crée PrintWriter associé à la socket
try {
return new PrintWriter(socketVersUnClient.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

public static String recevoirMessage(BufferedReader reader)
{

//Récupérer une ligne
String userInput = null;

try {
userInput = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}


//Retourner la ligne lue ou null si aucune ligne à lire
return userInput;
}

public static void envoyerMessage(PrintWriter printer, String message) throws IOException
{
System.out.println("Message");
//envoyer le message vers client
printer.write(message);
printer.flush();
}
}

这是我的客户端类

public class ClientTCP {

static Socket socketClient;
static BufferedReader in;
static BufferedReader clientReader;
static String message;
static PrintWriter out;


public static void main(String[] args)
{
//créer une socket client
try {
socketClient = new Socket("localhost",9999);

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

//créer reader et writer associés
in = creerReader(socketClient);
out = creerPrinter(socketClient);

clientReader = new BufferedReader(new InputStreamReader(System.in));

while( ((message = lireMessageAuClavier()) != "fin"))
{
//envoyer le message au serveur
envoyerMessage(out,"(Client) message : "+message);

//recevoir et afficher la réponse du serveur
recevoirMessage(in);
}

}

public static String lireMessageAuClavier() {


//lit un message au clavier en utilisant par exemple un buefferedReader
//sur System.in

try {
return clientReader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return null;

}

public static BufferedReader creerReader(Socket socketVersUnClient)
{
//crée BufferedReader associé à la socket
try {
in = new BufferedReader(new InputStreamReader(socketVersUnClient.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}

return in;
}

public static PrintWriter creerPrinter(Socket socketVersUnClient)
{
//crée PrintWriter associé à la socket
try {
out = new PrintWriter(socketVersUnClient.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
return out;
}

public static String recevoirMessage(BufferedReader reader)
{
//Récupérer une ligne
String userInput = null;

try {

userInput = reader.readLine();

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

//Retourner la ligne lue ou null si aucune ligne à lire
return userInput;

}

public static void envoyerMessage(PrintWriter printer, String message)
{
//envoyer le message vers client
printer.write(message);

printer.flush();
}

问题似乎是两个类之间的连接不良,例如我无法从服务器向客户端发送一条消息,而且我不明白为什么。

最佳答案

通过一些快速修复,它会起作用:

  1. 在服务器的 envoyerMessage 中,在消息末尾添加换行符: printer.write(message + "\n"); 客户端正在读取使用 clientReader.readLine 从服务器获取,因此它会被卡住,直到收到换行符。
  2. 在客户端的 main 中,修复字符串比较以使用 ...equals("fin") 而不是 != ,否则无论您输入什么,while循环都永远不会结束。

当您正在处理此问题时,我建议首先在服务器上工作并使用 telnet 作为您的客户端:

telnet localhost 9999

基本的工作完成后,尝试以下操作:

  • 连续连接 2-3 次:服务器能否正确处理?
  • 同时从 2-3 个窗口进行连接:服务器能否处理并发客户端? (好吧,这可能超出了你的范围......)

服务器工作正常后,再在客户端工作(代替telnet)。

关于java - java套接字的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21812830/

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