您当前的位置:首页 > 互联网教程

如何关闭 accept

发布时间:2025-05-21 18:06:39    发布人:远客网络

如何关闭 accept

一、如何关闭 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群聊功能。