精华内容
下载资源
问答
  • 1.ping 127.0.0.1,确保网络设置没问题;ping 本机IP地址,确保网卡没问题;...(登录路由器管理界面查看)4.ping服务器IP,保证能正常连接到服务器(或ping其他开放的DNS IP)1、确保防火墙对1521端口开启;...
    1.telnet 服务器IP(192.168.1.120) Oracle端口号(1521);若连接成功检查数据库本身问题,若连接不通执行下述步骤;
    

    2.命令行执行netstat -a –n,查看1521端口是否处于监听状态;

    ① 若没有处于监听状态先启动监听:

         命令行lsnrctl start】或【计算机 -> 管理 -> 服务和应用程序 -> 服务 -> 启动OracleServiceORCL、启动OracleOraDb11g_home1TNSListener,再尝试步骤1

         若启动不成功,打开电脑管家,查看启动项是否被禁止;若启动失败,app →product→ 11.1.0→db_1 →NETWORK→ADMIN找到服务器的tnsnames.ora这个文件,确保其中的ip 是本机IP,再在服务中启动;若还是启动失败重新配置一个监听再在服务中启动

      ② 若监听状态正常且没被占用还是不能连接到端口(具体占用和取消占用请自行百度):

          【关闭防火墙,确保防火墙对1521端口开启,重启数据库和监听后再尝试步骤1】

           可附加执行操作: windows防火墙 -> 高级设置 -> 入站规则 -> 操作 -> 新建规则 -> 端口(下一步)-> TCP/特定本地端口:1521(下一步) -> 允许连接 (下一步)-> (全部选中) -> 名称(Oracle1521端口)<类似步骤设置出站规则>

         ping 127.0.0.1确保网络设置没问题;ping 客户端IP,确保网卡没问题

          ping 路由器的LAN口IP默认网关IP,保证客户端网络正常通信(ipconfig找默认网关IP)

          【ping 路由器的WAN口IP,保证路由器工作正常(登录路由器管理界面查看)

          【ping 服务器IP,保证能正常连接到服务器(或ping其他开放的DNS IP)

          【app →product→ 11.1.0→db_1 →NETWORK→ADMIN找到服务器的listener.ora这个文件,如果HOST的值为localhost或127.0.0.1,将它的值修改为计算机全名(桌面属性\高级系统设置\系统属性\计算机名(计算机全名)重启数据库和监听后再尝试步骤1

        

    LISTENER =

      (DESCRIPTION =

        (ADDRESS =(PROTOCOL = TCP)(HOST = pc_name)(PORT = 1521))

      )


    展开全文
  • 客户端服务器通过局域网tcp连接,客户端该怎么把服务器的目录用treeview表示?而且速度尽量要快,要是在服务器把目录生成txt再发给客户端让客户端解析,文件多了会很慢吧?有什么好的方法吗?谢谢了。
  • 访问服务器地址中的某个文件链接,下载文件到客户端。从客户端下载服务器文件
    public void download() {  
    
            java.io.BufferedInputStream bis = null;  
            java.io.BufferedOutputStream bos = null;
            HttpServletRequest request = ThreadContextHolder.getHttpRequest();
    HttpServletResponse response = ThreadContextHolder.getHttpResponse();
    Integer yml_id = Integer.valueOf(request.getParameter("yml_id"));
    YmlModel yml = this.logiManager.queryforYml(yml_id);
    String file = null;
    String fileUrl="";

    String savePath = request.getRealPath("/")+"test/upyml/";
    if(yml!=null){
    file = yml.getYml_upfile();
    }
    String fileName=file;
    fileUrl=savePath+file;
            try {  
                fileUrl = new String(fileUrl.getBytes("utf-8"), "utf-8");  
                response.setContentType("application/x-msdownload");  
                response.setCharacterEncoding("utf-8");  
                response.setHeader("Content-disposition", "attachment; filename="  
                        + fileName);  
                // 通知客户文件的MIME类型:  
                bis = new java.io.BufferedInputStream(new java.io.FileInputStream(  
                        (fileUrl)));  
                bos = new java.io.BufferedOutputStream(response.getOutputStream());  
                byte[] buff = new byte[2048];  
                int bytesRead;  
                int i = 0;  
      
                while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {  
                    bos.write(buff, 0, bytesRead);  
                    i++;  
                }  
                bos.flush();
                this.showSuccessJson("下载成功!");
            } catch (Exception e) {  
                e.printStackTrace();
                this.showSuccessJson("下载失败!");
            } finally {  
                if (bis != null) {  
                    try {  
                        bis.close();  
                    } catch (IOException e) {  
                        // TODO Auto-generated catch block  
                        e.printStackTrace();  
                    }  
                    bis = null;  
                }  
                if (bos != null) {  
                    try {  
                        bos.close();  
                    } catch (IOException e) {  
                        // TODO Auto-generated catch block  
                        e.printStackTrace();  
                    }  
                    bos = null;  
                }  
            }  
      

        }  


    其中fileUrl为服务器中的文件真实路径,fileName为文件名。

    展开全文
  • 工程在现场进行项目实施,提到FTP上传文件失败; 反馈回来后,测试没有问题,但是现场一直有问题。...1、服务器原因(验证是正常,可以正常访问,正常拷贝文件到FTP目录) 2、客户端原因(在开发环境下,是正...

    工程在现场进行项目实施,提到FTP上传文件失败;

    反馈回来后,测试没有问题,但是现场一直有问题。

    在开发环境下测试都是正常的,既然软件没有问题,那么肯定是现场的工程环境存在问题;

    通过获取GetLastError,但是errorcode=0;

    无法通过这个获取原因

    分析几种情况:

    1、服务器原因(验证是正常,可以正常访问,正常拷贝文件到FTP目录

    2、客户端原因(在开发环境下,是正常的,只有现场有问题

    3、客户端机器原因(分析,可能是什么原因

    看到了这个帖子

    https://blog.csdn.net/ypc007/article/details/8913119

    里面说到会不会跟网络有关系,也不知道是因为啥灵光一闪,

    想是不是防火墙的原因啊,然后将防火墙给关掉

    测试一下,上传成功。

    然后这个问题就这么给解决了。

     

    展开全文
  • Qt实现客户端服务器消息发送与文件传输

    万次阅读 多人点赞 2018-05-01 13:06:53
    客户端服务器之间的数据传送在很多案例场景里都会有应用。这里Jungle用Qt来简单设计实现一个场景,即: ①两端:服务器...客户端服务器的基本概念说了,关于TCP通信的三次握手等等,在经典教材谢希仁...

    客户端与服务器之间的数据传送在很多案例场景里都会有应用。这里Jungle用Qt来简单设计实现一个场景,即:
    ①两端:服务器QtServer和客户端QtClient
    ②功能:服务端连接客户端,两者能够互相发送消息,传送文件,并且显示文件传送进度。
    环境:VS2008+Qt4.8.6+Qt设计师

    1.基本概念

    客户端与服务器的基本概念不说了,关于TCP通信的三次握手等等,在经典教材谢希仁的《计算机网络》里都有详细介绍。这里说下两者是如何建立起通信连接的。
    ①IP地址:首先服务器和每一个客户端都有一个地址,即IP地址。(底层的MAC地址,不关心,因为TCP通信以及IP,是七层架构里面的网络层、传输层了,底层透明)。对于服务器来说,客户端的数量及地址是未知的,除非建立了连接。但是对于客户端来说,必须知道服务器的地址,因为两者之间的连接是由客户端主动发起的。
    ②端口号:软件层面的端口号,指的是“应用层的各种协议进程与运输实体进行层间交互的一种地址”。简而言之,每一个TCP连接都是一个进程,操作系统需要为每个进程分配一个协议端口(即每一个客户端与服务端的连接,不是两台主机的连接,而是两个端口的连接)。但一台主机通常会有很多服务,很多进程,单靠一个IP地址不能标识某个具体的进程或者连接。所以用端口号来标识访问的目标服务器以及服务器的目标服务类型。端口号也有分类,但这不是本文的重点,详见教材。
    ③TCP连接:总的来说,TCP的连接管理分为单个阶段:建立连接->数据传送->连接释放。在②里说到,每个TCP连接的是具体IP地址的主机的两个端口,即TCP连接的两个端点由IP地址和端口号组成,这即是套接字的概念:
    套接字socket=IP:端口号
    因此,我们要通过建立套接字来建立服务端与客户端的通信连接。

    2.Qt相关类

    QTcpSocket:提供套接字
    QTcpServer:提供基于TCP的服务端,看官方文档的解释如下:
    This class makes it possible to accept incoming TCP connections. You can specify the port or have QTcpServer pick one automatically. You can listen on a specific address or on all the machine’s addresses.
    这个解释里面提到两点:
    ①指定端口:即开通哪一个端口用于建立TCP连接;
    ②监听:监听①中指定的端口是否有连接的请求。

    3.UI设计

    客户端:
    这里写图片描述
    服务端:
    这里写图片描述

    4.客户端实现

    类设计如下:

    class QtClient : public QWidget
    {
    	Q_OBJECT
    public:
    	QtClient(QWidget *parent = 0, Qt::WFlags flags = 0);
    	~QtClient();
    
    	void initTCP();
    	void newConnect();
    
    	private slots:
    		连接服务器
    		void connectServer();
    		与服务器断开连接
    		void disconnectServer();
    		接收服务器发送的数据
    		void receiveData();	
    		向服务器发送数据
    		void sendData();
    
    		浏览文件
    		void selectFile();
    		发送文件
    		void sendFile();
    		更新文件发送进度
    		void updateFileProgress(qint64);
    		更新文件接收进度
    		void updateFileProgress();
    
    private:
    	Ui::QtClientClass ui;
    	QTcpSocket *tcpSocket;
    	QTcpSocket *fileSocket;
    
    	///文件传送
    	QFile *localFile;
    	///文件大小
    	qint64 totalBytes;      //文件总字节数
    	qint64 bytesWritten;    //已发送的字节数
    	qint64 bytestoWrite;    //尚未发送的字节数
    	qint64 filenameSize;    //文件名字的字节数
    	qint64 bytesReceived;   //接收的字节数
    	///每次发送数据大小
    	qint64 perDataSize;
    	QString filename;
    	///数据缓冲区
    	QByteArray inBlock;
    	QByteArray outBlock;
    
    	系统时间
    	QDateTime current_date_time;
    	QString str_date_time;
    };
    

    类实现如下:

    #include "qtclient.h"
    
    QtClient::QtClient(QWidget *parent, Qt::WFlags flags)
    	: QWidget(parent, flags)
    {
    	ui.setupUi(this);
    	this->initTCP();
    
    	/文件传送相关变量初始化
    	///每次发送数据大小为64kb
    	perDataSize = 64*1024;
    	totalBytes = 0;
    	bytestoWrite = 0;
    	bytesWritten = 0;
    	bytesReceived = 0;
    	filenameSize = 0;
    
    	connect(this->ui.pushButton_openFile,SIGNAL(clicked()),this,SLOT(selectFile()));
    	connect(this->ui.pushButton_sendFile,SIGNAL(clicked()),this,SLOT(sendFile()));
    }
    
    QtClient::~QtClient()
    {
    }
    
    void QtClient::initTCP()
    {
    	this->tcpSocket = new QTcpSocket(this);
    	connect(ui.pushButton_connect,SIGNAL(clicked()),this,SLOT(connectServer()));
    	connect(ui.pushButton_disconnect,SIGNAL(clicked()),this,SLOT(disconnectServer()));
    	connect(ui.pushButton_send,SIGNAL(clicked()),this,SLOT(sendData()));
    }
    
    void QtClient::connectServer()
    {
    	tcpSocket->abort();
    	tcpSocket->connectToHost("127.0.0.1",6666);
    	connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(receiveData()));
    }
    

    这里说明一下两个方法:
    ①abort():官方文档给出了说明:
    Aborts the current connection and resets the socket. Unlike disconnectFromHost(), this function immediately closes the socket, discarding any pending data in the write buffer.
    即终止之前的连接,重置套接字。
    ②connectToHost():给定IP地址和端口号,连接服务器。这里我们给127.0.0.1,即本机地址,端口号随便给了个,一般来说介于49152~65535之间的都行。

    void QtClient::disconnectServer()
    {
    	//这里不做实现了,大家自己定义吧O(∩_∩)O哈哈~
    }
    
    void QtClient::receiveData()
    {
    	/获取当前时间
    	current_date_time = QDateTime::currentDateTime();
    	str_date_time = current_date_time.toString("yyyy-MM-dd hh:mm:ss")+"\n";
    	接收数据
    	QString str = tcpSocket->readAll();
    	显示
    	str = "Server "+str_date_time+str;
    	this->ui.textEdit->append(str);
    }
    
    void QtClient::sendData()
    {
    	发送数据
    	QString str = ui.lineEdit->text();
    	this->tcpSocket->write(ui.lineEdit->text().toLatin1());
    	显示
    	current_date_time = QDateTime::currentDateTime();
    	str_date_time = current_date_time.toString("yyyy-MM-dd hh:mm:ss");
    	str = "You "+str_date_time+"\n"+str;
    	ui.textEdit->append(str);
    }
    

    这里说明QTCPSocket的两个方法:
    ①readAll():如果把一个socket比作一个通讯管道,那么这个方法的作用是读取该管道里的所有数据(格式为QByteArray);
    ②write():同上面的比喻,这个方法的作用是向管道里塞数据。

    void QtClient::selectFile()
    {
    	this->fileSocket = new QTcpSocket(this);
    	fileSocket->abort();
    	fileSocket->connectToHost("127.0.0.1",8888);
    	文件传送进度更新
    	connect(fileSocket,SIGNAL(bytesWritten(qint64)),this,SLOT(updateFileProgress(qint64)));
    	connect(fileSocket,SIGNAL(readyRead()),this,SLOT(updateFileProgress()));
    
    	this->ui.progressBar->setValue(0);
    	this->filename = QFileDialog::getOpenFileName(this,"Open a file","/","files (*)");
    	ui.lineEdit_filename->setText(filename);
    }
    

    从上面那段代码可以看出,Jungle设计了两个socket,一个用于发送字符数据,另一个套接字用于传送文件。两个socket分别使用两个不同的端口。在服务端里也是这样,待会儿不再解释了。

    void QtClient::sendFile()
    {
    	this->localFile = new QFile(filename);
    	if(!localFile->open(QFile::ReadOnly))
    	{
    		ui.textEdit->append(tr("Client:open file error!"));
    		return;
    	}
    	///获取文件大小
    	this->totalBytes = localFile->size();
    	QDataStream sendout(&outBlock,QIODevice::WriteOnly);
    	sendout.setVersion(QDataStream::Qt_4_8);
    	QString currentFileName = filename.right(filename.size()-filename.lastIndexOf('/')-1);
    	
    	qDebug()<<sizeof(currentFileName);
    	保留总代大小信息空间、文件名大小信息空间、文件名
    	sendout<<qint64(0)<<qint64(0)<<currentFileName;
    	totalBytes += outBlock.size();
    	sendout.device()->seek(0);
    	sendout<<totalBytes<<qint64((outBlock.size()-sizeof(qint64)*2));
    
    	bytestoWrite = totalBytes-fileSocket->write(outBlock);
    	outBlock.resize(0);
    }
    

    这里同样说明两点:
    ①setVision():设定数据序列的版本,官方文档里说明这个不是必须的,但是推荐我们要去进行这一步的工作。我这里是Qt4.8.6,所以设定为Qt4.8.见下图(截自Qt官方文档)
    这里写图片描述
    ②qint64:这个类型在Jungle之前的博客里也提到过,是指qt的无符号的整型,64位。

    void QtClient::updateFileProgress(qint64 numBytes)
    {
    	已经发送的数据大小
    	bytesWritten += (int)numBytes;
    
    	如果已经发送了数据
    	if(bytestoWrite > 0)
    	{
    		outBlock = localFile->read(qMin(bytestoWrite,perDataSize));
    		///发送完一次数据后还剩余数据的大小
    		bytestoWrite -= ((int)fileSocket->write(outBlock));
    		///清空发送缓冲区
    		outBlock.resize(0);
    	}
    	else
    		localFile->close();
    
    	更新进度条
    	this->ui.progressBar->setMaximum(totalBytes);
    	this->ui.progressBar->setValue(bytesWritten);
    
    	如果发送完毕
    	if(bytesWritten == totalBytes)
    	{
    		localFile->close();
    		//fileSocket->close();
    	}
    }
    
    void QtClient::updateFileProgress()
    {
    	QDataStream inFile(this->fileSocket);
    	inFile.setVersion(QDataStream::Qt_4_8);
    
    	///如果接收到的数据小于16个字节,保存到来的文件头结构
    	if(bytesReceived <= sizeof(qint64)*2)
    	{
    		if((fileSocket->bytesAvailable()>=(sizeof(qint64))*2) && (filenameSize==0))
    		{
    			inFile>>totalBytes>>filenameSize;
    			bytesReceived += sizeof(qint64)*2;
    		}
    		if((fileSocket->bytesAvailable()>=filenameSize) && (filenameSize != 0))
    		{
    			inFile>>filename;
    			bytesReceived += filenameSize;
    			filename = "ServerData/"+filename;
    			localFile = new QFile(filename);
    			if(!localFile->open(QFile::WriteOnly))
    			{
    				qDebug()<<"Server::open file error!";
    				return;
    			}
    		}
    		else
    			return;
    	}
    	/如果接收的数据小于总数据,则写入文件
    	if(bytesReceived < totalBytes)
    	{
    		bytesReceived += fileSocket->bytesAvailable();
    		inBlock = fileSocket->readAll();
    		localFile->write(inBlock);
    		inBlock.resize(0);
    	}
    
    	数据接收完成时
    	if(bytesReceived == totalBytes)
    	{
    		this->ui.textEdit->append("Receive file successfully!");
    		bytesReceived = 0;
    		totalBytes = 0;
    		filenameSize = 0;
    		localFile->close();
    		//fileSocket->close();
    	}
    }
    

    5.服务端实现

    类的设计:

    class QtServer : public QWidget
    {
    	Q_OBJECT
    
    public:
    	QtServer(QWidget *parent = 0, Qt::WFlags flags = 0);
    	~QtServer();
    
    	QTcpServer *server;
    	QTcpSocket *socket;
    	QTcpServer *fileserver;
    	QTcpSocket *filesocket;
    
    private slots:  
    	void sendMessage(); 
    	void acceptConnection();
    	接收客户端发送的数据
    	void receiveData();
    
    	void acceptFileConnection();
    	void updateFileProgress();
    	void displayError(QAbstractSocket::SocketError socketError);
    
    	///选择发送的文件
    	void selectFile();
    	void sendFile();
    	更新文件传送进度
    	void updateFileProgress(qint64);
    
    private:
    	Ui::QtServerClass ui;
    
    	传送文件相关变量
    	qint64 totalBytes;
    	qint64 bytesReceived;
    	qint64 bytestoWrite;
    	qint64 bytesWritten;
    	qint64 filenameSize;
    	QString filename;
    	///每次发送数据大小
    	qint64 perDataSize;
    	QFile *localFile;
    	本地缓冲区
    	QByteArray inBlock;
    	QByteArray outBlock;
    
    	系统时间
    	QDateTime current_date_time;
    	QString str_date_time;
    };
    

    实现:

    #include "qtserver.h"
    #include <QDataStream>
    #include <QMessageBox>
    #include <QString>
    #include <QByteArray>
    
    QtServer::QtServer(QWidget *parent, Qt::WFlags flags)
    	: QWidget(parent, flags)
    {
    	ui.setupUi(this);
    
    	this->socket = new QTcpSocket(this);
    	this->server = new QTcpServer(this);
    	///开启监听
    	this->server->listen(QHostAddress::Any,6666);
    	connect(this->server,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
    	connect(ui.pushButton_send,SIGNAL(clicked()),this,SLOT(sendMessage()));
    
    	///文件传送套接字
    	this->filesocket = new QTcpSocket(this);
    	this->fileserver = new QTcpServer(this);
    	this->fileserver->listen(QHostAddress::Any,8888);
    	connect(this->fileserver,SIGNAL(newConnection()),this,SLOT(acceptFileConnection()));
    
    	 文件传送相关变量初始化
    	bytesReceived = 0;
    	totalBytes = 0;
    	filenameSize = 0;
    	connect(ui.pushButton_selectFile,SIGNAL(clicked()),this,SLOT(selectFile()));
    	connect(ui.pushButton_sendFile,SIGNAL(clicked()),this,SLOT(sendFile()));
    }
    
    QtServer::~QtServer()
    {
    
    }
    
    void QtServer::acceptConnection()
    {
    	返回一个socket连接
    	this->socket = this->server->nextPendingConnection();
    	connect(socket,SIGNAL(readyRead()),this,SLOT(receiveData()));
    }
    
    void QtServer::acceptFileConnection()
    {
    	bytesWritten = 0;
    	///每次发送数据大小为64kb
    	perDataSize = 64*1024;
    	this->filesocket = this->fileserver->nextPendingConnection();
    	///接受文件
    	connect(filesocket,SIGNAL(readyRead()),this,SLOT(updateFileProgress()));	
    	connect(filesocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(updateFileProgress(qint64)));
    	connect(filesocket,SIGNAL(bytesWritten(qint64)),this,SLOT(displayError(QAbstractSocket::SocketError socketError)));
    }
    
    void QtServer::sendMessage()
    {
    	this->socket->write(ui.lineEdit->text().toLatin1());
    	显示
    	current_date_time = QDateTime::currentDateTime();
    	str_date_time = current_date_time.toString("yyyy-MM-dd hh:mm:ss");
    	QString str = "You "+str_date_time+"\n"+ui.lineEdit->text();
    	ui.browser->append(str);
    }
    
    void QtServer::receiveData()
    {
    	/获取当前时间
    	current_date_time = QDateTime::currentDateTime();
    	str_date_time = current_date_time.toString("yyyy-MM-dd hh:mm:ss")+"\n";
    
    	接收数据
    	QString str = this->socket->readAll();
    
    	显示
    	str = "Client "+str_date_time+str;
    	this->ui.browser->append(str);
    }
    
    void QtServer::updateFileProgress()
    {
    	QDataStream inFile(this->filesocket);
    	inFile.setVersion(QDataStream::Qt_4_8);
    	
    	///如果接收到的数据小于16个字节,保存到来的文件头结构
    	if(bytesReceived <= sizeof(qint64)*2)
    	{
    		if((filesocket->bytesAvailable()>=(sizeof(qint64))*2) && (filenameSize==0))
    		{
    			inFile>>totalBytes>>filenameSize;
    			bytesReceived += sizeof(qint64)*2;
    		}
    		if((filesocket->bytesAvailable()>=filenameSize) && (filenameSize != 0))
    		{
    			inFile>>filename;
    			bytesReceived += filenameSize;
    			接收的文件放在指定目录下
    			filename = "ClientData/"+filename;
    			localFile = new QFile(filename);
    			if(!localFile->open(QFile::WriteOnly))
    			{
    				qDebug()<<"Server::open file error!";
    				return;
    			}
    		}
    		else
    			return;
    	}
    	/如果接收的数据小于总数据,则写入文件
    	if(bytesReceived < totalBytes)
    	{
    		bytesReceived += filesocket->bytesAvailable();
    		inBlock = filesocket->readAll();
    		localFile->write(inBlock);
    		inBlock.resize(0);
    	}
    	更新进度条显示
    	this->ui.progressBar_fileProgress->setMaximum(totalBytes);
    	this->ui.progressBar_fileProgress->setValue(bytesReceived);
    	数据接收完成时
    	if(bytesReceived == totalBytes)
    	{
    		this->ui.browser->append("Receive file successfully!");
    		bytesReceived = 0;
    		totalBytes = 0;
    		filenameSize = 0;
    		localFile->close();
    		//filesocket->close();
    	}
    }
    
    void QtServer::displayError(QAbstractSocket::SocketError socketError)
    {
    	qDebug()<<socket->errorString();
    	socket->close();
    }
    
    void QtServer::selectFile()
    {
    	filesocket->open(QIODevice::WriteOnly);
    	文件传送进度更新
    	connect(filesocket,SIGNAL(bytesWritten(qint64)),this,SLOT(updateFileProgress(qint64)));
    
    	this->filename = QFileDialog::getOpenFileName(this,"Open a file","/","files (*)");
    	ui.lineEdit_fileName->setText(filename);
    }
    
    void QtServer::sendFile()
    {
    	this->localFile = new QFile(filename);
    	if(!localFile->open(QFile::ReadOnly))
    	{
    		return;
    	}
    	///获取文件大小
    	this->totalBytes = localFile->size();
    	QDataStream sendout(&outBlock,QIODevice::WriteOnly);
    	sendout.setVersion(QDataStream::Qt_4_8);
    	QString currentFileName = filename.right(filename.size()-filename.lastIndexOf('/')-1);
    
    	保留总代大小信息空间、文件名大小信息空间、文件名
    	sendout<<qint64(0)<<qint64(0)<<currentFileName;
    	totalBytes += outBlock.size();
    	sendout.device()->seek(0);
    	sendout<<totalBytes<<qint64((outBlock.size()-sizeof(qint64)*2));
    
    	bytestoWrite = totalBytes-filesocket->write(outBlock);
    	outBlock.resize(0);
    }
    
    void QtServer::updateFileProgress(qint64 numBytes)
    {
    	已经发送的数据大小
    	bytesWritten += (int)numBytes;
    
    	如果已经发送了数据
    	if(bytestoWrite > 0)
    	{
    		outBlock = localFile->read(qMin(bytestoWrite,perDataSize));
    		///发送完一次数据后还剩余数据的大小
    		bytestoWrite -= ((int)filesocket->write(outBlock));
    		///清空发送缓冲区
    		outBlock.resize(0);
    	}
    	else
    		localFile->close();
    
    	如果发送完毕
    	if(bytesWritten == totalBytes)
    	{
    		localFile->close();
    		//filesocket->close();
    	}
    }
    

    6.测试

    这里写图片描述
    这里写图片描述
    这里发送了几条消息,并从客户端将《Windows网络编程技术.pdf》传到服务端,在服务端的ClientData文件夹里,该文件存在,证明程序可行!

    7.源码

    程序包:https://download.csdn.net/download/sinat_21107433/10823712

    Github更新到了vs2013+Qt5,源代码上传到Git了,地址:https://github.com/FengJungle/QtSocket.git

    欢迎关注知乎专栏Jungle是一个用Qt的工业Robot
    欢迎关注Jungle的微信公众号:Jungle笔记
    在这里插入图片描述

    展开全文
  • Liunx客户端访问Samba服务器

    千次阅读 2019-09-23 10:14:57
    Liunx客户端需要安装Samba软件中samba-client包要不然访问不了 使用本地yum源进行Samba-client包安装 [root@localhost ~]# yum -y install samba-client Linux客户端使用smbclient命令访问Samba服务器上的共享资源...
  • log.error("下载敏感词模版到客户端出错", e); } return JSON_RESULT; } 红色两行是最关键的, 用response的转发 。 2.一种直接从服务器硬盘下的安全方式: a标签链接: 点我...
  • 一般开发都是使用file控件等进行文件上传,今天在开发中遇到js传递包含文件路径的json字符串,于是想在服务器端根据路径进行文件上传,采用流上传。 主要代码为: string filepath = '' //文件上传本地地址; ...
  • 如果实现一客户端服务器的交互比较容易(直接用TCP的编程流程就可以实现,只是这样写出的...我们先给出服务器处理同一客户端的多次访问的伪代码:   要实现多个客户端同时与同一服务器的交互,就要求服务器与...
  • (我们知道每一个台服务器都可以通过ip和端口直接被访问。但是,用户对于由数字组成的ip是很难有记忆点的,所以就出现了域名,域名可以映射ip。那么域名是如何与ip进行映射的,就需要DNS协议的帮忙 ) 1.OS会先...
  • 原来是防火墙对端口的限制,解决方案如下: 1、防火墙——>高级设置——>入站规则——>右边的新建规则——>端口——>选择TCP——>特定本地端口(填写你的端口 如4300)——>记得填写自记的网站名称以便于下面的...
  • 最近使用windows的客户端访问vmware虚拟机里面的服务器失败,显示connection refused。服务器是linux contos版本,可以用windows的putty连接上linux,windows端ping linux主机也可以ping通。因此断定链路是没有问题...
  • 转自:https://www.cnblogs.com/yankyblogs/p/7282752.html本教程以64位win10系统为例在本地搭建svn服务器,安装完成后,即可访问本地svn服务器上的项目,也可以访问网上其他svn服务器上的项目。 一、首先准备三个...
  • 所以如果要使客户端能够直接访问服务端的静态资源(如 html,jsp,js,css,image,txt 等),可通过以下两种方法: 1、在SpringMVC的配置文件(spring_mvc.xml)中进行相关配置 如下,在 SpringMVC的配置文件 ...
  • jsp文件客户端还是服务器端?

    千次阅读 2018-08-15 18:42:23
    1、客户端在通过浏览器访问服务器端存放的JSP时,JSP中的java代码、标签等是在服务器端运行的,生成普通的html,最终返回客户端的是这些html。 JSP在服务器端是被编译成为servlet的,这些servlet负责提供html的输出...
  • ![图片说明](https://img-ask.csdn.net/upload/201601/03/1451820483_766954.jpg)
  • NTP(Network Time Protocol)服务器是用于局域网服务器时间同步使用的,可以保证局域网所有的服务器与时间服务器的时间保持一致,应用于对时间实时性要求高的、必须统一时间事件。  服务端安装 一、安装ntp服务 ...
  • 客户端到服务器端的通信过程及原理

    万次阅读 多人点赞 2018-01-22 00:52:27
    现在结和我所学,我想总结一下客户端到服务器端的通信过程。只有明白了原理,我们才会明白当我们程序开发过程中错误的问题会出现在那,才会更好的解决问题。  我们首先要了解一个概念性的词汇:Socket  socket的...
  • 首先浏览器检查浏览器DNS缓存中有没有这个域名 , 如果找不到则从操作系统的DNS缓存中找 , 如果还是找不到 , 则查询系统的host文件 , 如果还是找不到,根据配置的DNS地址如114.114.114.114,去对应的服务器中查询,查询...
  • App中访问的ip地址应为你的服务器地址,在同一局域网下,我使用ipconfig命令得到电脑的ip是192.168.1.104,那么我就在App工程中的C.java文件中把IP设置为这个就行了。 APP把数据以hashmap形式传给服务器服务器在...
  • 后者支持加密、证书传输。非常简单: 只需要 指定端口号,用户名 就可以使用此ftp服务器,另外支持匿名登陆,需要把用户名设置为anonymous。 SU-FTP-Server 相对比较复杂,需要系统学习下,下面我贴出...
  • 现在我的数据库中存有客服的WAV录音文件的路径,同时录音文件是在服务器上保存的。 我使用repeater控件绑定数据库后,用lable读取路径,传一个“播放”按钮的点击事件里。 现在问题来了:当我点击这个播放按钮的...
  • 现在想在iOS上支持SMB的客户端,目前找不到太多的资料。不知道是否可以做到
  • 1.TCP实现服务器端与多个客户端通信 import socket def main(): # 1. 创建套接字socket tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 绑定本地信息 bind tcp_server_socket...
  • 本程序Android手机访问服务器登陆程序(客户端、服务器端、Mysql数据库)直接安装就可以用。数据库文件在服务器端的mysql.sql中。
  • 把filezilla的 Filazilla server interface.exe 和Filezilla server.exe 二个文件都加入防火墙的例外。
  • FTP服务器客户端

    千次阅读 2019-03-16 20:41:09
    《计算机通信网络》课程项目 终期报告 题 目: FTP协议实现 ...文件传输协议(File Transfer Protocol, FTP)是重要的应用层协议,用于Internet上控制文件的双向传输。FTP允许用户连接一台远程计算机...
  • FTP是应用层协议,采用C/S架构,服务器和客户端之间通过TCP协议建立连接,服务器用来存储文件客户端通过访问服务器来下载文件或向服务器上传文件。 FTP在传输数据的时候使用控制连接(21端口)和数据连接(20端口),...
  • 为了实现手机与计算机之间的文件传输,我们应保证手机和计算机在同一局域网中,因此我们计算机与手机连接同一WIFI中,我们下载了猎豹WIIF,用电脑开启WIFI后,将手机接入WIFI,这样就保证了手机与计算机在同一...
  • 这篇文章是对上篇 记录一下cas sso的开发过程 内容的补充吧。当我发现把服务器和客户端分开的时候遇到...客户端访问自己的服务时需要通过cas server验证登录信息。配置如下:cas 服务端:编辑文件:C:\Windows\Syste...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 795,428
精华内容 318,171
关键字:

如何让客户端不访问到服务器的文件