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);
        }
    }
相关推荐
Cosmoshhhyyy40 分钟前
《Effective Java》解读第49条:检查参数的有效性
java·开发语言
布谷歌1 小时前
常见的OOM错误 ( OutOfMemoryError全类型详解)
java·开发语言
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 739. 每日温度 | C++ 逆序单调栈
c++·算法·leetcode
eLIN TECE1 小时前
springboot和springframework版本依赖关系
java·spring boot·后端
良木生香1 小时前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
老神在在0011 小时前
Spring Bean 的六种作用域详解
java·后端·spring
仙草不加料1 小时前
互联网大厂Java面试故事实录:三轮场景化技术提问与详细答案解析
java·spring boot·微服务·面试·aigc·电商·内容社区
程序员老邢1 小时前
【技术底稿 19】Redis7 集群密码配置 + 权限锁死 + 磁盘占满连锁故障真实排查全记录
java·服务器·经验分享·redis·程序人生·微服务
落魄江湖行2 小时前
基础篇一 Java 有了 int 为什么还要 Integer?它们到底差在哪?
java·面试·八股文
Kurisu_红莉栖2 小时前
c++复习——const,static字
c++