问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何实现servlet接收客户端发来的http请求并返回

发布网友 发布时间:2022-04-13 07:28

我来回答

2个回答

懂视网 时间:2022-04-13 11:49

上篇概括了redis的启动流程,这篇重点介绍redis如何接受客户端请求并调用处理函数来执行命令。 在上一篇里,说到了在initServer()这个函数里边,会调用anetTcpServer和anetUnixServer 这两个函数创建对tcp端口和unix域套接字的监听,那么这里首先重点分析下

上篇概括了redis的启动流程,这篇重点介绍redis如何接受客户端请求并调用处理函数来执行命令。

在上一篇里,美国服务器,说到了在initServer()这个函数里边,会调用anetTcpServer和anetUnixServer 这两个函数创建对tcp端口和unix域套接字的监听,那么这里首先重点分析下这两个函数的具体实现。

int anetTcpServer(char *err, int port, char *bindaddr) { int s; struct sockaddr_in sa; if ((s = anetCreateSocket(err,AF_INET)) == ANET_ERR) return ANET_ERR; memset(&sa,0,sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons(port); sa.sin_addr.s_addr = htonl(INADDR_ANY); if (bindaddr && inet_aton(bindaddr, &sa.sin_addr) == 0) { anetSetError(err, ); close(s); return ANET_ERR; } if (anetListen(err,s,(struct sockaddr*)&sa,sizeof(sa)) == ANET_ERR) return ANET_ERR; return s; }

从代码中我们可以看出,首先调用anetCreateSocket()创建一个套接字并复值给s, 然后对sa 这个sockaddr_in类型的结构体进行初始化, 设置要监听的端口,地址,和地址族, 再调用anetListen() 函数绑定地址并监听端口,这些工作完成后 anetCreateSocket函数返回,网站空间,并将创建的套接字复制给server.ipfd。注意在anetUnixServer()这个函数中完成的工 作类似于anetCreateSocket,只不过是绑定的unix socket。

接下来, 在initServer函数里, 调用了这个函数:aeCreateFileEvent, 这里重点分析第一个,第二个类似。

if (server.ipfd > 0 && aeCreateFileEvent(server.el,server.ipfd,AE_READABLE, acceptTcpHandler,NULL) == AE_ERR) oom(); if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE, acceptUnixHandler,NULL) == AE_ERR) oom();

首先,从eventLoop的event这个aeFileEvent数组里,取出当前fd对应的acFileEvent,主要是为了在下边给它设置对应事件的处理函数;即根据传入的mask来判断是哪一类事件。

int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask, aeFileProc *proc, void *clientData) { if (fd >= AE_SETSIZE) return AE_ERR; aeFileEvent *fe = &eventLoop->events[fd]; if (aeApiAddEvent(eventLoop, fd, mask) == -1) return AE_ERR; fe->mask |= mask; if (mask & AE_READABLE) fe->rfileProc = proc; if (mask & AE_WRITABLE) fe->wfileProc = proc; fe->clientData = clientData; if (fd > eventLoop->maxfd) eventLoop->maxfd = fd; return AE_OK; }

然后调用 acApiEvent这个事件注册函数:

static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) { aeApiState *state = eventLoop->apidata; struct epoll_event ee; /* If the fd was already monitored for some event, we need a MOD * operation. Otherwise we need an ADD operation. */ int op = eventLoop->events[fd].mask == AE_NONE ? EPOLL_CTL_ADD : EPOLL_CTL_MOD; ee.events = 0; mask |= eventLoop->events[fd].mask; (mask & AE_READABLE) ee.events |= EPOLLIN; if (mask & AE_WRITABLE) ee.events |= EPOLLOUT; ee.data.u64 = ee.data.fd = fd; if (epoll_ctl(state->epfd,op,fd,&ee) == -1) return -1; return 0; }

可以看到, 这个函数中,主要是调用epoll_ctl(state->epfd,op,fd,&ee)将当前fd设置到及其所关心的事件注册到epoll_create 返回的epoll的句柄里。由于我们这里注册的是AE_READABLE事件,所以当这个fd(即redis监听端口的套接字)有数据可读时(这里我理解的是客户端连接到达),网站空间,就会触发相应的事件处理函数,这里的事件处理函数便是acceptTcpHandler。


下面我们看看acceptTcpHandler这个函数:

这个函数里边首先调用 anetTcpAccept获取客户端与redis连接的socket fd(实际调用 ::accept(s,sa,len)函数返回的fd), 然后调用 acceptCommonHandler()函数,这个函数中调用 createClient()创建 redisClient *c实例, 如果当前redis服务器的连接总数没有超过最大值,则将全局变量server中记录连接数的stat_numconnections加1;如果超过了, 则想客户端输出错误信息,并释放redisClient实例,函数返回。

void acceptTcpHandler(aeEventLoop *el, int fd, void *privdata, int mask) { int cport, cfd; char cip[128]; REDIS_NOTUSED(el); REDIS_NOTUSED(mask); REDIS_NOTUSED(privdata); cfd = anetTcpAccept(server.neterr, fd, cip, &cport); if (cfd == AE_ERR) { redisLog(REDIS_WARNING,, server.neterr); return; } redisLog(REDIS_VERBOSE,, cip, cport); acceptCommonHandler(cfd); }

下面分析createClient这个函数:

redisClient *createClient(int fd) { redisClient *c = zmalloc(sizeof(redisClient)); c->bufpos = 0; anetNonBlock(NULL,fd); anetTcpNoDelay(NULL,fd); if (aeCreateFileEvent(server.el,fd,AE_READABLE, readQueryFromClient, c) == AE_ERR) { close(fd); zfree(c); return NULL; } selectDb(c,0); c->fd = fd; c->querybuf = sdsempty(); c->reqtype = 0; c->argc = 0; c->argv = NULL; c->cmd = c->lastcmd = NULL; c->multibulklen = 0; c->bulklen = -1; c->sentlen = 0; c->flags = 0; c->lastinteraction = time(NULL); c->authenticated = 0; c->replstate = REDIS_REPL_NONE; c->slave_listening_port = 0; c->reply = listCreate(); c->reply_bytes = 0; listSetFreeMethod(c->reply,decrRefCount); listSetDupMethod(c->reply,dupClientReplyValue); c->bpop.keys = NULL; c->bpop.count = 0; c->bpop.timeout = 0; c->bpop.target = NULL; c->io_keys = listCreate(); c->watched_keys = listCreate(); listSetFreeMethod(c->io_keys,decrRefCount); c->pubsub_channels = dictCreate(&setDictType,NULL); c->pubsub_patterns = listCreate(); listSetFreeMethod(c->pubsub_patterns,decrRefCount); listSetMatchMethod(c->pubsub_patterns,listMatchObjects); listAddNodeTail(server.clients,c); initClientMultiState(c); return c; }

热心网友 时间:2022-04-13 08:57

在servlet中通过request获取请求参数,通过response.getWriter().write("返回信息")返回
楼主,有个东东叫httpclient,是apache的一个子项目,传送门:,下面是示例:
HttpClient client = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
List<NameValuePair> params = new ArrayList();
UrlEncodedFormEntity requestEntity;
requestEntity = new UrlEncodedFormEntity(params, "UTF-8");
(requestEntity);
HttpResponse response = client.execute(httppost);
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){}
client.getConnectionManager().shutdown();
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
北京协和售后 spcp代收费是什么 Doppelherz/双心 铁元营养口服液 500ml-详细介绍 淘宝阿尔卑斯店的德国铁元怎么样? 后面的肩膀缝疼因为什么 刮痧后一躺下肩膀疼的要命 “亭台六七座”的出处是哪里 mahini 是什么意思? 外阴溃烂了怎么办 外阴溃疡,溃疡处伤口不愈合,可以用什么药 有哪位大神有粉色的樱桃小丸子的壁纸 上面有九个小丸子的那个 求樱桃小丸子壁纸 求樱桃小丸子高清壁纸 有那些关于樱桃小丸子的壁纸 有哪些适合学生党的卖衣服的? 蜜贴医用修复面膜效果怎么样? 我剖腹产第5天出院了刀口一点都不疼,一个礼拜拆线第二天刀口就愈合了算恢复的快吗? 剖腹产伤口什么时候可以拆线?应该如何护理? 剖腹产后,做了这些事会危及你的生命,你知道吗? 剖腹产住院几天能出院,出院后要注意什么? 老婆要剖宫产,应该注意什么问题呀?急急!!! 孕妇选择剖宫产,术后需要注意哪些问题? 剖腹产拆线疼吗,拆线后要注意些什么呢? 剖腹产拆线后怎么护理?是不是要定期给伤口消毒?还需要做别的什么呢? 我在微信公众账号卖衣服账号名怎么起 小天鹅洗衣机的微信公众号 衣服洗涤标准一个圆圈然后里面一条波浪外面一个差号是是什么意思啊 有哪些适合学生党的卖衣服的? 小天鹅微信公众号 干洗店申请微信公众号是要哪种的 求原图 小丸子的 小丸子图片 谁有后面这个电脑桌面樱桃小丸子壁纸1080p的。 求高清图 壁纸 求‘樱桃小丸子带蝴蝶结笑脸”的手机壁纸,背景也是密密麻麻她的笑脸,是西瓜红色的底色。 有没有什么好用的蓝牙适配器可以用于ps5 pc Switch的? USB蓝牙适配器4.0 CSR电脑蓝牙接收器音频发射器 可以连接无线键盘和鼠标吗? 得了痛风平时要如何注意饮食? 患有痛风的人,日常生活中饮食方面怎么注意呢? 痛风病人在饮食上有哪些需要注意的? 上海装什么宽带比较好 梦见别人到自己家送钱给父亲 梦见捡钱都都给父亲了 电子商务商品部工作 广州哥弟电商中心怎么样,在里面工作或者了解的人能说下吗 下载格力空调万能遥控器 电商团队该做什么? 电商产品上架流程 图中的: 摘要 跨行代付 交易地点/附言 渤海银行(HXT)T0 是什么意思 银行代付补助是什么意思