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 接收本地短连接并转发为长连接 多线程的更多相关文章

  1. Socket TCP Server一个端口可以有多少个长连接?受到什么影响?linux最大文件句柄数量总结

    Socket TCP Server一个端口可以有多少个长连接? 网上答案很多,不知道那个才是正确的 理论上是无限的 16.Linux中,一个端口能够接受tcp链接数量的理论上限是? A.1024 B. ...

  2. http中长连接和websocket的长连接的区别

    一.什么是http协议 HTTP是一个应用层协议,无状态的,端口号为80.主要的版本有1.0/1.1/2.0.   HTTP/1.* 一次请求-响应,建立一个连接,用完关闭: HTTP/1.1 串行化 ...

  3. TCP 长连接保活机制&HTTP长连接设置

    TCP KeepAlive Wireshark抓包分析机制 -------------------------------- 如上图所示,TCP保活报文总是成对出现,包括TCP保活探测报文和TCP保活 ...

  4. [Go] 测试go连接imap的tcp长连接

    连接上imap服务后,什么都不操作,我测试大约5分钟会被服务端断掉,测试代码如下 imapClient, _ := client.Dial("imap.sina.net:143") ...

  5. python socket 编程之三:长连接、短连接以及心跳

    长连接:开启一个socket连接,收发完数据后,不立刻关闭连接,可以多次收发数据包. 短连接:开启一个socket连接,收发完数据后,立刻关闭连接. 心跳:长连接在没有数据通信时,定时发送数据包(心跳 ...

  6. Socket编程中的长连接、短链接以及心跳包机制详解

    参考:http://blog.csdn.net/zdwzzu2006/article/details/7723738 一.定义 1.TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,se ...

  7. TCP/IP,http,socket,长连接,短连接——小结。

    来源:http://blog.chinaunix.net/uid-9622484-id-3392992.html TCP/IP是什么? TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. ...

  8. python socket 编程之三:长连接、短连接以及心跳(转药师Aric的文章)

    长连接:开启一个socket连接,收发完数据后,不立刻关闭连接,可以多次收发数据包. 短连接:开启一个socket连接,收发完数据后,立刻关闭连接. 心跳:长连接在没有数据通信时,定时发送数据包(心跳 ...

  9. Socket的长连接和短连接

    讨论Socket必讨论长连接和短连接 一.长连接和短连接的概念 1.长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接:后者是每次请求,都新建 ...

随机推荐

  1. 电源VCC、VSS、VDD、VEE、VPP、Vddf标号的区别

    一.解释VCC:C=circuit表示电路的意思,即接入电路的电压: VDD:D=device表示器件的意思,即器件内部的工作电压:VEE:发射极电源电压,EmitterVoltage,一般用于ECL ...

  2. C++编程中对缓冲区的理解(OS默认4096大小的缓冲区,有例子,很形象)

    什么是缓冲区缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区.缓冲区根据其对应的是输入设备还是输出 ...

  3. y combinator 做的一个调查_可以学习一下

    RoR: 在网络营运平台企业中,RoR站稳使用率第一的位置.其用户包括:ZenPayroll (人力资源).Asile50 (零售平台).BackerKit (众筹平台).Rainforest (QA ...

  4. HBase MultiVersionConsistencyControl

    注明:本文部分文字和图片翻译或引用自http://blogs.apache.org/hbase/entry/apache_hbase_internals_locking_and. HBase在保证高性 ...

  5. Windows 如何在cmd命令行中查看、修改、删除与添加环境变量

    转自:http://www.cnblogs.com/saptechnique/archive/2013/02/17/2914222.html 首先明确一点: 所有的在cmd命令行下对环境变量的修改只对 ...

  6. 注释PHP和html混合代码

    <?php if(false){ ?> any code <?php } ?>

  7. 【safari挖的那些坑】iOS safari 浏览器 时间乱码(ios时间显示NaN) 问题解决

    通常 iOS下时间错误表现形式 问题一: 这个界面运用了大量的日期类型的计算,当我们用JavaScript实例化一个日期对象时,我们可以这样用: var date =new Date(); 上面这段代 ...

  8. 精益创业之父Steve Blank: 怎样让企业内部创新获得50倍增速

    编者注:本文英文版来自创新大师Steve Blank的个人博客,中文版由天地会珠海分舵进行编译.应用在初创企业打造上面的精益创业相信我们已经耳熟能详,可是假设我们面对的是一个已经发展起来的企业.或者是 ...

  9. [Redux] Avoiding Object Mutations with Object.assign() and ...spread

    Learn how to use Object.assign() and the spread operator proposed for ES7 to avoid mutating objects. ...

  10. 属性动画 LayoutTransition AnimatorInflater Keyframe 新特性

    LayoutTransition设置动画 使用LayoutTransition可为布局的容器设置动画,当容器中的视图层次发生变化时产生相应的过渡的动画效果 过渡的类型一共有四种: LayoutTran ...