我的目的是在tomcat启动关闭的时候同时启动和关闭serverSocket。为了实现同时开启多个端口,每个端口同时提供给多人访问,所以使用了多线程。
请问怎么实现啊?
下面我使用了监听器:
package com.safe.tcp;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPThreadForServer implements Runnable {
private ServerSocket server;
public TCPThreadForServer(ServerSocket server) {
super();
this.server = server;
}
public void closeServer() throws IOException {
System.out.println("closeServer():关闭server");
if (null != server) {
server.close();
}
}
@Override
public void run() {
Socket client = null;
Thread clientThread = null;
try {
boolean flag = true;
while (flag) {
System.out.println("服务器开启,等待客户端访问……flag=" + flag);
client = server.accept();
clientThread = new Thread(new TCPThreadForClient(client));
// clientThread.setDaemon(true);//所有客户线程都设置为后台线程
clientThread.start();
}
System.out.println("一个service 的run 关闭client server");
client.close();
server.close();
System.out.println("一个service 的run执行完毕");
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.safe.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class TCPThreadForClient implements Runnable {
private Socket client;
public Socket getClient() {
return client;
}
public void setClient(Socket client) {
this.client = client;
}
public TCPThreadForClient(Socket client) {
super();
this.client = client;
}
@Override
public void run() {
BufferedReader buf = null;
PrintStream out=null;
try {
buf=new BufferedReader(new InputStreamReader(client.getInputStream()));
out=new PrintStream(client.getOutputStream());
boolean flag=true;
while (flag) {
String str=buf.readLine();
if(str==null||"".equals(str)||"bye".equals(str)){
flag=false;
}else {
System.out.println("服务端收到客户端说:"+str);
out.println("ECHO:"+str);
}
}
System.out.println("当前断开一位~");
out.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
可是发现关闭了server 客户端发送东西 还是有对应返回
你用个list把socket都保存起来,把他也作为参数传入线程中,socket关闭的时候从list移除,然后在你关闭服务的时候,循环list里的socket,然后close掉,这个要求这个集合是个线程安全集合
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。