Java:如何无例外地停止服务器(关闭Socket)?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java:如何无例外地停止服务器(关闭Socket)?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4409字,纯文字阅读大概需要7分钟。
内容图文
我做了一个服务器,可以加入许多客户.
但是我有一个问题.
我添加了启动/停止按钮,它应该启动/停止服务器.但是代码无法按我想要的方式工作:未关闭连接,代码转到IOException“这是问题”(在ServerLogic部分中).
此外,客户端仍可以与服务器联系.
服务器逻辑
public class ServerLogic
{
private static ServerSocket m_sSocket;
private static Set<ServerSubscriber> m_subscriberList = new HashSet<ServerSubscriber>();
private static boolean m_isServerRun = false;
private static class ServerLogicHolder
{
static final ServerLogic INSTANCE = new ServerLogic();
}
private ServerLogic()
{}
public static ServerLogic getServerLogic()
{
return ServerLogicHolder.INSTANCE;
}
/**
* It starts listening of incoming connections from the clients.
*
* @param port
*/
public void startListening(int port)
{
try
{
if (!m_isServerRun)
{
m_sSocket = new ServerSocket(port);
K6s.getUiServerConsole().addLine(Config.LOG_START);
m_isServerRun = true;
}
else
{
System.out.println(Config.LOG_ERROR1);
}
}
catch (IOException e)
{
System.out.println(Config.LOG_ERROR1);
}
try
{
while (isServerRun())
{
new Thread(new ServerSubscriber(m_sSocket.accept(), K6s.getUiServerConsole())).start();
}
}
catch (IOException e1)
{
/*
java.net.SocketException: socket closed
at java.net.DualStackPlainSocketImpl.accept0(Native Method)
at java.net.DualStackPlainSocketImpl.socketAccept(Unknown Source)
at java.net.AbstractPlainSocketImpl.accept(Unknown Source)
at java.net.PlainSocketImpl.accept(Unknown Source)
at java.net.ServerSocket.implAccept(Unknown Source)
at java.net.ServerSocket.accept(Unknown Source)
at org.czarny.k6s.comm.ServerLogic.startListening(ServerLogic.java:69)
at org.czarny.k6s.gui.K6s$2$1.run(K6s.java:138)
at java.lang.Thread.run(Unknown Source)
*/
}
}
/**
* Just close server's socket.
*/
public void stopListening()
{
if (m_isServerRun)
{
try
{
m_isServerRun = false;
m_sSocket.close();
m_sSocket = null;
}
catch (IOException e)
{
m_isServerRun = true;
System.out.println(Config.LOG_ERROR4);
}
}
}
public HashSet<ServerSubscriber> getSubscriberList()
{
return (HashSet<ServerSubscriber>) m_subscriberList;
}
public boolean isServerRun()
{
return m_isServerRun;
}
}
客户订阅者(未删除不必要的代码)
public class ServerSubscriber implements Runnable
{
private Socket m_socket;
private LogComponent m_serverConsole;
private PrintWriter m_outComm;
private String m_subscriberIP;
private String m_subscriberName;
private String m_subsctiberLogInfo;
ServerSubscriber(Socket socket, LogComponent serverConsole)
{
m_socket = socket;
m_serverConsole = serverConsole;
try
{
m_outComm = new PrintWriter(socket.getOutputStream(), true);
}
catch (IOException e)
{
e.printStackTrace();
}
sendMessage(Config.MSG_HANDSHAKE);
}
/**
* This method runs messages from this subscriber.
*/
public void run()
{
String line;
BufferedReader inComm = null;
try
{
inComm = new BufferedReader(new InputStreamReader(m_socket.getInputStream()));
}
catch (IOException e)
{
m_serverConsole.addLine(Config.LOG_ERROR3);
}
while (ServerLogic.getServerLogic().isServerRun())
{
try
{
//do something here
}
}
}
处理START / STOP的按钮
uiStart.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
if (!ServerLogic.getServerLogic().isServerRun())
{
uiStart.setText(Config.GUI_BTN_STOP);
new Thread(new Runnable()
{
public void run()
{
try
{
ServerLogic.getServerLogic().startListening(Integer.parseInt(uiServerPort.getText()));
}
catch (Exception e)
{
e.printStackTrace();
}
}
}).start();
}
else
{
ServerLogic.getServerLogic().stopListening();
m_uiServerConsole.addLine(Config.LOG_STOP);
uiStart.setText(Config.GUI_BTN_START);
}
}
});
我错过了什么?
如何正确关闭连接而没有任何异常?
我应该在关闭Socket之前向所有客户端发送一些要求关闭的消息,还是仅在服务器上关闭Socket就足够了吗?
问候.
解决方法:
I added START/STOP button which should start/stop server. But the code does not work like I want: connection isn’t closed
那是因为您要关闭ServerSocket,而不是接受的套接字.
and code goes to the IOException “THIS IS PROBLEM” (in ServerLogic part).
那很正常没错
Additionally clients still can contact with server.
现有客户端可以继续使用其现有连接.如果要关闭它们,请参阅下一步.不能创建新的连接.
How to properly close connection without any exceptions?
将其关闭以进行输入.这将导致读取导致流结束,这应该已经导致相关线程关闭套接字并退出.
Should I just before closing the Socket send to all clients some message with demand of closeure or just closing the Socket on the server should be enough?
关闭插座就足够了.发送额外的消息不会增加任何价值.客户端将从其读取中获得通常的流结束指示,或者在写入时获得IOException:连接重置.
内容总结
以上是互联网集市为您收集整理的Java:如何无例外地停止服务器(关闭Socket)?全部内容,希望文章能够帮你解决Java:如何无例外地停止服务器(关闭Socket)?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。