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的连接:后者是每次请求,都新建 ...
随机推荐
- handler.post(r)同一个线程的疑惑
handler.post(r);是把r加到消息队列,但并未开辟新线程.等到消息被取出时才执行. package com.lei.handlethread; import android.os.Bund ...
- Mysql 主从复制,读写分离设置
一个简单完整的 Mysql 主从复制,读写分离的示意图. 1. 首先搭建 Mysql 主从架构,实现 将 mater 数据自动复制到 slave MySQL 复制的工作方式很简单,一台服务器作为主机, ...
- 动态树LCT
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> usin ...
- Visual Studio创建跨平台移动应用_01.Cordova&Xamarin
目前开发移动应用有三种模式:Native.Hybird.Web,若要开发跨平台的移动应用,又希望与本地API交互,那么Hybird是一个非常好的选择. 作为一个.Net程序员, ...
- poj 2246 (zoj 1094)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1094 ZOJ Problem Set - 1094 Matrix Chai ...
- oracle用户解锁和改密
alter user hs_user account unlock; alter user hs_asset account unlock; alter user hs_his account unl ...
- appcan里面模板的使用
1:首先要定义一个字符串如果太长需要换行,可以用"\"来分割每行 2:模板里面使用的是ejs语法,所以可以使用if else语句等 3:字符串定义好之后要用appcan.view. ...
- cocos2d-x 在mac下执行 demo
搞了好久,最终成功了. 记录一下 前辈的文章. 依照这个弄的 .http://blog.csdn.net/taowenyin/article/details/11750127 前辈的这个文章是在win ...
- android 监听短信数据库,制作短信控制工具,控制别人的手机!!(一)
序言:本程序示例本着简洁易懂的目的,只做了简单的功能实现,需要用户启动应用,收到短信才有效果.作者将会在后面的(二)篇中加入服务后台运行.自动启动功能,实现一个真正的短信控制工具.本文的目的很简单,让 ...
- 第二节,CCSpriteBatchNode CCSpriteFrameCache
1,CCSpriteBatchNode 精灵集合类 其中Batch的英文含义是一批,一群的意思.他的对象常常包含了许多的精灵对象,这些精灵对象有一个共同的特点,那就是使用同一张文理图片.虽然是同一个纹 ...