java套接字的问题
为了理解java套接字,我正在尝试重新设计客户机-服务器体系结构。 因此,我有一个向服务器发送消息的客户端,而服务器只是“说”类似于(服务器)的东西 现在我们开始:java套接字的问题,java,sockets,client-server,socketserver,Java,Sockets,Client Server,Socketserver,为了理解java套接字,我正在尝试重新设计客户机-服务器体系结构。 因此,我有一个向服务器发送消息的客户端,而服务器只是“说”类似于(服务器)的东西 现在我们开始: public class ServeurTCP { static ServerSocket socketServeur; static Socket socketVersUnClient; static BufferedReader in; static PrintWriter out; public static void m
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();
}
问题似乎是两个类之间的连接都不好,例如,我无法从服务器向客户端发送一条消息,我不知道原因。通过一些快速修复,它可以工作:
特使消息
中,在消息末尾添加一个换行符:printer.write(消息+“\n”)
客户端正在使用clientReader.readLine
从服务器读取数据,因此它将被卡住,直到收到换行符为止main
中,修复字符串比较以使用…equals(“fin”)
而不是=
,否则无论您输入什么,while
循环将永远不会结束telnet
作为您的客户端:
telnet localhost 9999
在基本功能完成后,尝试以下操作:
- 连续连接2-3次:服务器能正确处理吗
- 同时从2-3个窗口连接:服务器能否处理并发客户端?(好的,这可能超出您的范围…)
服务器正常工作后,在客户端上工作(替换telnet)。测试套接字的一个一般提示:使用telnet或类似的终端程序测试服务器(在linux/unix/mac上,启动您的服务器,然后打开一个shell并键入
telnet localhost 9999
。这将减少服务器上bug的搜索空间。我也是法国人,我理解您所写的内容,但如果您的代码示例是英文的(sendMessage,receiveMessage),则对其他人来说会更容易要了解您在循环中所做的事情,请使用Java比较字符串,例如(message=lireMessageAuClavier())!=“fin”
。在处理套接字之前,可能先学习基本知识。是的,请使用.equals()用于字符串比较。请注意标记是独立的。也就是说,您不能组合多个标记来创建单个概念。标记[client]
和[server]
一起与单个[client server]不是一回事
tag。请务必阅读选择标记时出现的说明!错误是我的sendMessages方法中\n出现了错误。谢谢