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. poj Pie

    http://poj.org/problem?id=3122 #include<cstdio> #include<cstring> #include<cmath> ...

  2. LeetCode——Permutations

    Permutations Given a collection of numbers, return all possible permutations. For example,[1,2,3] ha ...

  3. LeetCode——Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  4. STL_iterator迭代器(2)——几种迭代器对象的用法

    要学会使用迭代器和容器以及算法,需要学习下面的新技术. 一.流和迭代器 本书的很多例子程序使用I/O流语句来读写数据.例如: int value; cout << "Enter ...

  5. C++类型转换[转]

    转自 http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html C风格的强制类型转换(Type Cast)很简单,不管什么类型 ...

  6. C - A Simple Problem with Integers - poj 3468(区间更新)

    题意:有一个比较长的区间可能是100000.长度, 每个点都有一个值(值还比较大),现在有一些操作,C abc, 把区间a-b内全部加上c, Qab,求区间ab的值. 分析:很明显我们不可能对区间的每 ...

  7. Foundation: Binary Search

    /* Binary search. * * Implementation history: * 2013-10-5, Mars Fu, first version. */ /* [Binary Sea ...

  8. WebView redirect https to http

    最新项目大改版,刚好对相关sdk版本做了下升级,target也从19升级到21. 意外发现原先在WebView中加载的网页中的图片全都变得一片白,连默认图片都不给显示. 经过一番测试才发现是由于tar ...

  9. C#量转换为汉字表达

    /* 创造者:菜刀打好博客  * 创建日期: 2014年09一个月04号码  * 特征:Money类型转换  *  */ namespace Net.String.ConsoleApplication ...

  10. oracle中split的使用

    1.创建自己的类型 VARCHAR2ARRAY CREATE OR REPLACE TYPE "VARCHAR2ARRAY" as table of varchar2(300); ...