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 1275 Cashier Employment

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

  2. 对LockWindowUpdate与GetDCEx的理解(以前不知道还可以锁住刷新)

    MSDN如是说:The LockWindowUpdate function disables or enables drawing in the specified window. Only one  ...

  3. 【HDOJ】1271 整数对

    枚举,假设这个数x=a*10^(i+1)+b*10^i+c,去掉b后y=a*10^i+c,x+y=n,则x+y=n(mod10^i),求出c,注意c<10^i,但2*c有可能大于10^i,因此分 ...

  4. BZOJ1533: [POI2005]Lot-A Journey to Mars

    1533: [POI2005]Lot-A Journey to Mars Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 174  Solved: 76[S ...

  5. Hadoop MapReduce中压缩技术的使用

    Compression and Input Splits   当我们使用压缩数据作为MapReduce的输入时,需要确认数据的压缩格式是否支持切片?   假设HDFS中有一个未经压缩的大小为1GB的文 ...

  6. 常用sql语句及案例(oracle)

    目录 1)基本 2)数学函数 3)rownum 4)分页 5)时间处理 6)字符函数 7)to_number 8)聚合函数 9)学生选课 10)图书馆借阅 基本 --新建表: ) ) not null ...

  7. 四种方法解析JSON数据

    (1)使用TouchJSon解析方法:(需导入包:#import "TouchJson/JSON/CJSONDeserializer.h") //使用TouchJson来解析北京的 ...

  8. ASP.NET 之深入浅出Session和Cookie

    在做人事档案管理系统中,对于Session和Cookie的使用后理解更加深刻了,下面对本知识点总结学习. Session是什么? 简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有 ...

  9. spring-mvc.xml配置文件出错

    在整合ssm三大框架的时候,配置spring-mvc.xml的文件的 <mvc:default-servlet-handler/> <mvc:annotation-driven /& ...

  10. Unity3D——窗体介绍

    这是本人第一次的Unity的博客,主要还是依据雨松MOMO的视频来进行的,由于感觉视频比較直观,对于入门比較快,再加上自己有对应的编程基础,如今看书的话效率不高,所以先看几个视频了解一下大体的流程,感 ...