java 服务端tcp方式接收和推送数据到c++或者qt(亲测可用)

方式1

java 复制代码
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;

public class NumberToChinese {
List<SocketChannel> socketChannelList = new CopyOnWriteArrayList();
    List<Socket> socketList = new CopyOnWriteArrayList();

    public List<SocketChannel> getSocketChannelList() {
        return socketChannelList;
    }

    public void setSocketChannelList(List<SocketChannel> socketChannelList) {
        this.socketChannelList = socketChannelList;
    }

    public List<Socket> getSocketList() {
        return socketList;
    }

    public void setSocketList(List<Socket> socketList) {
        this.socketList = socketList;
    }
public void thread3(){
        new Thread(() ->{
            try {
                while (true){
                    Thread.sleep(1000);
                    for (Socket socket : socketList){
                        if (socket==null || !socket.isConnected()){
                            continue;
                        }
                        InputStream inputStream = socket.getInputStream();
                        StringBuffer stringBuffer = new StringBuffer();
                        char[] chars = new char[1000];
                        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
                        int read;
                        k:while ((read = bufferedReader.read(chars)) != -1){
                            for (int i = 0; i < read; i++) {
                                stringBuffer.append(chars[i]);
                            }
                            //0d0a  c或者qt传过来的结束符  结束符可以自己商量
                            if (stringBuffer.toString().endsWith("0d0a")){
                                System.out.println("读取结束");
                                break k;
                            }
                        }
                        System.out.println("读取完毕"+stringBuffer.toString());
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        },"thread1").start();

        new Thread(() ->{
            try {
                ServerSocket server = new ServerSocket(8088);
                Socket socket;
                while (true){
                    socket = server.accept();
                    SocketChannel channel = socket.getChannel();
                    socketList.add(socket);
                    System.out.println("建立连接成功");
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        },"thread2").start();
    }
}

方式2 推荐

java 复制代码
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;

public class NumberToChinese {

    List<SocketChannel> socketChannelList = new CopyOnWriteArrayList();
    List<Socket> socketList = new CopyOnWriteArrayList();

    public List<SocketChannel> getSocketChannelList() {
        return socketChannelList;
    }

    public void setSocketChannelList(List<SocketChannel> socketChannelList) {
        this.socketChannelList = socketChannelList;
    }

    public List<Socket> getSocketList() {
        return socketList;
    }

    public void setSocketList(List<Socket> socketList) {
        this.socketList = socketList;
    }
    public void thread2(){
        new Thread(() ->{
            try {
                while (true){
                    Thread.sleep(1000);
                    for (SocketChannel channel : socketChannelList){
                        if (channel==null || !channel.isConnected()){
                            continue;
                        }
                        StringBuffer stringBuffer = new StringBuffer();
                        ByteBuffer buffer = ByteBuffer.allocate(  256);
                        k:while (channel.read(buffer) != -1){
                            buffer.flip();//切换读写模式,冲区的界限设理为当前位置,并将当前位到设置为0
                            byte[] array = buffer.array();
                            String qqq = new String(array,"UTF-8").trim();//c接口也得加编码,不然读取过来的是乱码
                            stringBuffer.append(qqq);
                            //0d0a  c或者qt传过来的结束符  结束符可以自己商量
                            if (stringBuffer.toString().endsWith("0d0a")){
                                System.out.println("读取结束");
                                break k;
                            }
                        }
                        System.out.println("读取完毕"+stringBuffer.toString());
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        },"thread1").start();

        new Thread(() ->{
            try {
                ServerSocketChannel socketchannel = ServerSocketChannel.open();
                socketchannel.bind(new InetSocketAddress("ip",8088));
                socketchannel.configureBlocking(true);//false 的话,会导致 socketchannel.accept();阻塞不了
                while (true){
                    SocketChannel socketChannel = socketchannel.accept();
                    if (socketChannel == null){
                        continue;
                    }
                    socketChannelList.add(socketChannel);
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        },"thread2").start();
    }
}

方式3

java 复制代码
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;

public class NumberToChinese {
List<SocketChannel> socketChannelList = new CopyOnWriteArrayList();
    List<Socket> socketList = new CopyOnWriteArrayList();

    public List<SocketChannel> getSocketChannelList() {
        return socketChannelList;
    }

    public void setSocketChannelList(List<SocketChannel> socketChannelList) {
        this.socketChannelList = socketChannelList;
    }

    public List<Socket> getSocketList() {
        return socketList;
    }

    public void setSocketList(List<Socket> socketList) {
        this.socketList = socketList;
    }
	public void thread1(){
        new Thread(() ->{
            try {
                while (true){
                    Thread.sleep(1000);
                    for (SocketChannel channel : socketChannelList){
                        if (channel==null || !channel.isConnected()){
                            continue;
                        }
                        StringBuffer stringBuffer = new StringBuffer();
                        ByteBuffer buffer = ByteBuffer.allocate(  256);
                        k:while (channel.read(buffer) != -1){
                            buffer.flip();
                            byte[] array = buffer.array();
                            String qqq = new String(array,"UTF-8").trim();
                            stringBuffer.append(qqq);
                            buffer.flip();//切换读写模式,冲区的界限设理为当前位置,并将当前位到设置为0
                            //0d0a  c或者qt传过来的结束符
                            if (stringBuffer.toString().endsWith("0d0a") || stringBuffer.toString().endsWith("0DOA")){
                                System.out.println("读取结束");
                                break k;
                            }
                        }
                        System.out.println("读取完毕"+stringBuffer.toString());
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        },"thread1").start();

        new Thread(() ->{
            try {
                Selector se = Selector.open();//原则器
                ServerSocketChannel socketchannel = ServerSocketChannel.open();
                socketchannel.bind(new InetSocketAddress("ip",8088));
                socketchannel.configureBlocking(false);
                socketchannel.register(se, SelectionKey.OP_ACCEPT);
                while (true){
                    se.select();
                    Set<SelectionKey> selectionKeys = se.selectedKeys();
                    Iterator<SelectionKey> iterator = selectionKeys.iterator();
                    while (iterator.hasNext()){
                        SelectionKey key = iterator.next();
                        iterator.remove();
                        if (key.isAcceptable()){
                            SocketChannel channel = socketchannel.accept();
                            socketChannelList.add(channel);
                        }
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        },"thread2").start();
    }
}

1、自己写个接口,让c++或者qt写个动态链接库,后端调用这个接口,将ip和端口号发送给他们,这样就能建立连接了

2、java推送数据,写个接口,读取你自己添加的集合,然后循环得到自己的通道

然后

java 复制代码
public void test(){
        try {
            if (CollectionUtils.isNotEmpty(socketChannelList)){
                for (SocketChannel channel : socketChannelList) {
                    String s = new String();//你传输给网络的数据
                    ByteBuffer buffer = ByteBuffer.wrap(s.getBytes());
                    while (buffer.hasRemaining()){
                        channel.write(buffer);
                    }
                    channel.close();
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
相关推荐
Rabitebla8 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
码农小河6610 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库
西西弗Sisyphus10 小时前
C++ 超时互斥锁(Timed Mutex):std::timed_mutex 与 std::unique_lock
c++
风若飞12 小时前
Spring Ai 入门遇到问题1
java·后端·spring
今天要早睡_12 小时前
C++01_入门基础复习
开发语言·c++
Nuanyt12 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
黑马程序员毕设13 小时前
基于 Java 的餐饮点餐系统设计与应用报告
java·开发语言
SL_staff13 小时前
从文档工具到知识中枢:基于JVS数字底座构建企业级统一内容管理平台的技术实践
java·开源·全栈
SL_staff13 小时前
从‘连得上’到‘管得好’:JVS-IOT双引擎驱动设备运维闭环
java·物联网·产品
Fuyo_111915 小时前
C++ 运行时多态与虚函数机制全面剖析【面试重点】
开发语言·c++·面试