Socket 接收本地短连接并转发为长连接 多线程
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PushbackInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException; import javax.servlet.http.HttpServlet; /**
* @author 某家:
* @version 创建时间:2015年8月18日 上午10:35:04
* 类说明
*/ public class TestConnect extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L; private static final ThreadLocal<Socket> threadConnect = new ThreadLocal<Socket>(); private static final String HOST = "106.3.44.235"; private static final int PORT = 8888; //发送至通道方
private static Socket client; //接收本地消息
private static ServerSocket serverSocket; //本地客户端
private static Socket localClient; private static OutputStream outStr = null; private static InputStream inStr = null; private static Thread tKeep = new Thread(new KeepThread());
private static Thread tRecv = new Thread(new RecvThread());
private static Thread tSend = new Thread(new SendThread());
private static Thread tClient = new Thread(new ClientThread()); public static void connect() throws UnknownHostException, IOException {
if(client == null){
client = new Socket(HOST, PORT);
threadConnect.set(client);
tKeep.start();
System.out.println("========链接开始!========");
}
outStr = client.getOutputStream();
inStr = client.getInputStream();
} public static void disconnect() {
try {
outStr.close();
inStr.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
} } public static String sendMsg(String str){
System.out.println("======发送数据:"+str+"====");
try {
outStr.write(str.getBytes());
while (true) {
byte[] b = new byte[1024];
int r = inStr.read(b);
if(r>-1){
System.out.println(new String(b).trim());
return new String(b).trim();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
/**
* 向外发送——保持心跳包
* @author 某家
*
*/
private static class KeepThread implements Runnable {
public void run() {
try {
System.out.println("=====================开始发送心跳包==============");
while (true) {
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println("发送心跳数据包");
outStr.write("send heart beat data package !".getBytes());
}
} catch (IOException e) {
e.printStackTrace();
} }
}
/**
* 向外接收——接收并转发给本地短连接
* @author 某家
*
*/
private static class RecvThread implements Runnable { public void run() {
try {
System.out.println("RecvThread 开始接收上游渠道信息信息!");
while (!Thread.currentThread().isInterrupted()) {
PushbackInputStream serverinput = new PushbackInputStream(inStr);
byte[] inbyte = new byte[serverinput.available()];
int len = serverinput.read(inbyte);
if(len > 0){
System.out.println("RecvThread len:" + len + "; " + new String(inbyte, 0, len));
localClient.getOutputStream().write(inbyte);
}
}
} catch (IOException e) {
e.printStackTrace();
} }
} /**
* 向外发送——接收本地短连接并发送给上游渠道
* @author 某家
*
*/
private static class SendThread implements Runnable {
public void run() {
try {
System.out.println("SendThread 开始接收本地端链接信息!");
while(!Thread.currentThread().isInterrupted()){
PushbackInputStream serverinput = new PushbackInputStream(localClient.getInputStream());
byte[] inbyte = new byte[serverinput.available()];
int len = serverinput.read(inbyte);
if(len > 0){
System.out.println("SendThread len:" + len + "; " + new String(inbyte, 0, len));
outStr.write(inbyte);
}
}
} catch (IOException e) {
e.printStackTrace();
} }
} private static class ClientThread implements Runnable {
private static boolean flag = false;
public void run() {
try {
while (true) {
// 一旦有堵塞, 则表示服务器与客户端获得了连接
localClient = serverSocket.accept();
System.out.println("localClient 已获取到:" +localClient.getLocalPort());
if(!flag){
tRecv.start();
tSend.start();
flag = true;
}
}
} catch (IOException e ) {
e.printStackTrace();
} }
} public void init(){
System.out.println("=============================init function ================");
try {
TestConnect.connect();
TestConnect.service();
//tRecv.start();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} public void destroy(){
System.out.println("=============================destroy function ================");
TestConnect.disconnect();
} public static void service(){
try {
System.out.println("=============================service function ================");
serverSocket = new ServerSocket(9999);
tClient.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Socket 接收本地短连接并转发为长连接 多线程的更多相关文章
- Socket TCP Server一个端口可以有多少个长连接?受到什么影响?linux最大文件句柄数量总结
Socket TCP Server一个端口可以有多少个长连接? 网上答案很多,不知道那个才是正确的 理论上是无限的 16.Linux中,一个端口能够接受tcp链接数量的理论上限是? A.1024 B. ...
- http中长连接和websocket的长连接的区别
一.什么是http协议 HTTP是一个应用层协议,无状态的,端口号为80.主要的版本有1.0/1.1/2.0. HTTP/1.* 一次请求-响应,建立一个连接,用完关闭: HTTP/1.1 串行化 ...
- TCP 长连接保活机制&HTTP长连接设置
TCP KeepAlive Wireshark抓包分析机制 -------------------------------- 如上图所示,TCP保活报文总是成对出现,包括TCP保活探测报文和TCP保活 ...
- [Go] 测试go连接imap的tcp长连接
连接上imap服务后,什么都不操作,我测试大约5分钟会被服务端断掉,测试代码如下 imapClient, _ := client.Dial("imap.sina.net:143") ...
- python socket 编程之三:长连接、短连接以及心跳
长连接:开启一个socket连接,收发完数据后,不立刻关闭连接,可以多次收发数据包. 短连接:开启一个socket连接,收发完数据后,立刻关闭连接. 心跳:长连接在没有数据通信时,定时发送数据包(心跳 ...
- Socket编程中的长连接、短链接以及心跳包机制详解
参考:http://blog.csdn.net/zdwzzu2006/article/details/7723738 一.定义 1.TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,se ...
- TCP/IP,http,socket,长连接,短连接——小结。
来源:http://blog.chinaunix.net/uid-9622484-id-3392992.html TCP/IP是什么? TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. ...
- python socket 编程之三:长连接、短连接以及心跳(转药师Aric的文章)
长连接:开启一个socket连接,收发完数据后,不立刻关闭连接,可以多次收发数据包. 短连接:开启一个socket连接,收发完数据后,立刻关闭连接. 心跳:长连接在没有数据通信时,定时发送数据包(心跳 ...
- Socket的长连接和短连接
讨论Socket必讨论长连接和短连接 一.长连接和短连接的概念 1.长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接:后者是每次请求,都新建 ...
随机推荐
- 14.3 InnoDB Multi-Versioning InnoDB 多版本
14.3 InnoDB Multi-Versioning InnoDB 多版本 InnoDB 是一个多版本的存储引擎,它保持信息关于改变的数据老版本的信息, 为了支持事务功能比如并发和回滚. 这些信息 ...
- 【HDOJ】3587 NUDOTA
字符串模拟水题. /* 3587 */ #include <iostream> #include <cstdio> #include <cstring> #incl ...
- 【递归】Vijos P1132 求二叉树的先序序列(NOIP2001普及组第三题)
题目链接: https://vijos.org/p/1132 题目大意: 给定二叉树的中序和后序遍历,求该二叉树先序遍历. 题目思路: [递归] 这题妥妥递归. 二叉树先序根左右,中序左根右,后序左右 ...
- Domain Shutdown Error(JBAS010850)
In a manged domain, the shutdown operation is not located in the root resource (i.e. address []). A ...
- C#实现数据结构——线性表(上)
什么是线性表 数据结构中最常用也最简单的应该就是线性表,它是一种线性结构(废话,不是线性结构怎么会叫线性表?当然不是废话,古人公孙龙就说白马非马,现代生物学家也说鲸鱼不是鱼). 那什么是线性结构? 按 ...
- 完整版的OpenLDAP搭建全过程
总结: 先写总结,再写正文,嘿嘿嘿.这还是第一次认真的写个文档,写个总结,哈哈.大概在一个月前,第一次听说这个东西,完全没有概念,刚开始的时候看理论的知识,看了几次之后就没看了,看不 ...
- Android手机令牌教程
Android手机令牌教程 "沉下心,你不再是小孩子了.多看书,学做人"-JeffLi告诉自己 Written In The Font 花了一个天一夜,搞了这个小东西-安卓手机令牌 ...
- Union和Union All的差别
如果我们有一个表Student,包含下面字段与数据: drop table student; create table student ( id int primary key, name nvarc ...
- 精益创业之父Steve Blank: 怎样让企业内部创新获得50倍增速
编者注:本文英文版来自创新大师Steve Blank的个人博客,中文版由天地会珠海分舵进行编译.应用在初创企业打造上面的精益创业相信我们已经耳熟能详,可是假设我们面对的是一个已经发展起来的企业.或者是 ...
- COM编程入门第二部分——深入COM服务器
本文为刚刚接触COM的程序员提供编程指南,解释COM服务器内幕以及如何用C++编写自己的接口.继上一篇COM编程入门之后,本文将讨论有关 COM服务器的内容,解释编写自己的COM接口和COM服务器所需 ...