07-29Java 定时器,socket

																													## 定时器
定时器:用来设定任务出发时间规则,可以绑定多个定时任务;定时任务:具体要执行的任务,一个定时任务是一个子线程。
  • 创建一个定时器:
  • Timer timer = new Timer();
  • 在定时器绑定定时任务。延迟3秒后执行定时任务,定时任务使用TimerTask创建,该类是一个线程类,实现了Runnable 接口,只需要重写run方法。
timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("3秒后定时任务执行");

            }
        },3000);
  • 在定时器上绑定一个指定时间点执行的定时任务
Calendar c = Calendar.getInstance();
        c.set(2021,7,29,10,42);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("2021年7月29日10点42分执行任务");
            }
        },c.getTime());
  • 定时器延迟3秒执行,每隔1秒执行
 timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("延迟3秒执行,每隔1执行一次");

            }
        },3000,1000);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("2021年7月29日10点48分执行任务,每间隔1秒执行一次");

            }
        },c.getTime(),1000);
Socket 的使用:
Client端口
package com.ljl0729;

import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 * 客户端Socket
 */

public class Client {
    public static void main(String[] args) {
        //创建一个Socket对象,用来跟服务端的Socket进行通信,传递数据

        //指定要连接的Socket端的服务器IP地址和端口号,
        // 本机ip是127.0.0.1或者写本机的域名localhost

        //如果连接成功,返回本机的一个Socket对象
        try(Socket s = new Socket("127.0.0.1",8000);
            //打开输入流用来接收从服务端发送来的数据
            InputStream is = s.getInputStream();
            //打开输出流,用来向服务端发送信息
            OutputStream os = s.getOutputStream();
            //封装输入流流
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            //封装输出流
            PrintWriter pw = new PrintWriter(os);
        ){
            //获取服务器发送过来的数据
            String msg = br.readLine();
            System.out.println("服务器:"+msg);
            Scanner sc = new Scanner(System.in);
            Thread s1 = new Thread(()->{
                while (true){
                    //读取服务器发送过来的
                    try {
                        System.out.println(br.readLine());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });

            while(true){
//                //读取服务器发送过来的
//                System.out.println(br.readLine());
//                //
                String str = sc.next();
                //向服务器端发送数据
                pw.println(str);
                //刷新缓冲区,把数据及时传输到对方
                pw.flush();
            }

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}

Server端口
package com.ljl0729;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 * f服务端Socket
 */

public class Server {
    public static void main(String[] args) {

        try (//创建服务端ServerSocket对象,指定端口接收客户端请求

             ServerSocket ss = new ServerSocket(8000);
             //监听客户端发送的请求,该方法阻塞,如果没有客户端发来请求一直等待,
             // 直到有客户端发来请求返回Socket对象
             Socket s = ss.accept();
             //打开输入流对象,读取客户端发过来的数据
             InputStream is = s.getInputStream();
             //打开输出流对象,向客户端发送数据
             OutputStream os = s.getOutputStream();
             //封装输入流
             BufferedReader br =  new BufferedReader(new InputStreamReader(is));
             //封装输出流
             PrintWriter pw = new PrintWriter(os);

        ){
            System.out.println("客户端连接服务器成功!");
            System.out.println("欢迎访问服务器");

            //服务器端向客户端发送数据
            pw.println("欢迎访问服务器34");
            //刷新缓冲区,把数据及时传输到对方
            pw.flush();
            //获取键盘输入对象
            Scanner sc = new Scanner(System.in);

            Thread t1 = new Thread(()->{
                while (true){

                    try {
                        System.out.println("客户端说:"+br.readLine());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            },"接收线程");
            t1.start();

            while (true){
                //获取键盘输入内容
                String str = sc.next();
                //发送输入内容到客户端
                pw.println(str);
                pw.flush();
                /*//接收客户端发送过来的数据
                String msg = br.readLine();
                System.out.println("客户端"+msg);*/

            }


        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实现Socket连接池可以使用Apache Commons Pool库中的GenericObjectPool类。首先需要实现一个工厂类,它将创建和销毁Socket连接。然后,使用GenericObjectPool类来创建一个连接池并维护连接。具体步骤如下: 1. 创建一个工厂类,实现org.apache.commons.pool2.PooledObjectFactory接口,并重写create()、destroy()、validate()等方法。 2. 创建一个GenericObjectPool实例,并将刚才创建的工厂类作为参数传入。 3. 使用borrowObject()方法从连接池中获取一个连接,使用returnObject()方法将连接返回给池。 4. 在使用完后,调用close()方法销毁连接池。 代码示例: ```java //工厂类 public class SocketFactory implements PooledObjectFactory<Socket> { private String host; private int port; public SocketFactory(String host, int port) { this.host = host; this.port = port; } @Override public PooledObject<Socket> makeObject() throws Exception { Socket socket = new Socket(host, port); return new DefaultPooledObject<>(socket); } @Override public void destroyObject(PooledObject<Socket> p) throws Exception { p.getObject().close(); } @Override public boolean validateObject(PooledObject<Socket> p) { return p.getObject().isConnected(); } //... } //使用示例 String host = "localhost"; int port = 8080; GenericObjectPool<Socket> pool = new GenericObjectPool<>(new SocketFactory(host, port)); pool.setMaxTotal(10); Socket socket = pool.borrowObject(); //使用socket pool.returnObject(socket); pool.close(); ``` 上面是一个简单的示例,在实际使用中可能需要进行更多设置,例如设置连接池 ### 回答2: 使用Java实现socket连接池可以通过以下步骤: 首先,我们需要创建一个Socket连接池的类,该类需要包含连接池的相关属性和方法。在连接池中,我们可以维护一个空闲连接和一个正在使用的连接的列表。这些连接可以是Socket对象或者Socket连接的封装对象。 其次,我们需要实现连接池的初始化方法。在初始化方法中,我们可以创建一定数量的连接并将它们添加到空闲连接列表中。 接下来,我们需要实现一个从连接池中获取连接的方法。在该方法中,我们可以从空闲连接列表中获取一个可用的连接,并将其移动到正在使用的连接列表中。 然后,我们需要实现一个释放连接的方法。在该方法中,我们将使用完的连接从正在使用的连接列表中移除,并将其返回给空闲连接列表。 此外,为了防止连接过多,我们还可以实现一个定时器任务,定期检查连接池中的连接数,并根据需要创建或释放连接。 最后,当我们不再使用连接池时,我们需要关闭连接池。在关闭连接池时,我们需要关闭所有的连接,并清空空闲连接和正在使用的连接列表。 通过以上步骤,我们可以实现一个简单的socket连接池。使用连接池可以提高系统性能,减少了创建和关闭连接的开销,并且可以重复利用连接,提高了系统的稳定性和可靠性。 ### 回答3: 使用Java实现socket连接池的主要目的是为了提高socket连接的复用性和效率。下面是一个简单的示例实现: ```java import java.io.IOException; import java.net.Socket; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class SocketConnectionPool { private static final int MAX_POOL_SIZE = 10; // 连接池的最大容量 private static final String HOST = "localhost"; // 连接的主机 private static final int PORT = 8080; // 连接的端口 private BlockingQueue<Socket> connectionPool; // 存放socket连接的连接池 public SocketConnectionPool() { connectionPool = new ArrayBlockingQueue<>(MAX_POOL_SIZE); initializePool(); } private void initializePool() { for (int i = 0; i < MAX_POOL_SIZE; i++) { try { Socket socket = new Socket(HOST, PORT); connectionPool.add(socket); } catch (IOException e) { e.printStackTrace(); } } } public Socket getConnection() throws InterruptedException { return connectionPool.take(); // 从连接池中取出一个socket连接 } public void releaseConnection(Socket socket) { connectionPool.add(socket); // 将socket连接放回连接池中 } } ``` 上述代码中,我们使用了一个`BlockingQueue`来实现连接池,最大容量为`MAX_POOL_SIZE`。在初始化连接池时,我们通过循环创建了一定数量的socket连接并将其添加到连接池中。通过`getConnection()`方法可以获取一个空闲的连接,如果连接池中没有可用连接,则会阻塞等待。使用完连接后,可以通过`releaseConnection(Socket socket)`方法将连接放回连接池以便复用。 当需要使用socket连接时,可以按照下面的方式进行调用: ```java SocketConnectionPool connectionPool = new SocketConnectionPool(); Socket socket = null; try { socket = connectionPool.getConnection(); // 使用socket连接进行业务操作 } catch (InterruptedException e) { e.printStackTrace(); } finally { if (socket != null) { connectionPool.releaseConnection(socket); } } ``` 通过这种方式,我们可以有效地重复使用已有的socket连接,减少创建和销毁连接的开销,提高应用程序的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值