前段时间写了个web端与C服务端之间的通信不过用的是短连接 非堵塞的方式,一直想使用长连接,使tomcat启动的时候就和C服务端进行通信,但是一直没找到方法希望je的朋友能给点思路。先来看我现在的具体实现 

通信的核心类


public

class

newsSockBase    


{   


    
private

SocketChannel sc;     


    
private

final

int

MAX_LENGTH =

;     


    
private

ByteBuffer r_buff ;     


    
private

ByteBuffer w_buff ;     


    
private

static

String host ;     


    
private

static

int

port;     


  


    
int

sendBufTotalLen;   


    
int

sendBufLen;   


    
int

sendBufStart;   


    
byte

[]  sendBuf;   


       


    
int

recvBufTotalLen;   


    
int

recvBufLen;   


    
int

recvBufStart;   


    
byte

[]  recvBuf;   


       


    
int

timeout;   


    String  msg;   


       


    
public

newsSockBase()   


    {   


        r_buff = ByteBuffer.allocate(MAX_LENGTH);     


        w_buff = ByteBuffer.allocate(MAX_LENGTH);    


           


        sendBufTotalLen = MAX_LENGTH;   


        sendBufLen = sendBufStart =

;   


        sendBuf = 
new

byte

[MAX_LENGTH];   


           


        recvBufTotalLen = MAX_LENGTH;   


        recvBufLen = recvBufStart =

;   


        recvBuf = 
new

byte

[MAX_LENGTH];   


           


        timeout =

;   


    }   


       


    
public

void

setIPandPort(String str,
int

pt)   


    {   


        host = str;   


        port  = pt;   


    }   


       


    
//这两个函数一定要注意 形参是基类 而实际传入的参数是子类,到时候也是调用子类的参数来做

public

void

getBufFrompara(InewsDetail nD)   


    {   


        
int

len = nD.encode(sendBuf, sendBufStart, sendBufTotalLen-sendBufStart-sendBufLen);   


           


        sendBufLen += len;   


           


    }   


       


    
public

int

decodeBufToPara(InewsDetail nD)   


    {   


        
int

len = nD.decode(recvBuf, recvBufStart, recvBufLen);   


        
if

(len>

)   
//解码正确的时候才做

{   


            recvBufLen -= len;   


            recvBufStart += len;           


        }   


           


        
return

len;    


    }   


       


    
public

void

start(InewsDetail nD)   


    {       


       


        
//这里需要先根据传入的参数来

getBufFrompara(nD);   


           


        
try

{     


            InetSocketAddress addr = 
new

InetSocketAddress(host, port);     


            
// 生成一个socketchannel

sc = SocketChannel.open();     


            sc.configureBlocking(
false

);
//

// 连接到server

sc.connect(addr);     


            
while

(!sc.finishConnect())     


                ;     


            System.out.println(
"connection has been established!…"

);     


  


           
// while (true)

{     


                
// 回射消息    // 复位,清空

w_buff.clear();     


                w_buff.put(sendBuf,sendBufStart,sendBufLen);     


                w_buff.flip();   
// 转到最开始

// 发送消息

while

(w_buff.hasRemaining())     


                    sc.write(w_buff);     


                w_buff.clear();     


  


                
// 进入接收状态

while

(
true

)   


                {   


                    
int

ss=

;   


                    
int

count;     


                    r_buff.clear();    


                    
while

(ss<timeout*

)   


                    {                           


                        count = sc.read(r_buff);   


                        
if

(count>

)   


                            
break

;   


                        ss++;   


                        Thread.currentThread().sleep(

);    


                    }     


                       


                    
if

(ss==timeout)   


                    {   


                        
break

;   


                    }   


                       


                    r_buff.flip();     


                       


                    
//判断recvBuf能不能放下接收到的数据

if

(r_buff.limit()+recvBufStart+recvBufLen>recvBufTotalLen)   


                    {   


                        
//放不下了

//那就先看看前面是不是有空余

if

(recvBufStart>

)   


                        {   


                            
for

(
int

i=

;i<recvBufStart;i++)   


                            {   


                                recvBuf
 = recvBuf[i+recvBufStart];   
                            }   
                            recvBufStart = ;   
  
                        }   
                           
                        )   
                            );   
        nsb.start(nDNS);   
           
        System.out.println(];  ];   
       
    ;  ;   
    }   
    ;   
    }   
  
    ;;   
          )   
              hour -= ;   
             
        System.out.println(seq);   
              
          ;   
          }   
          )   
                  seq = ;   
          }   
             
          ] = (+] = (]-)/+] = (]--(StreamID[]-)/+] = (]--(StreamID[]--(StreamID[]-+] = (+] = (]-)+] = (+] = (]-)+] = (+] = (]-)+] = (+] = (]-)+] = (+] = (]-)+] = (+] = (]-)+);   
        } catch (InterruptedException e) {   
            // TODO Auto-generated catch block   
            e.printStackTrace();   
        }

javaSocket与C通信的更多相关文章

  1. JAVA-Socket通信笔记

    JAVA - Socket 从开学到现在 也学了三个月时间的java了,一直在 在 语法和基本使用上周旋,井底之娃一枚. 这两天 有学长指点,花了两天的时间 学习了java多线程和socket的简单使 ...

  2. JAVA-Socket通信 打造属于自己的聊天室(服务端)

    我们每天都在使用着微信.QQ等聊天软件,但不知你是否有想过这些聊天软件是如何实现的?是否想过要制作一个属于自己的聊天室? 本篇博客将带你打造一个简单的属于自己的聊天室,将cmd作为聊天窗口,可通过内网 ...

  3. Java-Socket通信 知识点记录

    目录 一.Socket基本案例 二.消息通信 2.1 双向通信 2.2 告知发送结束 2.2.1 通过Socket关闭 2.2.2 通过Socket关闭输出流的方式 2.2.3 通过约定符号 2.2. ...

  4. Java--Socket通信(双向)

    新建两个工程,一个客户端,一个服务端,先启动服务端再启动客户端两个工程的读写操作线程类基本上完全相同 服务端: import java.io.BufferedReader; import java.i ...

  5. JavaSocket简单通信

    以下介绍:简单的socket发送消息,服务的Server 相互 客户端Client,进行简单的传递消息: 服务端代码: package test; import java.io.DataInputSt ...

  6. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  7. Java与C之间的socket通信

    最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少 ...

  8. Java NIO通信的基础,基于TCP C/S例子介绍

    为了更好的理解Netty异步事件驱动网络通信框架,有必要先了解一点Java NIO原生的通信理论,下面将结合基于TCP的例子程序,含客户端和服务端的源码,实现了Echo流程. Java NIO的核心概 ...

  9. java中有关socket通信的学习笔记

    最近做的项目中使用到了一些基于java的socket长连接的一些功能,用来穿透有关行业的网闸.用到了也就学习了一下,下面是对学习内容的一个笔记,记录一下也希望有兴趣的同学可以参考一下,加深对javas ...

随机推荐

  1. JAVA学习第三十四课 (经常使用对象API)—List集合及其子类特点

    整个集合框架中最经常使用的就是List(列表)和Set(集) 一.List集合 && Set的特点 Collection的子接口: 1.List:有序(存入和取出的顺序一致),元素都有 ...

  2. JavaScript超大整数加法

    原文:JavaScript超大整数加法 什么是「超大整数」? JavaScript 采用 IEEE754标准 中的浮点数算法来表示数字 Number. 我也没花时间去详细了解 IEEE754标准 ,但 ...

  3. InstallShield集成安装MSDE2000最小版本(二) fishout特许授权发布

    原文:InstallShield集成安装MSDE2000最小版本(二) fishout特许授权发布 原帖地址:http://blog.csdn.net/fishout/archive/2009/10/ ...

  4. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  5. 创建android phonegap项目

    一. 首先需要在Eclipse中创建一个Android项目 打开Eclipse,打开File->New->Project 选择Android Application Project点击Ne ...

  6. Linux分配给该用户没有权限登陆

    Linux分配给该用户没有权限登陆 sudo visudo username ALL=(ALL) NOPASSWD:ALL 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  7. 学习PHP时的一些总结(四)

    目录的基本操作: 在系统的每个目录下都有两个特殊的目录"."和".." , 分别指示当前目录和当前目录的父目录. dirname()  返回目录的名称 path ...

  8. .Net类的序列化和反序列化 - 进阶者系列 - 学习者系列文章

    今天看了下以前的一个工具的代码,其中涉及到.NET类的序列化和反序列化问题,所以就写一下. 这里说一下.NET类序列化的好处..NET类在序列化之前只是一个相对狭义的类.通过序列化,能够更好的保存该类 ...

  9. Android项目---ActivityGroup的使用

    ActivityGroup在一年前已经被说明不用了,但是腾讯QQ,新浪微博上也不乏ActivityGroup的身影.所以,即使是过时的东西,也有学习的必要,当然项目中也是可以添加的.在网上找了一个博客 ...

  10. AppCompat v21 — Android 5.0之前版本设备的Material Design实现

    博客原文地址:http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html,要想打 ...