- 浏览: 152734 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lanhaitun1991:
亲,其实你这里介绍的方法有一个最大的问题:如果放入队列之后,但 ...
分布式事务 -
lp385267935:
不错 很好用~3Q
jsonlib json-->object,忽略object中没有的属性 -
xiebo1983:
http://www.sqkoo.com/show/detai ...
mysql latin1乱码 -
envy2002:
当然可以了,tomcat中源码你可以看看,只要“欺骗”过去to ...
tomcat中的长连接 -
newSaa:
问一下,可以在 tomcat 建立tcp 长连接吗?
tomcat中的长连接
把上个版本一对一的聊天室,修改了一下,使其能进行一(server)对多(client)的聊天。
直接上源码:
/* provide the function to log. input: environment varibles, (1) LEVEL=DEBUG||WARNING||ERROE (2)LOGPATH(the log file saving path) output: different level log file */ #ifndef _LOG_H_ #define _LOG_H_ #include <stdlib.h> #include <string.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <time.h> //define the debug level #define DEBUG 5 #define WARNNING 4 #define ERROR 3 #define WORKKING 1 //if return 0,means ok, !=0, means not ok. int mylog(char * optional_msg,char * msg, int level); #endif
#include "log.h"
int mylog(char * optional_msg,char * msg, int level) { char * pc_level=getenv("LEVEL"); char * pc_path =getenv("LOGPATH"); //configure debug level if(pc_level==NULL) { pc_level="WORKKING"; } //printf("current level is %s\n",pc_level); //configure path char path[256]; if(pc_path==NULL) { getcwd(path, sizeof(path)); //printf("current path is %s\n",path); pc_path=path; } //printf("configured path is %s\n",pc_path); int int_src=0; char *pc_preLog; if(strcmp(pc_level,"DEBUG")==0) { int_src=5; pc_preLog="[DEBUG] "; } if(strcmp(pc_level,"WARNNING")==0) { int_src=4; pc_preLog="[WARNNING] "; } if(strcmp(pc_level,"ERROR")==0) { int_src=3; pc_preLog="[ERROR] "; } if(strcmp(pc_level,"WORKKING")==0) { int_src=1; pc_preLog="[WORKKING] "; } //create a file to write log. char target_path[400]; strcpy(target_path,pc_path); strcat(target_path,"/log.txt"); //printf("target path is %s\n",target_path); if(int_src>=level) { int fileid=open(target_path,O_WRONLY|O_APPEND|O_CREAT,0); if(fileid<0) { printf("create log file failed!\n"); exit(0); } write(fileid,optional_msg,strlen(optional_msg)); write(fileid,pc_preLog,strlen(pc_preLog)); write(fileid,msg,strlen(msg)); //set time time_t timep; time (&timep); write(fileid," ----",strlen(" ----")); write(fileid,ctime(&timep),strlen(ctime(&timep))); write(fileid," \n",strlen(" \n")); close(fileid); } return 0; }
#ifndef _LIST_H_ #define _LIST_H_ #include <stdlib.h> #include <stdio.h> #include <string.h> struct List { int *p_buffer; int *p_begin; int *p_end; int *p_cursor; }; // you must add struct, otherwise it will prompt "expected ‘)’ before ‘*’ token" void init(struct List * p_list); int get_buffer_length (struct List * p_list); int put_into_buffer(struct List* p_list,int p_number); void delete_from_buffer(struct List* p_list, int p_number); #endif
#include "List.h" void init(struct List * p_list) { int *p_temp=malloc(10*sizeof(10)); p_list->p_buffer=p_temp; p_list->p_begin=p_temp; p_list->p_end=p_list->p_begin+9; p_list->p_cursor=p_list->p_begin; } int get_buffer_length (struct List * p_list) { return p_list->p_cursor-p_list->p_begin; } // return 0:OK,1:false int put_into_buffer(struct List * p_list,int p_number) { printf("before put "); int m=0; for(;m<10;m++) { int shuzi=*(p_list->p_begin+m); printf("%d ",shuzi); } printf("\n"); if(p_list->p_cursor>p_list->p_end) { printf("buffer is full, put into buffer error\n"); return 1; } *p_list->p_cursor=p_number; p_list->p_cursor++; printf("after put "); int n=0; for(;n<10;n++) { int shuzi=*(p_list->p_begin+n); printf("%d ",shuzi); } printf("\n"); return 0; } void delete_from_buffer(struct List* p_list, int p_number) { printf("before delete "); int m=0; for(;m<10;m++) { int shuzi=*(p_list->p_begin+m); printf("%d ",shuzi); } printf("\n"); int length=get_buffer_length(p_list); printf("length is %d\n",length); int i=0; int * biao; for(;i<length;i++) { if(*(p_list->p_begin+i)==p_number) { biao=p_list->p_begin+i; break; } } printf("i is %d\n",i); if(i<length) { bcopy(biao+1,biao,sizeof(int)*(length-(i+1))); memset(p_list->p_begin+(length-1),'\0',sizeof(int)*1); p_list->p_cursor--; } printf("after delete "); int n=0; for(;n<10;n++) { int shuzi=*(p_list->p_begin+n); printf("%d ",shuzi); } printf("\n"); }
#include "log.h"
#include "List.h" #include <stdio.h> #include <sys/socket.h> #include <unistd.h> #include <sys/types.h> #include <netinet/in.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> #include <signal.h> #define BUFFER_SIZE 256 //gloable variables struct List list; void * receiveMsg(void * args) { int *p_client_socket_id=(int *)args; int client_socket_id=*p_client_socket_id; while(1) { char buffer[BUFFER_SIZE]={0}; mylog("[Server] ","before receive.....",DEBUG); int recv_length=recv(client_socket_id,buffer,BUFFER_SIZE,0); mylog("[Server] ","after receive.....",DEBUG); if (recv_length <= 0) { mylog("[Server] ","error comes when recieve data from server!",DEBUG); delete_from_buffer(&list,client_socket_id); if(get_buffer_length(&list)==0) exit(0); break; } printf("from server:%s\n",buffer); } return NULL; } void closeSocket() { mylog("[Server] "," positively close connection socket",DEBUG); int i=0; for(;i<get_buffer_length(&list);i++) { int socketid=list.p_buffer[i]; close(socketid); } free(list.p_buffer); exit(0); } void *sendMsg(void *arg) { while(1) { char msg[BUFFER_SIZE]; //scanf("%[^n]",msg); fgets(msg,BUFFER_SIZE,stdin); int i=0; for(;i<get_buffer_length(&list);i++) { int target_socket_id=*(list.p_begin+i); int length_send=send(target_socket_id,msg,BUFFER_SIZE,0); //printf("send msg length is %d\n",length_send); if(length_send<0) printf("send worry\n"); } } } int main(int argc, char ** argv) { init(&list); //setup the sigint signal(SIGINT,closeSocket); struct sockaddr_in server_addr,client_addr; int size_of_addr=sizeof(server_addr); //printf("size of addr is %d\n",size_of_addr); //init server_addr; bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(9999); server_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); char * pc; pc=inet_ntoa(server_addr.sin_addr); //printf("server11 ip is %s\n",pc); int socketid=0; //create socket file mylog("[Server] ","before create socket......",DEBUG); if((socketid=socket(AF_INET,SOCK_STREAM,0))<0) mylog("[Server] ","create socket error",DEBUG); mylog("[Server] ","after create socket......",DEBUG); //bind if(bind(socketid,(struct sockaddr*)&server_addr,size_of_addr)<0) mylog("[Server] ","bind server address error",DEBUG); //listen mylog("[Server] ","before listen......",DEBUG); if(listen(socketid,10)<0) mylog("[Server] ","listen error",DEBUG); mylog("[Server] ","after listen......",DEBUG); socklen_t client_length=sizeof(client_addr); mylog("[Server] ","before accept......",DEBUG); while(1) { int client_socket_id=accept(socketid,(struct sockaddr*)&client_addr,&client_length); mylog("[Server] ","after accept......",DEBUG); if(client_socket_id<0) mylog("[Server] "," client socket file id is negetive, worry",DEBUG); //set receive thead pthread_t pthread_id; pthread_id=pthread_create(&pthread_id,NULL, receiveMsg,(void *)&client_socket_id); char *pcwelcome="welcome\n"; int length_string=strlen(pcwelcome); send(client_socket_id,pcwelcome,length_string,0); put_into_buffer(&list,client_socket_id); //set send thread pthread_t send_thread_id; send_thread_id=pthread_create(&send_thread_id,NULL, sendMsg,NULL); } while(1) { char msg[BUFFER_SIZE]; //scanf("%[^n]",msg); fgets(msg,BUFFER_SIZE,stdin); int i=0; for(;i<get_buffer_length(&list);i++) { int target_socket_id=*(list.p_begin+i); int length_send=send(target_socket_id,msg,BUFFER_SIZE,0); //printf("send msg length is %d\n",length_send); if(length_send<0) printf("send worry\n"); } } //close(client_socket_id); return 0; }
#include <stdio.h>
#include <sys/socket.h> #include <unistd.h> #include <sys/types.h> #include <netinet/in.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> #include <signal.h> #include "log.h" #define BUFFER_SIZE 256 int socketid=0; int client_result=0; void * receiveMsg(void * args) { while(1) { if(client_result<0) { mylog("[Client] ","no connection",DEBUG); exit(0); } char buffer[BUFFER_SIZE]={0}; mylog("[Client] ","before receive.....",DEBUG); int recv_length=recv(socketid,buffer,BUFFER_SIZE,0); mylog("[Client] ","after receive.....",DEBUG); if (recv_length <= 0) { mylog("[Client] ","error comes when recieve data from server!",DEBUG); exit(0); } printf("from server:%s\n",buffer); } } void closeSocket() { printf(" positively close connection socket\n"); close(socketid); exit(0); } int main(int argc, char ** argv) { //setup the sigint signal(SIGINT,closeSocket); struct sockaddr_in server_addr,client_addr; int size_of_addr=sizeof(server_addr); //printf("size of addr is %d\n",size_of_addr); //init server_addr; bzero(&server_addr,sizeof(client_addr)); client_addr.sin_family=AF_INET; //char* pc_port=argv[1]; //printf("argv[1] %s\n",pc_port); //int int_port=atoi(pc_port); //printf("int_port %d\n",int_port); client_addr.sin_port=htons(9998); client_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); char * pc; pc=inet_ntoa(client_addr.sin_addr); //printf("server ip is %s\n",pc); //create socket file if((socketid=socket(AF_INET,SOCK_STREAM,0))<0) mylog("[Client] ","create socket error",DEBUG); //bind if(bind(socketid,(struct sockaddr*)&client_addr,size_of_addr)<0) { mylog("[Client] ","bind server address error",DEBUG); exit(0); } server_addr.sin_family=AF_INET; server_addr.sin_port=htons(9999); server_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); socklen_t server_length=sizeof(server_addr); client_result=connect(socketid,(struct sockaddr*)&server_addr,server_length); if(client_result<0) printf("connect failed\n"); //set receive thead pthread_t pthread_id; pthread_id=pthread_create(&pthread_id,NULL, receiveMsg,NULL); while(1) { char msg[BUFFER_SIZE]={0}; fgets(msg,BUFFER_SIZE,stdin); int messageLength=strlen(msg); //printf("message Length is %d\n",messageLength); int length_send=send(socketid,msg,messageLength,0); //printf("send msg length is %d\n",length_send); if(length_send<0) mylog("[Client] ","send worry",DEBUG); } close(socketid); return 0; }
#include <stdio.h>
#include <sys/socket.h> #include <unistd.h> #include <sys/types.h> #include <netinet/in.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> #include <signal.h> #include "log.h" #define BUFFER_SIZE 256 int socketid=0; int client_result=0; void * receiveMsg(void * args) { while(1) { if(client_result<0) { mylog("[Client] ","no connection",DEBUG); exit(0); } char buffer[BUFFER_SIZE]={0}; mylog("[Client] ","before receive.....",DEBUG); int recv_length=recv(socketid,buffer,BUFFER_SIZE,0); mylog("[Client] ","after receive.....",DEBUG); if (recv_length <= 0) { mylog("[Client] ","error comes when recieve data from server!",DEBUG); exit(0); } printf("from server:%s\n",buffer); } } void closeSocket() { printf(" positively close connection socket\n"); close(socketid); exit(0); } int main(int argc, char ** argv) { //setup the sigint signal(SIGINT,closeSocket); struct sockaddr_in server_addr,client_addr; int size_of_addr=sizeof(server_addr); //printf("size of addr is %d\n",size_of_addr); //init server_addr; bzero(&server_addr,sizeof(client_addr)); client_addr.sin_family=AF_INET; //char* pc_port=argv[1]; //printf("argv[1] %s\n",pc_port); //int int_port=atoi(pc_port); //printf("int_port %d\n",int_port); client_addr.sin_port=htons(9997); client_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); char * pc; pc=inet_ntoa(client_addr.sin_addr); //printf("server ip is %s\n",pc); //create socket file if((socketid=socket(AF_INET,SOCK_STREAM,0))<0) mylog("[Client] ","create socket error",DEBUG); //bind if(bind(socketid,(struct sockaddr*)&client_addr,size_of_addr)<0) { mylog("[Client] ","bind server address error",DEBUG); exit(0); } server_addr.sin_family=AF_INET; server_addr.sin_port=htons(9999); server_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); socklen_t server_length=sizeof(server_addr); client_result=connect(socketid,(struct sockaddr*)&server_addr,server_length); if(client_result<0) printf("connect failed\n"); //set receive thead pthread_t pthread_id; pthread_id=pthread_create(&pthread_id,NULL, receiveMsg,NULL); while(1) { char msg[BUFFER_SIZE]={0}; fgets(msg,BUFFER_SIZE,stdin); int messageLength=strlen(msg); //printf("message Length is %d\n",messageLength); int length_send=send(socketid,msg,messageLength,0); //printf("send msg length is %d\n",length_send); if(length_send<0) mylog("[Client] ","send worry",DEBUG); } close(socketid); return 0; }
其中client.c和client2.c就是bind的端口不同而已,因为前期设计有问题,所以就用这个蠢办法来验证,这不是一个好的设计和实现。
发表评论
-
tomcat停止
2012-04-18 12:50 0#!/bin/sh #kill tomcat pid ... -
ubuntu 装mysql
2012-04-12 13:37 766最近项目好急,没时间整理,特做以下记录 去mysql网 ... -
red hat 安装svn
2012-03-23 16:34 1332素材: httpd-2.2.22.tar subve ... -
linux 当前shell指定java版本
2012-02-16 09:41 2911装了red hat 5.4,系统默认自带了Java 1.4, ... -
U盘安装red hat.
2012-02-09 10:50 1039没有DVD光盘和DVD光驱,悲剧啊,还好,网上有工具。 ... -
linux 下samba使用简介
2011-12-06 16:46 1111今天装了一台真正的linux主机(red hat),呵呵。安装 ... -
Shell学习
2011-11-30 17:32 754类unix操作系统中有b shell, k shell, c ... -
gdb调试linux0.11内核。
2011-11-26 16:13 15881. 下载bochs源码,配置,编译。 ./con ... -
red hat的远程桌面 xmanager
2011-11-04 14:49 3030用virtualbox装好red hat之后,我们可 ... -
virtual box中安装red hat并实现 ftp功能
2011-11-03 15:49 1741由于在公司上网,公司有个防火墙,安装虚拟主机需要虚 ... -
bochs调试linux 0.11内核
2011-07-01 15:24 6775学习操作系统,最难的就是 ... -
关于linux程序在内存中的分布管理
2011-05-27 10:54 1708这段时间,一直在看汇编,想学习一下li ... -
solaris mount细节
2011-04-11 14:33 10041. 首先确保 nfs server ... -
linux file open的实质
2011-03-30 17:36 2077linux open file的时候到底做了什么呢 ... -
linux-gcc 编译时头文件和库文件搜索路径(转)
2011-03-11 11:16 1715一、头文件 gcc 在编译时寻找所需要的头文件 : ※ ... -
linux extern关键字的作用2
2011-03-09 17:13 1498extern int O_RDONLY; #includ ... -
GCC 参数详解(转载)
2011-03-01 10:29 1137gcc and g++分别是gnu的c &am ... -
linux extern关键字的作用
2011-02-25 17:28 2934extern 的作用是起到一个 ... -
linux 可执行文件依赖库查看
2011-02-25 12:24 5672在多线程编程中,我们用gcc -Wall -g ... -
c语言编译全过程(转)
2011-02-25 10:46 1218C语言编译全 ...
相关推荐
总结来说,构建Linux下的聊天室涉及TCP套接字编程、多线程处理、I/O多路复用、网络通信协议理解以及编程技巧等多个方面,这些知识点是网络编程和系统级开发的基础,对理解互联网服务的运行机制至关重要。
本项目以C++语言在Linux环境下实现了一个多线程聊天室,利用了Linux系统强大的多线程支持和C++的高效编程能力。下面我们将详细探讨这一实现过程中的关键知识点。 首先,我们要理解多线程的概念。在单线程程序中,...
本项目名为"Linux多人聊天室",显然旨在创建一个基于Linux系统的多人在线交流平台。这个平台可能是一个命令行界面的应用,或者是通过Web浏览器访问的交互式聊天系统。下面将详细探讨实现这样一个聊天室涉及的关键...
本项目"Linux下的socket聊天室程序"就是基于Socket编程实现的一个简单多用户交互平台。这个程序可以支持多个客户端同时连接到同一服务器,进行实时的文本聊天。 1. **Socket基础**:Socket是网络通信的基本单元,它...
在Linux环境下,构建一个简单的聊天室是一个典型的网络编程任务,主要涉及到UDP(User Datagram Protocol)协议的应用。UDP是一种无连接的、不可靠的传输层协议,适合于对实时性要求较高但对数据完整性要求不那么...
【Linux网络聊天室】是一个基于TCP网络通讯协议的命令行聊天工具,专为Linux系统设计。这个项目展示了网络编程的基本原理和C语言的应用,同时也涵盖了多用户交互与管理功能。 首先,TCP(传输控制协议)是互联网...
在这个聊天室中,服务器创建一个UDP socket,监听特定端口,等待来自多个客户端的数据包。 4. **服务器端实现**:服务器端程序负责处理上线、下线提醒,以及群广播消息。当收到一个客户端的请求时,服务器不仅会回...
在IT领域,开发一款基于Linux系统的多人聊天室是一项常见的挑战,这通常涉及到网络编程、多线程技术以及Java语言的应用。本项目名为“基于Linux系统用Java写的多人聊天室”,它不仅实现了基本的聊天功能,还包含了...
在本文中,我们将深入探讨如何使用UDP(用户数据报协议)在Linux环境下构建一个多人聊天室程序。UDP是一种无连接的、不可靠的传输层协议,适用于需要快速发送数据但可以容忍丢失或乱序到达的场景,如在线游戏、视频...
这个"linux下的简单聊天室源代码(c语言实现)"为初学者提供了一个基础的平台,了解如何在Linux上创建一个简单的多用户聊天应用。下面将详细阐述相关知识点。 1. **套接字(Sockets)编程**: 套接字是网络通信的...
在Linux环境中,使用C语言开发一个局域网内的多线程聊天室是一项具有挑战性的任务。这个项目涉及到多个关键知识点,主要包括对C语言的基础理解、Linux系统编程、网络编程以及多线程编程,特别是pthread库的使用。...
【基于Linux网络聊天室】是一个实现在线交流的平台,它具备了多种功能,旨在提供一个高效、便捷的沟通环境。这个聊天室系统充分利用了Linux操作系统的优势,为用户提供了一个安全、稳定的基础架构。以下是对该系统...
本聊天室源码是基于Linux环境利用QT库实现的一个网络通信项目,主要涉及的知识点包括: 1. **QT库介绍**:QT库提供了丰富的图形用户界面(GUI)组件,如按钮、文本框、列表视图等,同时也包含了网络编程、多线程、...
### 基于Linux网络聊天室的关键知识点 #### 一、背景 ...通过以上内容,我们可以看到基于Linux的网络聊天室项目涉及了多个方面的知识和技术,不仅有助于提升编程能力,还能够促进对网络通信机制的理解。
本项目聚焦于在嵌入式系统上实现一个基于Linux的网络聊天室,这不仅展示了Linux的灵活性和可移植性,还体现了嵌入式系统的高效与便携特性。以下将详细介绍该设计的关键知识点。 一、嵌入式Linux系统 嵌入式Linux是...
Linux聊天室基于TCP协议实现多并发模型,这是一个典型的网络编程问题,涉及到客户端与服务器之间的连接建立、数据传输以及高并发处理。本文将深入探讨TCP协议、多并发模型以及如何在Linux环境中使用select函数来构建...
【Linux聊天室项目含说明文档】是一个非常适合初学者和进阶者深入了解Linux系统编程和网络通信的实践项目。该项目旨在创建一个基本的在线聊天室,允许用户进行账号注册、登录,并进行实时聊天。通过这个项目,你可以...
在本文中,我们将深入探讨如何在Linux环境下使用UDP(用户数据报协议)构建一个简单的聊天室程序。UDP是一种无连接的传输层协议,它不保证数据包的顺序、可靠性和完整性,但因其低延迟和高效性,常用于实时通信如...
总之,"Linux 网络聊天室"是一个结合了UDP网络编程、多进程处理和C/S架构的实践项目,对深入理解网络通信和系统编程有很好的学习价值。通过分析和实现这个项目,开发者可以提升自己的Linux技能和网络编程能力。
在 Linux 系统下设计的聊天室系统设计,需要 4 个关键技术:C/S 架构、TCP 协议、多线程操作、Socket 套接字。 C/S 架构,即客户机与服务器架构,该架构有多个客户端和一个服务器,每一个客户端发出请求给服务器,...