在下面的代码片段中,我试图在python中创建一个非阻塞的thrift服务器.
# set handler to our implementation
handler = ServiceHandler()
processor = MyService.Processor(handler)
transport = TSocket.TServerSocket(port=port)
tfactory = TTransport.TFramedTransport(transport)
pfactory = TBinaryProtocol.TBinaryProtocolFactory()
# set server
server = TServer.TThreadedServer(processor, transport, tfactory, pfactory)
print 'Python Server has started listening on port ' + str(port)
print '################################################'
server.serve()
Run Code Online (Sandbox Code Playgroud)
当python客户端尝试连接具有上述代码片段的服务器时,我收到以下错误.你能告诉我导致这个错误的原因吗?可能我错过了一些东西.
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib64/python2.6/threading.py", line 522, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.6/threading.py", line 477, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/local/lib64/python2.6/site-packages/thrift/server/TServer.py", line 114, in handle
itrans = self.inputTransportFactory.getTransport(client)
AttributeError: …Run Code Online (Sandbox Code Playgroud) 我在Java中有一个SNMP陷阱应用程序,旨在侦听SNMP代理并在JFrame窗口中的JTextArea上打印接收到的SNMP消息.
下面的第一部分是我的源代码,显示了TrapReceiver类的内容.在这个类中,listen方法是充分利用工作的地方.该类在JFrame类中进行实例化,我打算在上面提到的JTeaxtArea上显示消息.我将JTextArea对象的引用,SNMP代理URL和端口发送到TrapReceiver类的构造函数中,然后调用TrapReceiver对象的run方法以在JFrame实例以外的单独线程中开始执行.下面的第二部分展示了我如何在JFrame实例中实例化TrapReeceiver类.
当我运行应用程序时,我注意到JFrame实例(即GUI)正在冻结,并且没有在JFrame实例中提到的JTeaxtArea上打印消息,该实例实例化下面第一部分中所示的类TrapReeceiver.
我的问题是为什么JFrame实例(即GUI)是冻结的,尽管TRapReceiver本身是作为一个单独的线程执行的?此外,我想知道这个冻结问题的可能解决方案是什么.提前致谢.
PS:我已经验证了TrapReceiver工作正常并且可以在没有GUI的情况下作为独立应用程序运行时将消息打印到标准输出,但是由于某些可能的线程同步问题,这个GUI正在以某种方式冻结.我尝试运行TrapReceiver而不用线程,即使在这种情况下,GUI仍然处于冻结状态.
第一部分
package com.[Intenionally removed].snmp;
import java.io.IOException;
import javax.swing.JTextArea;
import org.snmp4j.*;
import org.snmp4j.mp.MPv1;
import org.snmp4j.mp.MPv2c;
import org.snmp4j.security.Priv3DES;
import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.TcpAddress;
import org.snmp4j.smi.TransportIpAddress;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.transport.AbstractTransportMapping;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.MultiThreadedMessageDispatcher;
import org.snmp4j.util.ThreadPool;
public class TrapReceiver implements CommandResponder, Runnable {
private String targetSnmpAgentURL;
private int targetSnmpAgentPort;
private JTextArea outConsole;
public TrapReceiver() {
}
public TrapReceiver(JTextArea outConsole) {
this.outConsole = outConsole;
}
public TrapReceiver(JTextArea outConsole, String targetSnmpAgentURL, int targetSnmpAgentPort) {
this.targetSnmpAgentURL = targetSnmpAgentURL; …Run Code Online (Sandbox Code Playgroud) 在下面的代码片段1中,mKnownSRList定义如下:
std::vector<EndPointAddr*> mKnownSRList;
Run Code Online (Sandbox Code Playgroud)
我收到代码片段2中显示的编译错误.你能告诉我这段代码有什么问题吗?getTipcAddress()和compareTo函数的内容显示在下面的代码片段3和4中.
CODE SNIPPET 1(编译错误已标记)
void
ServiceRegistrarAPI::removeKnownSR(EndPointAddr & srEndPointAddr)
{
auto last =
std::remove_if(mKnownSRList.begin(),
mKnownSRList.end(),
[srEndPointAddr]( EndPointAddr* o )
{
//LINE 355 is the following
EndPointTipcAddr myTipcAddress = srEndPointAddr.getTipcAddress();
EndPointTipcAddr otherTipcAddress = o->getTipcAddress();
return (myTipcAddress.compareTo(otherTipcAddress));
});
if(*last != nullptr)
{
delete *last;
}
mKnownSRList.erase(last, mKnownSRList.end());
}
Run Code Online (Sandbox Code Playgroud)
SNIPPET 2(编译错误)
ServiceRegistrarAPI.cpp:355:72: error: passing ‘const EndPointAddr’ as ‘this’ argument of ‘EndPointTipcAddr& EndPointAddr::getTipcAddress()’ discards qualifiers [- fpermissive]
Run Code Online (Sandbox Code Playgroud)
CODE SNIPPET 3(getTipcAddress函数)
EndPointTipcAddr & getTipcAddress() { return mTipcAddress; }
Run Code Online (Sandbox Code Playgroud)
代码NIPPET 4(compareTo功能)
bool
EndPointTipcAddr::compareTo(EndPointTipcAddr &rhs) …Run Code Online (Sandbox Code Playgroud) 在下面的代码片段中,名称为 mac 的 std::string 对象有时是一个空字符串(即“”),我希望准备好的语句自动将此变量视为空值。我想知道如何在下面的代码中实现这一点。在我的谷歌搜索尝试中,我碰巧发现有一种方法可以设置一个指示空值的标志,但我找不到具体的例子。你能提供一个例子来实现这一目标吗?谢谢。
try
{
mConnection->prepare("insertBulkData", mSqlInsertStmt);
pqxx::work xAction(*mConnection);
for(uint32_t i = 0; i < tList.size(); i++)
{
TCoreDTO* tCore = tList[i];
const std::string& mac = tCore->getMac();
const std::string& uuid = tCore->getUUID();
int coreNo = (int)tCore->getCoreNo();
xAction.prepared("insertBulkData")(mac)(uuid)(coreNo).exec();
}
xAction.commit();
}
catch(std::exception& pqExp)
{
//Error handling code
.....
}
Run Code Online (Sandbox Code Playgroud)
插入语句如下:
std::string mSqlInsertStmt
= "INSERT INTO T_CORES (MAC, UUID, CORE_NO) VALUES ($1, $2, $3)";
Run Code Online (Sandbox Code Playgroud)
表结构如下:
CREATE TABLE IF NOT EXISTS T_CORES (
ID SERIAL PRIMARY KEY,
MAC TEXT,
UUID TEXT, …Run Code Online (Sandbox Code Playgroud) 我有一个独立的 java 应用程序,可以在 postgresql 数据库上进行一些数据库读/写业务。我使用了 java.sql.Connection 对象上可用的 isValid 函数来重新建立数据库连接,以防万一由于网络问题/崩溃而丢失/失败。下面的代码片段很快就展示了这个想法:
//dbConnection is an instance of java.sql.Connection
if(dbConnection.isValid(1)){
reEstablishConnection();
}
Run Code Online (Sandbox Code Playgroud)
尽管如此,在运行时,我在上述 if 块的条件下遇到异常,表示方法“isValid”尚未实现。我使用的是最新的 JDBC 驱动程序 (v9.1-101),我的 postgesql DBMS 版本是 8.3.9。我在 SUSe Linux(SLES 11 SP2 - 64 位)上使用 Yast2 安装了它。有人能告诉我如何检查连接是否在 Java 中以编程方式丢失以用于 postgresql?我的意图是在没有用户干预的情况下自动重新连接。
我有下面的java脚本函数,我想将页面重定向到另一个页面.我确认警报功能显示"已收到"消息.因此,该函数被正确调用.但是,使用window.location.href进行页面重定向不起作用.此外,打印选项vDaeId,dgpId的内容的警报功能未执行(我在浏览器中看不到弹出窗口).你能告诉我这段代码有什么问题吗?谢谢.我正在使用firefox btw.
function goToPMDisplayer(){
alert('Got ');
var option=document.getElementById("D1").value;
var vDaeId=document.getElementById("D2").value;
var dgpId=document.getElementById("dgpids").value;
var str= option + " "+ vDaeId + " "+ dgpId
alert(str);
window.location.href="display.jsp?option="+option + "&vdaeid=" + vDaeId + "&dgpid=" + dgpId
}
Run Code Online (Sandbox Code Playgroud) 鉴于下面的代码段 1 和 2 中的两个类定义,您能告诉我为什么我收到第三个代码段中显示的编译错误以及如何修复它们吗?看起来子类无法访问基类中的非虚拟公共方法(请参阅子类中标记为第 2 个代码片段中的第 197 行的方法 getVipAddress)。我是 C++ 领域的新手,所以如果您碰巧看到代码块中需要任何其他改进,我将不胜感激。
片段 1(基础和子类)
//基础类
class BaseEntity
{
public:
BaseEntity(): mUUID(""), mName("") {}
BaseEntity(std::string &uuid, std::string &name): mUUID(uuid), mName(name) { }
BaseEntity (const BaseEntity ©in)
{
this->mUUID = copyin.mUUID.c_str();
this->mName = copyin.mName.c_str();
}
BaseEntity operator = (const BaseEntity &rhs)
{
this->mUUID = rhs.mUUID.c_str();
this->mName = rhs.mName.c_str();
return *this;
}
~BaseEntity() { };
void setUUID(std::string uuid) { mUUID = uuid; }
void setName(std::string name) { mName = name; }
/*LINE 89 …Run Code Online (Sandbox Code Playgroud) 我正在为我的应用程序使用zeromq api,并在下面指出了链接问题。我已经在我的ubuntu 12.10系统上安装了zeromq和czmq tar球,并验证了/ usr / local / include下是否存在必要的头文件(例如zmq.h)。您能否告诉我为什么我遇到这些链接问题?有什么可能的解决方案。我还安装了zmq c ++绑定(zmq.hpp)。
/XXXX.cpp:92: undefined reference to `zmq_poll'
CMakeFiles/dummy.dir/__/xxx_api/TheQueue.cpp.o: In function`zmq::error_t::error_t()':
/usr/local/include/zmq.hpp:76: undefined reference to `zmq_errno'
CMakeFiles/dummy.dir/__/xxx_api/TheQueue.cpp.o: In function `zmq::error_t::what() const':
/usr/local/include/zmq.hpp:80: undefined reference to `zmq_strerror'
CMakeFiles/dummy.dir/__/xxx/TheQueue.cpp.o: In function`zmq::context_t::context_t(int)':
/usr/local/include/zmq.hpp:241: undefined reference to `zmq_init'
CMakeFiles/dummy.dir/__/control_api/TheQueue.cpp.o: In function `zmq::context_t::close()':
/usr/local/include/zmq.hpp:267: undefined reference to `zmq_term'
CMakeFiles/dummy.dir/__/xxx_api/TheQueue.cpp.o: In function `zmq::socket_t::socket_t(zmq::context_t&, int)':
collect2: error: ld returned 1 exit status
make[2]: *** [/xxx/build_output/dummy] Error 1
make[1]: *** [/xxx/CMakeFiles/dummy.dir/all] Error 2
Run Code Online (Sandbox Code Playgroud) 我有一个std :: vector实例,如下所示:
std::vector< std::pair<EndPointAddr*, EndPointAddr*>* > mServiceSubscriptionsList;
Run Code Online (Sandbox Code Playgroud)
底层std :: pair对象中的第一项是订户实体的网络地址,而第二项是订阅实体的网络地址.因此,std :: pair对象在此表示订阅作为订阅者和订阅端点地址对.
我想删除此向量中针对给定订户端点地址的所有订阅.为此,我在下面写了指示函数,其中我使用带谓词的std :: remove_if.根据std :: remove_if的文档,我的理解是std :: remove_if将所有出现的内容都删除到向量的末尾,并将向量的末尾向后移动到新的位置.
我的问题是:
如何在调用remove_if之后到达向量末尾的这些std :: pair项目,以便逐个动态地解除分配它们的内容(即解除对std :: pair*指针的攻击)?你能在下面的功能代码中指出所需的代码片段吗?我可以删除最后保留在迭代器中的第一个出现.但是,我不知道如何删除其余的出现.谢谢.
bool
XXX::removeSubscriptionForASpecificSubscriber(EndPointAddr * ptrSubscriberAddr)
{
auto last =
std::remove_if(mServiceSubscriptionsList.begin(),
mServiceSubscriptionsList.end(),
[ptrSubscriberAddr](std::pair<EndPointAddr*, EndPointAddr*>* thePair)
{
return ptrSubscriberAddr->getXXXAddress().compareTo(thePair->first->getXXXAddress());
});
if(last != mServiceSubscriptionsList.end())
{
//HERE I CAN DELET THE FIRST OCCURENCE, but WHAT I WANT IS TO DELETE ALL OCCURANCES
if(*last != nullptr)
{
delete *last;
}
mServiceSubscriptionsList.erase(last, mServiceSubscriptionsList.end());
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud) 我有一个C++类,我在其中放置了许多std :: cout语句来打印有关此类正在处理的大量信号的信息性文本消息.我的目的是将这些文本消息重定向到名为log的函数.在这个函数中,我有一个名为mVerbose的标志,它定义是否应该打印日志文本.该功能的内容如下:
void XXXProxy::log(std::stringstream& ss)
{
if(mVerbose)
{
std::cout << ss;
ss << "";
}
}
Run Code Online (Sandbox Code Playgroud)
然后,此函数的调用者代码片段如下:std :: stringstream logStr;
logStr << "SE"
<< getAddr().toString()
<< ": WAITING on epoll..."
<< std::endl;
log(logStr);
Run Code Online (Sandbox Code Playgroud)
我想以一种我可以摆脱创建std :: stringstream对象并调用日志函数的方式重载我的XXXProxy中的<<运算符.我希望能够如下记录文本消息,让<<运算符将所有内容汇总到:
<< "SE"
<< getAddr().toString()
<< ": WAITING on epoll..."
<< std::endl;
Run Code Online (Sandbox Code Playgroud)
所以我希望有一个成员<<功能看起来像:
void XXXProxy::operator << (std::stringstream& ss)
{
if(mVerbose)
{
std::cout << ss;
ss << "";
}
}
Run Code Online (Sandbox Code Playgroud)
题
我是一个相对新手的C++开发人员,在编写上述类似<<运算符的句子时,会遇到很多编译错误.您能否提出一些建议或指导我一些链接让我正确实现这个<<运算符.谢谢.
对于下面的代码行,我得到以下编译错误,指出错误的模板参数数量.你能告诉我这个宣言有什么问题吗?它看起来不错.ServicePartitionKey的内容在底部给出.
//Line 107 where template arguments issue happens is this declaration line
std::map<ServicePartitionKey key, std::vector<EndPointAddr*>* > mServiceMap;
Run Code Online (Sandbox Code Playgroud)
编译信息:
In file included from ServiceRegistrar.hpp:8:0,
from ServiceRegistrar.cpp:7:
../control_api/ServiceRegistrarAPI.hpp:107:66: error: wrong number of template arguments (1, should be 4)
In file included from /usr/include/c++/4.7/map:61:0,
from ../control_api/ServiceRegistrarAPI.hpp:9,
from ServiceRegistrar.hpp:8,
from ServiceRegistrar.cpp:7:
Run Code Online (Sandbox Code Playgroud)
Class ServicePartitionKey
#include <cstdint>
class ServicePartitionKey
{
public:
ServicePartitionKey() {};
ServicePartitionKey(uint32_t instanceNo, uint64_t version);
~ServicePartitionKey() {};
bool operator < (const ServicePartitionKey &rhs) const;
void setInstanceNo(uint32_t instanceNo) { mInstanceNo = instanceNo; }
uint32_t getInstanceNo() …Run Code Online (Sandbox Code Playgroud) c++ ×6
c++11 ×3
java ×2
postgresql ×2
inheritance ×1
javascript ×1
jdbc ×1
jframe ×1
libpqxx ×1
linker ×1
nonblocking ×1
python ×1
snmp4j ×1
stdvector ×1
swing ×1
thrift ×1
zeromq ×1