Java 如何停止客户端-套接字-服务器交互中的循环

Java 如何停止客户端-套接字-服务器交互中的循环,java,socketserver,Java,Socketserver,我仍在努力学习socket服务器和客户端编程。所以我根据我收到的教程进行了编码。我设法为多客户端交互创建了线程。然而,我无法停止客户端处理程序中的循环,该处理程序一直显示我发出的欢迎消息,即使在我提出理由之后也是如此 如何阻止已发出的欢迎信息的循环 服务器端 公共类服务器{ 公共静态void main(字符串[]args)引发IOException{ //服务器侦听端口4999 ServerSocket ss=新的ServerSocket(4999); //运行循环以获取客户端请求 while(

我仍在努力学习socket服务器和客户端编程。所以我根据我收到的教程进行了编码。我设法为多客户端交互创建了线程。然而,我无法停止客户端处理程序中的循环,该处理程序一直显示我发出的欢迎消息,即使在我提出理由之后也是如此

如何阻止已发出的欢迎信息的循环

服务器端

公共类服务器{
公共静态void main(字符串[]args)引发IOException{
//服务器侦听端口4999
ServerSocket ss=新的ServerSocket(4999);
//运行循环以获取客户端请求
while(true){
套接字s=null;
尝试
{
//套接字对象接收传入的客户端请求
s=ss.accept();
System.out.println(“新客户端已连接:+s”);
//获取输入和输出流
DataInputStream dis=新的DataInputStream(s.getInputStream());
DataOutputStream dos=新的DataOutputStream(s.getOutputStream());
System.out.println(“为此客户端分配新线程”);
//创建新线程对象
线程t=新的ClientHandler(s、dis、dos);
//调用start()方法
t、 start();
}
捕获(例外e){
s、 close();
e、 printStackTrace();
}
}
}
}
类ClientHandler扩展线程{
DateFormat fordate=新的简化格式(“yyyy/MM/dd”);
DateFormat fortime=新的简化格式(“yyyy/MM/dd”);
最终数据输入流dis;
最终数据输出流dos;
最终插座s;
//建造师
公共ClientHandler(套接字、数据输入流dis、数据输出流dos){
这个.s=s;
this.dis=dis;
this.dos=dos;
}
@凌驾
公开募捐{
收到字符串;
字符串返回;
while(true){
试一试{
//询问用户他的位置
dos.writeUTF(“欢迎使用CREWCUTS套接字服务器。\n”+
“选择[客户|理发店]\n”+
“类型退出以终止连接”);
//得到客户的答复
已接收=dis.readUTF();
如果(接收。等于(“退出”)){
System.out.println(“客户端”+此.s+“发送退出”);
System.out.println(“闭合连接”);
这是s.close();
System.out.println(“连接关闭”);
打破
}
//创建日期对象
日期=新日期();
//根据客户机的回答写入输出流
开关(已接收){
案例“客户”:
toreturn=fordate.format(日期);
dos.writeUTF(toreturn+“\n欢迎使用CREWCUTS套接字服务器的客户服务”);
打破
案例“理发店”:
toreturn=fordate.format(日期);
dos.writeUTF(toreturn+“\n欢迎使用CREWCUTS套接字服务器的BarberShop服务”);
打破
违约:
dos.writeUTF(“无效输入”);
打破
}
}
捕获(IOE异常){
e、 printStackTrace();
}
}
尝试
{
//关闭资源
this.dis.close();
this.dos.close();
}
捕获(IOE异常){
e、 printStackTrace();
}
}
}
客户端

公共类客户端{
公共静态void main(字符串[]args)引发IOException{
试一试{
扫描仪scn=新扫描仪(System.in);
//建立与本地主机中服务器端口4999的连接
套接字s=新套接字(“localhost”,4999);
//获取输入和输出流
DataInputStream dis=新的DataInputStream(s.getInputStream());
DataOutputStream dos=新的DataOutputStream(s.getOutputStream());
//用于在客户端和客户端处理程序之间交换信息的循环
while(true)
{
System.out.println(dis.readUTF());
字符串tosend=scn.nextLine();
dos.writeUTF(tosend);
//若客户端发送退出,则连接关闭并从循环中断
如果(tosend.equals(“退出”)){
System.out.println(“关闭连接:+s”);
s、 close();
System.out.println(“连接关闭”);
打破
}
//按客户要求打印信息
接收到的字符串=dis.readUTF();
系统输出打印项次(已接收);
}
//关闭资源
scn.close();
dis.close();
dos.close();
}
捕获(例外e){
e、 printStackTrace();
}
}
}

只需将客户机和服务器中的欢迎消息从循环中删除,如下所示

server.java

导入java.text.DateFormat;
导入java.text.simpleDataFormat;
导入java.util.Date;
导入java.io.*;
导入java.net。*;
公共类服务器{
公共静态void main(字符串[]args)引发IOException{
//服务器侦听端口4999
ServerSocket ss=新的ServerSocket(4999);
//运行循环以获取客户端请求
while(true){
套接字s=null;
尝试
{
//套接字对象接收传入的客户端请求
s=ss.accept();
System.out.println(“新客户端已连接:+s”);
//获取inpu