前段时间写了个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. Asp.net vNext 学习1

    Asp.net vNext 学习之路(一) 概述 asp.net vNext 也叫 asp.net 5.0,意思是微软推出的下一个版本的asp.net.可以说是微软对asp.net的一个比较重大的重新 ...

  2. IOC 在Mvc中的使用

    IOC 在Mvc中的使用 IOC,是控制反转(Inversion of Control)的英文简写, 控制反转一般分为两种类型,依赖注入(Dependency Injection)和依赖查找(Depe ...

  3. nodejs 平台的 webscoket 的实现

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

  4. changePage() 页面跳转

    jQuery.mobile.changePage( to [, options ] ) 从一个页面跳转到另一个页面,使用$.mobile对象的changePage方法来实现.但要使用此方式的时候,要以 ...

  5. 分区表在安装系统(MBR)丢失或损坏

    操作系统能识别出硬盘中的各个不同的分区,是靠硬盘分区表(MBR)来识别的. 硬盘分区表中记录了各个分区的位置和大小以及类型等信息,假设这个分区表破坏了,那么这块硬盘里面的分区就会丢失.系统是无法在浏览 ...

  6. sql点滴42—mysql中的数据结构

    原文:sql点滴42-mysql中的数据结构 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小 ...

  7. C#遍历文件名

    遍历文件名程序 //////////////////第一种方法///////////// static ArrayList GetAllFiles(string path) { ArrayList r ...

  8. 【c#操作office】--OleDbDataAdapter 与OleDbDataReader方式读取excel,并转换为datatable

    OleDbDataAdapter方式: /// <summary> /// 读取excel的表格放到DataTable中 ---OleDbDataAdapter /// </summ ...

  9. 根据当前登录域账号 获取AD用户姓名和所在OU目录

    #region 根据当前登录域账号 获取AD用户姓名和所在OU目录 /// <summary> /// 根据当前登录域账号 获取AD用户姓名和所在OU目录 返回域用户是否存在 /// &l ...

  10. Android项目----dispathTouchEvent

    说到dispathTouchEvent,就不得不说一个最贱的屏幕触摸动作触发的一些列Touch事件: ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->A ...