Java nio libev,libev实现echo服务器
说明
系统:ubuntu 14.04
安装库
sudo apt-get install libev-dev
可以在/usr/include下找到ev.h。
服务器代码
server.c
#include
#include
#include
#define PORT_NO 3033
#define BUFFER_SIZE 1024
int total_clients = 0; // Total number of connected clients
void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents);
void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents);
int main()
{
struct ev_loop *loop = ev_default_loop(0);
int sd;
struct sockaddr_in addr;
int addr_len = sizeof(addr);
struct ev_io w_accept;
// Create server socket
if( (sd = socket(PF_INET, SOCK_STREAM, 0)) < 0 )
{
perror("socket error");
return -1;
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT_NO);
addr.sin_addr.s_addr = INADDR_ANY;
// Bind socket to address
if (bind(sd, (struct sockaddr*) &addr, sizeof(addr)) != 0)
{
perror("bind error");
}
// Start listing on the socket, backlog is 2
if (listen(sd, 2) < 0)
{
perror("listen error");
return -1;
}
// Initialize and start a watcher to accepts client requests
ev_io_init(&w_accept, accept_cb, sd, EV_READ);
ev_io_start(loop, &w_accept);
// Start infinite loop
while (1)
{
//ev_loop(loop, 0);
ev_run(loop, 0);
}
return 0;
}
/* Accept client requests */
void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
{
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int client_sd;
struct ev_io *w_client = (struct ev_io*) malloc (sizeof(struct ev_io));
if(EV_ERROR & revents)
{
perror("got invalid event");
return;
}
// Accept client request
client_sd = accept(watcher->fd, (struct sockaddr *)&client_addr, &client_len);
if (client_sd < 0)
{
perror("accept error");
return;
}
total_clients ++; // Increment total_clients count
printf("Successfully connected with client.\n");
printf("%d client(s) connected.\n", total_clients);
// Initialize and start watcher to read client requests
ev_io_init(w_client, read_cb, client_sd, EV_READ);
ev_io_start(loop, w_client);
}
/* Read client message */
void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents){
char buffer[BUFFER_SIZE];
ssize_t read;
if(EV_ERROR & revents)
{
perror("got invalid event");
return;
}
// Receive message from client socket
read = recv(watcher->fd, buffer, BUFFER_SIZE, 0);
if(read < 0) // 出现错误
{
perror("read error");
return;
}
if(read == 0) // 有client关闭时
{
// Stop and free watchet if client socket is closing
ev_io_stop(loop,watcher);
free(watcher);
perror("peer might closing");
total_clients --; // Decrement total_clients count
printf("%d client(s) connected.\n", total_clients);
return;
}
else // 有数据到来
{
printf("message:%s\n",buffer);
}
// Send message bach to the client
send(watcher->fd, buffer, read, 0);
bzero(buffer, read);
}
当有客户端连接进来时,会调用accept_cb函数处理。当客户端有数据进来时,会调用read_cb来处理。
客户端代码
client.c
#include
#include
#define PORT_NO 3033
#define BUFFER_SIZE 1024
int main()
{
int sd;
struct sockaddr_in addr;
int addr_len = sizeof(addr);
char buffer[BUFFER_SIZE] = "";
// Create client socket
if( (sd = socket(PF_INET, SOCK_STREAM, 0)) < 0 )
{
perror("socket error");
return -1;
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT_NO);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
// Connect to server socket
if(connect(sd, (struct sockaddr *)&addr, sizeof addr) < 0)
{
perror("Connect error");
return -1;
}
while (strcmp(buffer, "q") != 0)
{
// Read input from user and send message to the server
gets(buffer);
send(sd, buffer, strlen(buffer), 0);
// Receive message from the server
recv(sd, buffer, BUFFER_SIZE, 0);
printf("message: %s\n", buffer);
}
return 0;
}
编译测试
gcc server.c -o server -lev
gcc client.c -o client
可以同时启动多个client。
Java nio libev,libev实现echo服务器相关推荐
- 并发型服务器响应方式,基于Java NIO 开发高性能并发型服务器程序的研究
基于Java NIO 开发高性能并发型服务器程序的研究 第8卷%第5期 软件导刊 2009年5月SoftwareGuide Vol.8No.5May.2009 基于JavaNIO开发高性能并发型服务器 ...
- 基于 Java NIO 实现简单的 HTTP 服务器
1.简介 本文是上一篇文章实践篇,在上一篇文章中,我分析了选择器 Selector 的原理.本篇文章,我们来说说 Selector 的应用,如标题所示,这里我基于 Java NIO 实现了一个简单的 ...
- java nio ssl_java连接MQTT+SSL服务器
java用ssl加密方式连接mqtt服务器.其它ssl加密的也可以参考,SSLSocketFactory获取部分都是一样的.踩了很多坑,根据生成工具不同(openssl和keytool)以及秘钥文件编 ...
- [c语言 ] 用libev 写个echo服务器
放假了.同学都回家了,我是更情愿留久点在学校,一来学校安静,二来免得火车太挤. 这临走前的几天,放下了erlang,写了一下c. 其实只是对比下erlang 写socket服务器,和c写socket ...
- 【java】关于Java NIO的一切
1.概述 概述:关于Java NIO的『一切』 建议看原文 太长了 本文译自Jakob Jenkov的Java NIO.注意,并非逐字翻译,删除了原文中碎碎念的部分,有些地方也加入了自己的理解. Ja ...
- 6.JAVA NIO 字符集
第六章 字符集 我们生活在一个变化莫测的世界中.甚至在这个我们称之为地球的平凡的 M 级行星 上,我们也使用数百种不同的语言.在<The Hitchhikers Guide to the Gal ...
- 海纳百川而来的一篇相当全面的Java NIO教程
目录 零.NIO包 一.Java NIO Channel通道 Channel的实现(Channel Implementations) Channel的基础示例(Basic Channel Exampl ...
- 使用 NIO 实现 echo 服务器
NIO相关知识点 IO.NIO.AIO 内部原理分析 NIO 之 Selector实现原理 NIO 之 Channel实现原理 NIO 之 ByteBuffer实现原理 服务器使用NIO来实现一个ec ...
- Java NIO编写Socket服务器的一个例子
最近一直在忙着JAVA NIO的知识,花了一下午的时间,总算写出了一个可以运行的程序,废话少说,上代码! Java代码: import java.io.IOException; import java ...
- java nio 强制关闭_Java NIO服务器:远程主机强迫关闭了一个现有的连接
Java NIO聊天室 中,若客户端强制关闭,服务器会报"java.io.IOException: 远程主机强迫关闭了一个现有的连接.",并且服务器会在报错后停止运行,错误的意思就 ...
最新文章
- 【腾讯bugly干货分享】微信Android热补丁实践演进之路
- 别再被 Python 洗脑了!!
- 处理字符串_7_判断字符串是字符串数字型
- 在人山人海里,你不必记得我
- 【B/S】HTML总结
- kotlin使用mapstruct(二)
- 中国移动MM的免流量费策略太不靠谱
- 【NLP】自然语言处理技术在自动生成足球比赛战报上的应用
- 三菱FX系列PLC以太网连接组态王软件
- ffi一些常见的错误
- 淘宝客接入PHP(一)
- 简洁的微信Markdown编辑器
- 梳妆台行业调研报告 - 市场现状分析与发展前景预测
- KALI--入门教程--kali下载(vm),更新国内源,更换中文界面
- 前缀和【一维前缀和与二维前缀和】
- AttributeError: builtin_function_or_method object has no attribute mktime
- android widget动画,widget 动画 - androidCode的个人空间 - OSCHINA - 中文开源技术交流社区...
- 解决json_encode中文乱码情况
- 【报告分享】2021百度快消人群洞察-百度营销研究院(附下载)
- Unity 快速检测本机网络链接状态
热门文章
- encodeURI()函数和encodeURIComponent()函数
- 物联网最常见的5个核心关键技术与2种技术难点
- Eclipse java web在show view下没有server选项视图
- 解开人人网登录密码的 RSA 加密--转载
- 中职计算机基础微课,微课在中职“计算机应用基础”课程教学中的应用探讨_优秀论文...
- 改变输出的文字的字体格式
- win8激活及bootMGR is missing问题的解决
- FFmpegVideo DownloadHelper下载网页HLS流视频
- 苹果电脑的CCTV直播软件_我是亲民_新浪博客
- autoit对于web中flash控件的操作