前段时间写了个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系统性能优化》--2.高速缓存

    上一节.简介了怎样发现性能瓶颈.从这节開始.我会和大家分享我在项目中做的一些性能调优工作.这个系列没有什么顺序可言,认为什么重要.就说说什么. 这节.我们聊缓存. 最開始接触缓存这个词,是学习硬件知识 ...

  2. sql分页查询公式

    分页查询公式: select top PageRow(每页显示的数据行数) from 表名 where 主键  not in(select top PageRow*(当前页数-1) 主键  from ...

  3. 原生AJAX基础讲解及兼容处理

    原文:原生AJAX基础讲解及兼容处理 AJAX = Asynchronous JavaScript and XML (异步的JavaScript和XML). AJAX不是新技术 ,但却是热门的技术.它 ...

  4. DELL iDRAC 远程虚拟机报错:虚拟介质分离或所选虚拟磁盘驱动器的虚拟介质重定向已由另一用户使用

    原因很简单,那就是虚拟介质的映射功能,只能被使用一次. 推荐做法: 1.由于通过远程,在Lifecycle Controller里DeployOS安装系统,需要在虚拟介质里映射ISO,因此映射功能要留 ...

  5. 让Windows 8 / 8.1 以及 Windows Server 2012 / 2012 R2的桌面,显示我的电脑图标

    cmd ->  运行[rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0],然后勾上[我的电脑]即可.

  6. Hybrid

    “榕树下·那年”移动app ( hybrid ) 开发总结   榕树下网站本身的技术人员并不多,所以app开发的任务就到了母公司盛大文学这边.       盛大文学无线业务中心负责这次具体开发任务. ...

  7. MongoDB的upsert状态判断和pymongo使用方法

    在mongo中,有一个命令非常的方便,就是upsert,顾名思义就是update+insert的作用 根据条件判断有无记录,有的话就更新记录,没有的话就插入一条记录 upsert的使用方法: Mong ...

  8. PreparedStatemnet预编译操作数据库的增删改

    /**************PreparedStatemnet使用******************/ /*特点:相当于ADO.NET中的参数化命令对象  * 1.预编译,执行相同的sql语句,提 ...

  9. MVC 控制器激活

    MVC 控制器激活 ASP.NET MVC 控制器激活(三) 前言 在上个篇幅中说到从控制器工厂的GetControllerInstance()方法来执行控制器的注入,本篇要讲是在GetControl ...

  10. Java、C#双语版HttpHelper类

    Java.C#双语版HttpHelper类(解决网页抓取乱码问题)   在做一些需要抓取网页的项目时,经常性的遇到乱码问题.最省事的做法是去需要抓取的网站看看具体是什么编码,然后采用正确的编码进行解码 ...