如何关闭 accept
发布时间:2025-05-21 18:06:39 发布人:远客网络
一、如何关闭 accept
加入一个ServerSocket正在另一个线程堵塞accept,那如何停止accept或者关闭Socket?
其实直接close socket也可以,不过会抛出异常,我的意思是有什么比较安全而又简单的办法?难道要加一个标志,然后要关闭的时候把标志设为stop,然后连接listernSocket?这样也未免太麻烦了
JDK5.0里面新增了java.util.concurrent包(对于多线程的开发建议尽量使用这个包),下面是javadoc里面的样例代码
下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的 Executors.newFixedThreadPool(int)工厂方法:
class NetworkService implements Runnable{
private final ServerSocket serverSocket;
private final ExecutorService pool;
public NetworkService(int port, int poolSize)
serverSocket= new ServerSocket(port);
pool= Executors.newFixedThreadPool(poolSize);
二、java服务器接收客户端请求怎样实现的
import java.io.BufferedReader;
import java.io.InputStreamReader;
//构造服务器ServerSocket对象,参数为服务器端开放的端口号
ServerSocket ss= new ServerSocket(30102);
System.out.println("服务器准备就绪!");
//死循环可以使服务器持续处于接收客户端状态
//该方法使程序阻塞,等待客户端的链接,当监听到客户端的链接,创建一个Socket对象与客户端单独会话
//为了不影响服务器监听其它客户端,这里开启了一个线程,由线程处理与这个客户端的会话
public static void main(String[] args){
class ServerThread extends Thread{
private BufferedReader read= null;
private PrintStream print= null;
public ServerThread(Socket s){
//从Socket中获取输入流和输出流,由于我们只做一个简单的字符串通讯,所以采用BufferedRead和PrintStream来封装输入、输出流
read= new BufferedReader(new InputStreamReader(s.getInputStream()));
print= new PrintStream(s.getOutputStream());
//这里循环可以使服务器持续的接收客户端信息。read.readLine()通过输入流读取一段字符串,赋值给message变量,如果message字符串不为“exit”则循环,否则结束循环
while(!(message= read.readLine()).equals("exit")){
//将字符串前面添加“返回:”,再发回客户端
print.println("返回:"+ message);
//在 finally代码块中无论如何都会执行下面代码:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.UnknownHostException;
//构造与服务器通讯的Socket对象,参数为服务器IP地址(String)和端口号(int),端口号需要和服务器端开放的端口号对应
Socket s= new Socket("192.168.1.100", 30102);
//启动一个线程与服务器通讯,并把链接服务器的Socket对象传递过去
} catch(UnknownHostException e){
public static void main(String[] args){
class LinkThread extends Thread{
private PrintStream out= null;
private BufferedReader in= null;
private Scanner scanner= null;
//将Socket对象实例保存在全局变量中,因为run方法中我们还要用它断开链接
//从Socket中获取输入流和输出流,由于我们只做一个简单的字符串通讯,所以采用BufferedRead和PrintStream来封装输入、输出流
out= new PrintStream(s.getOutputStream());
in= new BufferedReader(new InputStreamReader(s.getInputStream()));
} catch(UnknownHostException e){
scanner= new Scanner(System.in);
System.out.println("提示:如果要结束本次会话,请输入“exit”指令!");
//死循环可以使客户端不断的向服务器发送信息,不用担心循环无法结束,后面的return语句可以结束整个线程。
System.out.print("请输入:");
//将用户输入的字符串保存在message变量中
String message= scanner.nextLine();
System.out.println("本次会话结束!");
//在 finally代码块中无论如何都会执行下面代码:
三、java群聊功能是如何实现的
Java群聊功能可以通过网络编程实现,一般使用Socket和ServerSocket类来完成。具体实现步骤如下:
1.创建一个服务器端程序,使用ServerSocket类创建一个ServerSocket对象,并指定监听的端口号。
2.创建一个客户端程序,使用Socket类创建一个Socket对象,并指定连接的服务器IP地址和端口号。
3.服务器端接收客户端连接后,使用accept()方法获取到与该客户端通信的Socket对象。
4.服务器端开启一个新的线程,使用该线程与客户端进行通信,并且将该线程添加到一个线程集合中。
5.客户端向服务器端发送消息时,使用Socket对象的OutputStream将消息发送给服务器端。
6.服务器端从线程集合中获取每个线程,遍历并向每个客户端发送消息,使用Socket对象的OutputStream将消息发送给客户端。
7.客户端使用Socket对象的InputStream读取服务器端发送的消息。
8.当客户端或服务器端任意一方关闭连接时,另一方也需要关闭连接。
以上是简要的Java群聊实现步骤,当然还有其他细节需要考虑,比如消息的格式、多线程同步等问题,但总体上这些步骤可以帮助你实现Java群聊功能。