JAVA与C++进行TCP通信 包括断线重连

原创 2018年02月05日 22:00:49

C++与Java通讯涉及到大小端转换 和字符集转换的问题

本程序调用了Okio进行通信

package com.aast.test;
import com.aast.model.Massage;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import okio.*;
import java.io.*;
import java.net.*;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Timer;

import static java.lang.Thread.sleep;

public class OkioTCP extends Thread {
    private volatile Socket socket = null;
    private BufferedSource source = null;
    private BufferedSink sink = null;
    private volatile boolean isExit = false;
    private volatile boolean isConnect = false;
    private Read read = null;
    private Send send = null;
    volatile Timer timer = null;    //计时器
    private OkioTCP tcp=null;

    public OkioTCP(){
        tcp=this;
    }

    public static void main(String[] args) {
        OkioTCP tcp= new OkioTCP();
        tcp.start();
    }
    public synchronized boolean exit(){
        this.notify();
        isExit=true;
        try {
            if(socket!=null){
                socket.close();
                socket=null;
            }
        } catch (IOException e) {
//			e.printStackTrace();
        }
        return isExit;
    }

    @Override
    public  void run() {
        super.run();
        //		EventBus.getDefault().register(this);//注册订阅
        while(!isExit){
            try {
                synchronized (tcp) {
                    if(socket!=null &&!socket.isClosed()){
                        this.wait();
                        continue;
                    }
                }
                String ip="192.168.10.111";
                int port=8554;
//                int port=Integer.parseInt(MyProperUtil.getKey("PORT"));
                socket = new Socket(ip, port);
//				socket.setSoTimeout(6000);
                isConnect=true;

                source = Okio.buffer(Okio.source(socket));
                sink = Okio.buffer(Okio.sink(socket));
                read=new Read(source);
                send=new Send(sink);
                read.start();
                send.start();
                timer = new Timer();
                timer.schedule(new java.util.TimerTask() {
                    @Override
                    public void run() {
                        isConnected();
                    }
                }, 0, 6000);
            } catch (IOException |InterruptedException e) {
                closeSocket(e);
            }
        }
//        		EventBus.getDefault().unregister(this);//取消订阅
    }

    class Read extends Thread{
        BufferedSource source = null;
        public Read(BufferedSource source){
            this.source=source;
        }
        @Override
        public void run() {
            super.run();
            read();
        }
        private void read(){
            try {
                while (isConnect) {
                    int jsonLen = source.readIntLe();
                    System.out.println(jsonLen);
                    byte[] jsonData = new byte[jsonLen];
//                    byte[] data = source.readByteArray(len);
                    int size=0;//本次接收的长度
                    int curlen = 0;//已经接收的长度
                    while((size = source.read(jsonData,curlen,jsonLen-curlen)) !=-1){
                        curlen += size;
                        if(curlen >= jsonLen)break;
                    }
                    String strJson = new String(jsonData,"GB2312");
//                  System.out.println(strJson);

                    JSONObject obj = JSONObject.fromObject(strJson);
                    System.out.println("收到长度:"+jsonLen+"收到信息:");
                    System.out.println(obj.toString());
                    JSONArray arr=obj.getJSONArray("hisSelect");
                    System.out.println(arr.toArray().length);
                    int msgType=obj.getInt("msgType");
//                    if(msgType==0){
//                        System.out.println();
//                    }else{
//
//                    }
                sleep(4000);
            }
            } catch (IOException | InterruptedException e) {
//				closeSocket(e);
            }


        }
    }

    class Send extends Thread{
        BufferedSink sink = null;
        public Send(BufferedSink sink){
            this.sink=sink;
        }

        @Override
        public void run() {
            super.run();
            while (isConnect){
                send(null);
            }
        }
        private void send(String msg){
            try {
                JSONObject obj = new JSONObject();
                byte[] arr=new byte[10];
                obj.put("msgType",3);
                obj.put("fThreshold",0.5);
//                obj.put("boot",Arrays.toString(arr));
                obj.put("boot",1);//数据类型:0-无效1-重启服务 2-关闭服务;msgType为2时有效
                obj.put("startT","2017-06-05");
                obj.put("endT","2020-06-08");
                String ss=obj.toString();
                int msgLen = ss.getBytes(Charset.forName("utf-8")).length;
                sink.writeIntLe(msgLen);
                sink.write(ss.getBytes(Charset.forName("utf-8")));
                sink.flush();
                sleep(1000);
            } catch (Exception e) {
                closeSocket(e);
            }
        }
    }

    public boolean isConnected(){
        try{
            if(socket!=null){
                socket.sendUrgentData(0xFF);
//				EventBus.getDefault().post(new MessageEvent("发送心跳"));
//				Log.e("TAG", "发送心跳");
            }
            isConnect=true;
            return true;
        }catch(Exception e){
            closeSocket(e);
            return false;
        }
    }

    public synchronized boolean closeSocket(Exception e){
        try {
            send.interrupt();
            read.interrupt();
            sleep(2000);
        } catch (Exception e2) {
//			e2.printStackTrace();
        }
        isConnect=false;
        if(socket!=null){
            try {
                socket.close();
                socket=null;
            } catch (IOException e1) {
            }
            timer.cancel();
            socket=null;
            tcp.notify();
        }
//		e.printStackTrace();
        return isExit;
    }
}
C++做服务端,采用GB2312或者ISO-8859-1 或者GBK需要转换成UTF-8,如果C++转码麻烦可以用JAVA设置字符集道理一样

CCNA之TCP/IP协议栈精讲

学完本班级课程,OSI模型和TCP/IP协议栈
  • 2017年08月14日 15:37

java socket tcp重连等 处理粘包、沾包

这个程序是前段时间写的,现在把以前写的东西整理出来。 下面是socket部分,还是很有帮助的:private void start(String severIP, int serverPort) { ...
  • qq451559365
  • qq451559365
  • 2015-07-07 22:05:48
  • 968

基于java实现tcp长链接,自定义消息协议

android客户端+server实现消息的即时通信。通过TCP长链接以及自定义协议实现消息的发送接收,解包...
  • Mr_Oorange
  • Mr_Oorange
  • 2016-08-29 16:43:20
  • 10483

关于Java的TCP编程中需要注意的一些坑,因为我踩过

TCP连接就是传说中的长连接,有所谓的3此握手来保证消息一定可达,在java中,TCP传输的方式属于流数据传输,而流数据传输的特点就是数据到达的顺序是固定的,比如说数据A写入到TCP连接中,数据B接着...
  • lhd201006
  • lhd201006
  • 2016-02-19 15:14:48
  • 4575

java中判断socket服务器端是否断开连接

最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。 首先想到socket类的方法isClosed()、isConnected()、isInputStream...
  • u010152707
  • u010152707
  • 2013-11-08 16:24:13
  • 3129

【c#源码】基于TCP通信的客户端断线重连

源码下载 在CS程序中,断线重连应该是一个常见的功能。 此处的断线重连主要指的是服务器端因为某种故障,服务器端程序或者系统进行了重新启动,客户端能够自动探测到服务器端掉线,并尝试重新进行连...
  • networkcomms
  • networkcomms
  • 2015-02-28 13:14:39
  • 711

java 客户端与c++服务器端tcp通信 demo

java 客户端代码 创建socket 绑定  import java.io.BufferedReader; import java.io.IOException; import java....
  • linxinyuluo
  • linxinyuluo
  • 2012-07-23 22:31:16
  • 4872

Java客户端C++服务端Socket交互通信

原文地址:http://www.drdobbs.com/jvm/java-and-c-socket-communication/222900697?pgno=1 通过socket网络通信集成c++ ...
  • hnyzwtf
  • hnyzwtf
  • 2016-03-20 21:48:33
  • 6420

ZeroMQ(java)中连接建立与重连机制

前面的一篇文章分析了ZeroMQ中最为简单Socket类型,Dealer。。不过觉得这种具体的Socket类型的分析可以留到以后,或者等以后什么时候会用到了再分析再不迟。。。。 但是作为一个消息通信的...
  • fjs_cloud
  • fjs_cloud
  • 2013-12-25 20:52:43
  • 4177

java socket client简单的检测断开并重连发送队列消息实现

package com.pam.push; import java.io.ByteArrayInputStream; import java.io.InputStream; import java....
  • u014220039
  • u014220039
  • 2016-09-14 14:48:41
  • 5260
收藏助手
不良信息举报
您举报文章:JAVA与C++进行TCP通信 包括断线重连
举报原因:
原因补充:

(最多只允许输入30个字)