前段时间写了个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. POJ1320 Street Numbers【佩尔方程】

    主题链接: http://poj.org/problem?id=1320 题目大意: 求解两个不相等的正整数N.M(N<M),使得 1 + 2 + - + N = (N+1) + - + M.输 ...

  2. 那些必须要知道的Javascript

    原文:那些必须要知道的Javascript JavaScript是前端必备,而这其中的精髓也太多太多,最近在温习的时候发现有些东西比较容易忽略,这里记录一下,一方面是希望自己在平时应用的时候能够得心应 ...

  3. nodejs 平台的 webscoket 的实现

    新手入门,没办法,只能选择不断不断的google吧. 找了很多的例子都跑不了,不知道什么原因. 后,自己在git搜索吧,选择了一个下面的例子: nodejs-web-socket 经过我的改造,改成我 ...

  4. android rawquery和query对照

    Cursor cursor = db.rawQuery("select name from *** where id=? ", new String[]{"1" ...

  5. 快速构建Windows 8风格应用2-创建调试应用

    原文:快速构建Windows 8风格应用2-创建调试应用 本篇博文主要介绍的是创建应用时可以选择哪些模版,生成默认的Windows 8风格应用解决方案中含哪些文件,最后是如何调试Windows 8风格 ...

  6. outlook 会议室

    原文:outlook 会议室 但是,里面的方法只能用于发送普通电子邮件.如果要发起会议之类的特殊邮件的话,可以C#调用Outlook API,自身的API. 创建项目后,为它添加.NET引用:“Mic ...

  7. 命令行配置源和安装本地rpm包

    因为Firefox的在写博客时提交代码会丢失缩进,所以打算安装Chrome来写博,还不错,学到了两条命令- [shell] sudo yum-config-manager --add-repo=htt ...

  8. MySQL之数据库结构优化

    1.选择合适的数据类型 一.选择能够存下数据类型最小的数据类型 二.可以使用简单的数据类型.int  要比varchar在MySQL处理上简单 三.尽可能的使用not null  定义字段 四.尽量少 ...

  9. javascript脚本化文档

    1.getElememtById /** * 获取指定id的的元素数组 */ function getElements(/*ids...*/) { var elements = {}; for(var ...

  10. Mike and Feet(CF 547B)

    Mike and Feet time limit per test 1 second memory limit per test 256 megabytes input standard input ...