- 浏览: 154385 次
- 性别:
- 来自: 西安
文章分类
最新评论
[代码] 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();
}
}
?
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();
}
}
发表评论
-
回调hanshu
2018-10-15 23:09 0java callback -
根据类名查找jar包路径
2018-08-12 01:04 861ProtectionDomain pd = StringUt ... -
https
2018-04-20 23:14 01:导出证书用IE的证书工具可以将网站的证书导出。打开网 ... -
mock request
2017-08-20 02:56 0一:postprotected ApplicationCont ... -
使用mockMvc测试文件上传
2017-08-20 01:52 6272@Autowired BanksController bank ... -
java 线程池实现多并发队列后进先出
2017-02-15 00:33 1763java实现线程池多并发队列后进先出 目前默认的队列都是先 ... -
apache ftp server
2017-01-11 22:41 503apache ftp server -
证书制作工具
2016-06-29 23:28 595证书制作工具 -
spring mvc 初始化加载bean
2016-06-15 20:28 1327<context:component-scan bas ... -
Ribbon 和 Eureka 的集成
2016-06-11 00:42 2830Ribbon 是 Netflix 发布的云中间层服务开源项目 ... -
RestTemplate实践
2016-06-11 00:30 890什么是RestTemplate? RestTemplat ... -
@Component(“”)和@resource(name=””)的使用:
2016-06-08 01:24 12177@Component(“”)和@resource(nam ... -
springboot ant部署
2016-06-08 01:03 901springboot ant部署 -
springboot 使用外部tomcat启动
2016-06-05 22:59 1508package sample.xml; import o ... -
swagger 实现文件上传
2016-06-01 22:23 5563@ResponseBody @RequestMa ... -
swagger
2016-06-01 21:18 0import static springfox.docum ... -
java
2016-05-26 01:14 0swagger2.0 -
swagger
2016-05-26 00:32 0spring swagger -
java 域名解析
2016-05-18 23:18 410import java.net.InetAddress;im ... -
swing 模拟文件上传
2016-05-15 17:32 416swing 模拟文件上传
相关推荐
Java实现Socket长连接和短连接,实现原理可参见个人博客
Socket长连接+心跳包+发送+读取,用到的全在这里了,自己看看哪里不需要的就不要添加了!代码很清晰很明白了!
Socket长连接demo
socket 长连接 简单例子,适合初学的朋友,里面有多线程 实现的,包括心跳包,数据分为两部分传送,首先双方约定用一个4字节的数组告诉对方要传送数据的长度,然后在写入数据,这样长连接的时候,双方可以知道对方...
Socket通讯,长连接短链接,包分 包头、指令、内容 包头一般2-4个字节 表示包的长度,指令2个字节 表示做什么操作,内容是具体数据
java socket长连接,支持一个服务器向多个客户端推送消息; 客户端和服务端互相监听,每一个一个客户端断开服务端都有监听。客户端和服务端都做了封装,调用简单。数据通信使用Gson,bean和json互转
可跨PHP平台使用的,即时聊天SOCKET长连接
进程间负载,基于socket长连接,同样只是留给自己的
最近要做推送功能,由于没有软著等文件,所以无法继承厂商推送,加上极光等第三方推送对数量有限制,就自己写了一套基于socket长连接的方式实现推送,也可以做IM模块,此资源包包括android客户端和java后台,开箱即...
java socket 的长连接实例,服务器端支持多个客户端连接,服务器端支持客户端的掉线检测。多线程编程
Socket长连接、通信、心跳包、消息回调、Java服务端
工作遇到的情况, 记录一个简单的保持长连接的方法,希望对自己对需要使用socket编程的童鞋有点用处。
socket连接时的异常解释及其产生原因 doc文档
是一个socket长连接和短连接框架其中包括多线程,线程池的创立,由于jar包太大所以没拷上来,可以作为学习应用.
socket长连接多线程支持客户端服务端互发消息 运行多个TUClient在控制台输入消息 消息格式如下:TA CM 114 :54089999000100000004|12|201002031029; 54089999000100000004代表客户端标识,每登录成功一个客户端将在...
java socket长连接客户端服务端(标准实例),准确无误,流行结构。
NULL 博文链接:https://hoochiang.iteye.com/blog/2148092
这是Android的socket长连接(心跳包),由于本人项目中需要用到长连接,所以先做了个demo,亲测是没有问题的。
自己写的Java的socket长连接实例 已测试