`

socket 长连接

    博客分类:
  • java
阅读更多
[代码] web.xml 跳至 [1] [2] [3] [4]
?
1
2
3
4
5
6
<!-- socket监听   start -->
<listener>
  <description>Socket服务随web服务启动而启动</description>
  <listener-class>demo.socket.SocketListener</listener-class>
</listener>
<!-- socket监听   end -->
[2].[代码] SocketListener.java(服务端代码) 跳至 [1] [2] [3] [4]
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class SocketListener implements ServletContextListener {
    private ListenSocket socketThread;
    
    /**
     * 销毁 当servlet容器终止web应用时调用该方法
     */
    public void contextDestroyed(ServletContextEvent arg0) {
        if(null != socketThread && !socketThread.isInterrupted()){
            socketThread.closeSocketServer();//关闭线程
            socketThread.interrupt();//中断线程
        }
    }

    /**
     * 初始化 当servlet容器启动web应用时调用该方法
     */
    public void contextInitialized(ServletContextEvent arg0) {
        if(null == socketThread){
            socketThread = new ListenSocket();
            socketThread.start();
        }
    }

}
[3].[代码] ListenSocket.java(服务端代码) 跳至 [1] [2] [3] [4]
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
public class ListenSocket extends Thread {
    private static final int SERVER_PORT = 10000; //端口号
    private int count = 0;//连接客户端数
    private ServerSocket ss = null;//服务端socket
    
    public ListenSocket(){
        try {
            if(null==ss){
                this.ss = new  ServerSocket(SERVER_PORT);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void run() {
        System.out.println("-------主监听线程----------start----------");
        try {
            while(true){
                Socket client = ss.accept();
                count += 1;
                Thread c_thread = new CreateServerThread(client,count);
                c_thread.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    
    class CreateServerThread extends Thread {
        private Socket client; //当前所连接客户端
        private int index;//当前线程编号
        private BufferedReader in = null;//从客户端接受到的信息
        private OutputStream out = null;//返回给客户端的信息
        
        public CreateServerThread(Socket client,int index) throws IOException {
            this.client = client;
            this.index = index;
        }
        
        public void run(){
            System.out.println("-------当前连接的客户端数为----------" + index + "----------");
            String ms = "Callback accepted " + client.getInetAddress() + ":" + client.getPort();
            System.out.println(ms);
            
            try {
                in = new BufferedReader(new InputStreamReader(client.getInputStream()));//接收请求的流               
                out = client.getOutputStream();//写入缓存
                int len = 0;//监听到的字符串长度
                String str = "";//监听到的字符串
                char buf[] = new char[4096];
                while((len = in.read(buf)) > 0){
                    //读取
                    str += new String(buf,0,len);
                    System.out.println("---------获取到第"+index+"个客户端的报文:"+str);
                    if(str!=null && !"".equals(str)){
                        out.write(("服务端已接受到第"+index+"个客户端发送的报文").getBytes());
                    }else{
                        System.out.println("---------第"+index+"个客户端所传报文为空");
                        out.write("-1".getBytes());
                        break;
                    }
                }
            } catch (IOException e) {
                System.out.println("---------服务端与第"+index+"个客户端交互时异常:"+e.getMessage());
            }finally{
                try {
                    if(client!=null){
                        client.close();
                        count -= 1;
                        System.out.println("---------关闭第"+index+"个客户端连接,当前连接的客户端个数为"+count);
                    }
                } catch (IOException e) {
                    System.out.println("---------第"+index+"个客户端关闭异常:"+e.getMessage());
                }
            }
        }
    }
    
    public void closeSocketServer(){
        try{
            if(ss!=null && !ss.isClosed()){
                ss.close();
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}
[4].[代码] Client.java(客户端代码) 跳至 [1] [2] [3] [4]
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Client extends Thread{
    Socket socket;
    BufferedReader in;
    OutputStream out;
    String str;

    public Client(String str){
        this.str = str;
    }
    
    public void run() {
        try {
            socket = new Socket("127.0.0.1", 10000);
            //客户端发送给服务端消息
            out = socket.getOutputStream();
            out.write(str.getBytes());
            
            //接收到的服务端返回信息
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            int len = 0;
            String msg = "";
            char buf[] = new char[4096];
            while((len = in.read(buf)) > 0){
                msg += new String(buf,0,len);
                System.out.println("------服务端返回信息:"+msg);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args){
        new Client("hello_1").start();
        new Client("hello_2").start();
        new Client("hello_3").start();
        new Client("hello_4").start();
    }
}
分享到:
评论

相关推荐

    Java实现Socket长连接和短连接

    - **关闭策略**:合理设置超时时间,当连接长时间无数据传输时,可以考虑关闭连接以释放资源。 **4. 应用场景** 短连接适合一次性、低延迟、资源有限的场景,如网页浏览。而长连接适合实时性强、需要持续交互的...

    Socket长连接+心跳包+发送读取

    Socket长连接是网络编程中的重要概念,主要用于保持客户端与服务器之间的持续通信状态,避免每次通信都需要重新建立连接的开销。在长连接中,一旦连接建立成功,就会保持该连接,直到某一方主动断开或者因为网络问题...

    c# Socket长连接 短链接 自己封装 通讯

    标题“c# Socket长连接 短链接 自己封装 通讯”揭示了我们将讨论的主题:如何使用C#实现Socket的长连接和短连接,并自定义通信协议。这里的关键点包括: 1. **Socket基础**:Socket是网络通信中的一个抽象概念,它...

    Socket长连接demo

    Socket长连接是网络编程中的一个重要概念,特别是在设计高并发、实时性要求高的系统时,它被广泛应用。Socket,又称套接字,是网络通信的基本单位,提供了进程间、网络间进程通信的一种接口。本示例可能是一个关于...

    java socket长连接客户端服务端(标准实例)

    2. **资源释放**:虽然示例中没有明确展示资源的释放过程,但在实际开发中应该注意适当关闭不再使用的Socket连接和相关的输入输出流。 3. **并发安全**:由于涉及多线程操作,需要注意线程安全问题。 #### 七、总结...

    java socket 长连接实例

    "Java Socket 长连接实例"是关于如何实现一个持久连接的服务器和客户端程序的示例,这种连接能够保持开放,直到一方明确地关闭它。这在需要频繁通信或者需要长时间保持连接状态的应用场景中非常有用,比如聊天应用、...

    Android-Socket长连接通信心跳包消息回调Java服务端

    通过分析和学习这个项目,你可以更直观地了解上述知识点的实现方式,包括如何创建Socket连接、实现心跳包、处理消息回调以及服务端的多线程处理等。 总结,实现“Android-Socket长连接通信心跳包消息回调Java服务端...

    Socket长连接异常处理

    "Socket长连接异常处理" 在 Java 网络编程中,Socket 长连接是指在客户端和服务器端之间保持一个长期的连接,以便于数据的传输和通信。然而,在这种长连接中,可能会出现各种异常情况,影响到数据的传输和通信。...

    socket 长连接实例

    - **关闭连接**:通信完成后,使用`close()`函数关闭Socket连接。 3. **长连接的维护**: - 在长连接中,服务器和客户端不会在每次数据交换后立即关闭连接,而是会维持一段时间的空闲状态,等待下一次数据传输。 ...

    socket长连接demo

    "Socket长连接demo"是一个实际工作场景中常见的需求,尤其是在需要持续数据交互的应用中,如实时监控、在线游戏或者服务器与客户端之间的即时消息传递。本示例主要探讨如何在Java中建立并维护一个长连接。 首先,...

    进程间负载,基于socket长连接

    基于socket的长连接是指两个进程之间建立一次连接后,长时间保持连接状态,而非每次交互都创建新的连接。这样可以减少连接建立和释放的开销,提高整体性能。 在IPLB中使用基于socket的长连接,通常涉及以下关键知识...

    android客户端加服务端的socket长连接

    这些服务在客户端注册设备令牌,服务器端通过令牌向客户端发送消息,避免了客户端长时间保持Socket连接带来的资源消耗。 综上所述,Android客户端与服务端的Socket长连接涉及到网络编程基础、多线程、数据编码解码...

    Android的socket长连接(心跳检测)

    - 在Android中,我们可以使用`java.net.Socket`类来创建和管理Socket连接。 2. **Android中创建Socket连接** - 创建Socket实例:`Socket socket = new Socket("服务器IP", 服务器端口);` - 数据传输:通过`...

    socket 长连接 多线程 心跳包 包头包体

    socket 长连接 简单例子,适合初学的朋友,里面有多线程 实现的,包括心跳包,数据分为两部分传送,首先双方约定用一个4字节的数组告诉对方要传送数据的长度,然后在写入数据,这样长连接的时候,双方可以知道对方...

    socket长连接

    "socket长连接"是指在客户端和服务端之间建立的一种持久性的连接,它允许双方在连接保持打开状态下进行多次数据交换,而不必每次通信都进行连接的建立和断开。这种模式在需要频繁交互或实时性要求较高的场景中尤为...

    java socket长连接

    java socket长连接,支持一个服务器向多个客户端推送消息; 客户端和服务端互相监听,每一个一个客户端断开服务端都有监听。客户端和服务端都做了封装,调用简单。数据通信使用Gson,bean和json互转

    socket长连接.zip

    最近要做推送功能,由于没有软著等文件,所以无法继承厂商推送,加上极光等第三方推送对数量有限制,就自己写了一套基于socket长连接的方式实现推送,也可以做IM模块,此资源包包括android客户端和java后台,开箱即...

    socket短连接和长连接 多线程的应用

    "短连接"和"长连接"是Socket连接的两种不同模式,它们在处理网络请求时有着显著的区别。 短连接(Short Connection)通常用于一次性或者较少交互的服务,如HTTP协议就是基于短连接的。在短连接中,每次通信完成后,...

    Java的socket长连接实例

    这个类可能负责管理和维护Socket连接池,它可能包含以下功能: 1. 创建Socket连接:根据服务器地址和端口号创建Socket实例。 2. 连接管理:保存和检索已建立的Socket连接,避免频繁创建和销毁。 3. 连接池维护:...

Global site tag (gtag.js) - Google Analytics