首页 > 编程语言 >qt和java的socket连接

qt和java的socket连接

时间:2024-01-19 13:55:25浏览次数:22  
标签:java qt 连接 socket new port 服务端 客户端

事先说明qt为客户端(发出请求)java为服务端(处理请求)
关于qt的客户端来说我们大体上要完成三个需求,即请求连接,发送,接收

  1. 请求连接

如果想使用qt写socket程序,首先需要在.pro文件中添加QT += network;(非常非常重要)

  1. 接收

然后我们就可以在代码中使用QT的网络库了,socket涉及到的函数库有Qtcpsocket,QTcpServer
下面为连接部分与接收部分代码:

void MainWindow::on_le_ip_textChanged(const QString &arg)//定义了一个lineEdit(用于输入ip地址)
{
    ip=arg;//ip为全局变量
}

void MainWindow::on_le_port_textChanged(const QString &arg1)//定义了一个lineEdit(用于输入端口号)
{
    port=arg1.toInt();//port为全局变量
}
 void MainWindow::on_pb_con_clicked()//定义了一个按钮(点击进行socket连接)
{
    socket->connectToHost(ip,port);//请求socket连接(你要保证服务端提前开启,下面再说)
    //下面定义了三个槽函数,什么是槽函数呢,当socket连接成功后会发出名字叫做connected的信号发送给this中的forbid函数(自己定义的槽函数),this指向的是MainWindow类,forbid是MainWindow类的一个槽函数(有点生疏,还请见谅)
    connect(socket,SIGNAL(connected()),this,SLOT(forbid()));//connected()为连接成功的信号
    connect(socket,SIGNAL(readyRead()),this,SLOT(read()));//readyRead()为有数据可读的信号
    connect(socket,SIGNAL(disconnected()),this,SLOT(unforbid()));//disconnected()为连接失败的信号


}
void MainWindow::read(){//读取数据
//当服务端发来数据时接收所有数据并显示在textEdit中
    QString message=socket->readAll();
    ui->textEdit->append(message);
}
void MainWindow::forbid(){
    //当连接成功的时获取ip和port的输入框禁止输入
    ui->le_ip->setEnabled(false);
    ui->le_port->setEnabled(false);

}

void MainWindow::unforbid(){
      //当连接失败或未连接的时获取ip和port的允许输入
    ui->le_ip->setEnabled(true);
    ui->le_port->setEnabled(true);


}
  1. 发送数据

在上面的代码中三个需求中的请求连接和接收已经完成,接下来就是发送数据了,发送数据需要用到QT中的QByteArray类,QByteArray类是QT中处理字节数组的类,代码如下:

void MainWindow::on_pb_send_clicked()
//定义了一个按钮(点击进行socket发送数据)
{QString mes=ui->textEdit_2->toPlainText();
//获取textEdit_2中的文本内容并转换成QByteArray类型
    socket->write(mes.toUtf8()+"\r\n");

}

对于发送来说我们只需要获取文本框中的内容,然后将其转换为QByteArray类型,最后调用socket的write函数发送数据即可


接下来就是java喽,在上面的qt中我们写了一个socket的客户端
向服务端发送了一个请求连接,现在我们就要去编写服务端咯
作为服务端我们需要先创建一个socket服务端,然后等待客户端的连接,当客户端连接成功后,服务端需要接收客户端发送的数据,然后将接收到的数据进行处理,最后将处理后的数据发送给客户端,代码如下:


public class socket {
    private ServerSocket socketserver;//socket服务端
    private int port;//端口号
    private BufferedReader in;//输入输出流
    private BufferedWriter out;
    //socket接口列表
    socketserver ssocket;
    List<Socket> slist = new ArrayList<>();

    public socket(int port) throws Exception {
        this.port = port;//获取端口号
        try {
            socketserver = new ServerSocket(this.port);//以获取到的端口号来创立服务器

        } catch (Exception e) {
            //TODO: handle exception
            e.printStackTrace();

        }
        while (true) {//由于java不像qt有槽函数机制所以java就要反复扫描,就相当于有个人一直在问:有人连接了吗,有人连接了吗(乐)
            try {//当有客户端连接是,创建一个新的连接对象并把它存到socket接口列表中
                System.out.println("等待连接");
                Socket socket = socketserver.accept();
                slist.add(socket);
                
             //确认是否连接成功,如果连接成功,就创立一个接口并向终端发送ip+端口号+连接成功
                if (socket.isConnected()) {
                    ssocket = new socketserver(socket);
                    ssocket.setSocketList(slist);
                    ssocket.start();

                    System.out.println(socket.getInetAddress().getHostAddress() + ":" + socket.getPort()+ "连接成功");

                }
                else {
                    socket.close();
                }

            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("连接失败");
                //TODO: handle exception

            }

        }

    }



}
在java的服务端和qt的客户端建立连接后,我们就要准备有服务端向客户端进行收发的操作了。
代码如下:
//要在java的服务端中进行收发操作我们涉及到技术有多线程以及输入输出流

public class socketserver extends  Thread {
   BufferedWriter out;//定义输出流,用于输出操作
   BufferedReader in;//定义输入流,用于读取操作
   List<Socket> list;//socket接口列表,用于储存客户端连接的socket接口
   Socket socket;
  socketserver(Socket socket) {
     try {
       //在连接成功后初始化输入输出流(输出new一个对象hhh)并输出hello from server 表示连接成功,
   this.socket=socket;
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        out.write("Hello from server");
        //newline()的意思是发送新行相当于\r\n了
        out.newLine();
        //刷新一下,让数据从缓存区域发送出去
        out.flush();
        
        //out.close();
     } catch (IOException e) {
        throw new RuntimeException(e);
     }

  }
   void setSocketList(List<Socket> list)
   {
       this.list = list;
   }


  @Override
//发送写完就该写接收了,但怎么接收是个问题,困难在于java没有像qt一样的槽函数,只能一直进行扫描知道有信息发过来,可java的主线程在一直进行连接操作无法进行读取操作一次我们就要进行多线程操作了,要进行多线程操作我们首先要继承一个类 Thread (java的线程类)关于它的解释可以自行查找
//我对于多线程的理解是:两段或者多段程序一起运行
  public void run() {//从写运行函数

     while (true) {//无线扫描,知道客户端发送信息
        try {
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //读取客户端发送的信息
           String msg = in.readLine();
           System.out.println( msg);
            //循环列表中的所有端口,做到把收到信息除发送方以外全部发送一遍
           for(int i=0;i<list.size();i++){
               if(this.socket==list.get(i)){

                   continue;
               }
               BufferedWriter out1 = new BufferedWriter(new OutputStreamWriter(list.get(i).getOutputStream()));
               out1.write(msg);
               out1.newLine();
               out1.flush();

           }

        } catch (IOException e) {
           e.printStackTrace();
           throw new RuntimeException(e);

        }

     }
  }
}

以上就是一些在不同的编程语言中的socket连接(我写的很菜,哪里出错了的话还请各位大佬指正)

标签:java,qt,连接,socket,new,port,服务端,客户端
From: https://www.cnblogs.com/yiyulhb/p/17974470

相关文章

  • java线程核心原理
    1.线程的调度与时间片1.1java线程与操作系统现代操作系统(如Windows、Linux、Solaris)提供了强大的线程管理能力,Java不需要再进行自己独立的线程管理和调度,而是将线程调度工作委托给操作系统的调度进程去完成。在某些系统(比如Solaris操作系统)上,JVM甚至将每个Java线程一对一......
  • 深入理解JavaScript堆栈、事件循环、执行上下文、作用域以及闭包
    合集-JavaScript进阶系列(5) 1.JavaScriptthis绑定详解01-092.JavaScriptapply、call、bind函数详解01-093.JavaScriptforEach方法跳出循环01-024.深入理解JavaScript堆栈、事件循环、执行上下文和作用域以及闭包01-105.JavaScript到底应不应该加分号?JavaScript自......
  • java多态
    有两个类,一个Animal类,一个Cat类,其中Cat是Animal的子类,此时我在主函数中这样声明一个对象"Animalanimal=newCat();",此时animal实际上是Cat类此时,Animal类中没有catMouse()这个方法,Cat类中有这个方法,我在主函数声明了"Animalanimal=newCat();"后,无法调用animal.catchMouse();......
  • java相似度算法计算
     publicclassCompareStrSimUtil{privatestaticintcompare(Stringstr,Stringtarget,booleanisIgnore){intd[][];//矩阵intn=str.length();intm=target.length();inti;//遍历str的intj;//遍历......
  • HanLP — 汉字转拼音 -- JAVA
    目录语料库训练加载语料库训练模型保存模型加载模型计算调用HanLP在汉字转拼音时,可以解决多音字问题,显示输出声调,声母、韵母,通过训练语料库,本文代码为《自然语言处理入门》配套版本HanLP-1.7.5对重载不是重任进行转拼音,效果如下:原文:重载不是重任拼音(数字音调):chong2,zai3,bu......
  • docker构建java镜像,运行镜像出现 no main manifest attribute, in /xxx.jar
    背景本文主要是一个随笔,记录一下出现"nomainmanifestattribute"的解决办法问题原因主要是近期在构建一个镜像,在镜像构建成功后,运行一直提示"nomainmanifestattribute",但是还在想,是不是Dockerfile写错了,后来仔细检查了一下,发现是在pom文件下build节点下配置问题,修改配置......
  • java创建线程的4种方式
    1.Thread类一个线程在Java中使用一个Thread实例来描述。Thread类是Java语言一个重要的基础类,位于java.lang包中。Thread类有不少非常重要的属性和方法,用于存储和操作线程的描述信息。1.1线程ID属性:privatelongtid,此属性用于保存线程的ID。这是一个private类型属性,外......
  • Java里ArrayList中的toArray()用法
    深入理解List的toArray()方法和toArray(T[]a)方法这两个方法都是将列表List中的元素转导出为数组,不同的是,toArray()方法导出的是Object类型数组,而toArray[T[]a]方法导出的是指定类型的数组。下面是两个方法的申明及说明,摘自Java8的API文档。toArray()方法的分析Object[]toA......
  • 基于JAVA的新闻类网站
    21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对新闻类网站进行了介绍,包括研......
  • 论文翻译 | 【深入挖掘Java技术】「底层原理专题」深入分析一下并发编程之父Doug Lea
    前提介绍DougLea在州立大学奥斯威戈分校(DougLea)摘要本文深入探讨了一个Java框架的设计、实现及其性能。该框架遵循并行编程的理念,通过递归方式将问题分解为多个子任务,并利用工作窃取技术进行并行处理。所有子任务完成后,其结果被整合以形成完整的并行程序。在总体设计上,该框架借鉴......