文档库

最新最全的文档下载
当前位置:文档库 > 网络聊天程序设计(Linux版)

网络聊天程序设计(Linux版)

江西理工大学应用科学学院

嵌入式系统开发技术

课程设计

专业:电子信息工程

班级:电信131班

学号:08070113109 08070113118

姓名:张越陈成

设计题目:网络聊天程序的设计

2016年11月

课程设计评分表

网络聊天程序设计(Linux版)

目录

1. 系统概述 (1)

2. 需求分析 (2)

2.1 功能需求 (2)

2.2 性能需求 (2)

2.3运行环境要求 (2)

3. 系统设计 (3)

3.1 系统总体流程图 (3)

4. 调试及测试 (3)

4.1调试结果 (3)

4.2 调试结果分析 (5)

5. 设计总结 (6)

6.参考文献 (6)

附录 (7)

江西理工大学课程设计

1. 系统概述

Linux是一种针对PC计算机和工作站得操作系统。他具有像Windows和Mac那样的功能齐全的图形用户界面。由于Linux的开源的特点,越来越多的人转而使用Linux作为PC机得操作系统。

网络聊天程序是目前应用极为广泛的一种网络软件,对于方便人们的交流沟通非常有效,同时,作为一种典型的网络应用,编写网络聊天程序是学习基于Linux的网络编程的有效方法。

本次课题设计是在使用Linux线程和Socket接口的基础上,编写网络聊天程序,从而掌握Linux应用程序开发的基本方法,练习Linux线程及Socket编程的方法,从而将所学知识融会贯通。

2. 需求分析

2.1 功能需求

本次课程设计需要完成以下功能:

(1)实现在服务器的控制下,完成多人聊天,采用单机多终端模拟方式。

(2)在服务器端,使用多线程机制,为多个用户服务。

(3)服务器能够对要求接入的客户端进行身份识别,完成聊天数据的转发,并能够将不同用户聊天记录存档。

2.2 性能需求

(1)可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。

(2)模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。

(3)宜操作性,程序简单易懂,容易上手使用。

2.3运行环境要求

本项目开发主要完成软件开发可在Linux和windows平台下开发

3. 系统设计3.1 系统总体流程图

网络聊天程序设计(Linux版)

图1 系统设计流程图

4. 调试及测试

4.1调试结果

1,启动SSH Secure Shell软件后,将程序进行编译:

网络聊天程序设计(Linux版)

图6 编译程序

,2,编译成功后,将服务器打开:

网络聊天程序设计(Linux版)

网络聊天程序设计(Linux版)

图7 打开服务器

3,打开服务器以后,需输入用户名称,即可进入聊天室进行聊天:

网络聊天程序设计(Linux版)

图8 准备进行聊天

4,用户进行聊天:

网络聊天程序设计(Linux版)

图9 用户聊天界面a

网络聊天程序设计(Linux版)

图10 用户聊天界面b

4.2 调试结果分析

这是一个聊天室程序,可以实现群聊的功能,即当某个客户发出消息后,服务器和其他个客户端都能收到此消息。且能够显示客户端的用户名。但客户端退出聊天室后,服务器和其他在线客户端会有提示。

实现群聊的机制是:当某个客户端需要发送消息是,它将此消息发送给服务器,服务器再将此消息转发给各客户端,各客户端之间是无连接的,即相互之间不能直接通信。因此,在服务器中,有两个线程,主线程用来监听是否有客户端登录服务器,若有,建立与其连接的套接字,并存入在线客户序列里,辅助线程是接收转发线程,其依次读取个客户端,看是否有消息送达,若有,取出,并转发给各其他客户端。在客户端也有两个线程,

主线程用来向服务器发送消息,辅助线程用来接收服务器发出的消息。

5. 设计总结

转眼间为期一周的嵌入式系统开发课程设计转眼就结束了,这次课程设计,我学会了许多课本上学不到的东西,同时也加强了我的动手、思考和解决问题的能力以及学会了相互帮助,相互团结的团队精神,受益匪浅。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

感谢谢老师的悉心教导和认真帮助,在我们遇到各种困难时给予我们最深刻的指导,让我们能够较顺利的完成此次课程设计。

本次课程设计有张越,陈成集体完成。

6.参考文献

[1] Bruce Molay. Unix/Linux编程实践教程. 北京:清华大学出版社,2011

[2] 金钟夫,杜刚.浅析socket网络编程[J]. 微计算机信息,2002,3-2,87-89

[3] 张饶学,Linux网络编程[M].北京:清华大学出版社,2000

[4] 赵敏哲,64位Linux操作系统与应用实例[M]. 北京:机械工业出版社,2001

[5] 华清远见嵌入式培训中心编著《嵌入式Linux应用程序开发》(第二版)人民邮电出版社 2011年7月

[6] 谢小云编著《嵌入式系统综合项目》江西理工大学应用科学学院出版社,2011年

[7] 王天苗,魏洪兴编著《嵌入式系统设计与实例开发》(第三看版)清华大学出版社,2007年

附录

/******* 客户端程序client.c ************/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define TRUE 1

#define PORT 5000

static int sockfd;

void recvfromserver( ) //接受服务器消息线程入口函数

{ char mes[1024];

int nbytes=0;

while(1)

{memset(mes,0,sizeof(mes));

nbytes=read(sockfd,mes,sizeof(mes));

if(nbytes>0)

{ mes[nbytes]='\0';

printf("%s\n",mes);

}

}

pthread_exit(NULL);

}

int main(int argc, char *argv[])

{

char buffer[1024];

struct sockaddr_in server_addr;

struct hostent *host;

int portnumber,nbytes;

char strhost[16];

char clientname[20];

char mes[1024];

int thr_id; /* thread ID for the newly created thread */

pthread_t p_thread; /* thread's structure */ if(argc!=1)

{ fprintf(stderr,"Usage:%s \a\n",argv[0]);

exit(1);

}

Printf ("请输入服务器ip地址\n");

scanf("%s",strhost);

if((host=gethostbyname(strhost))==NULL)

{ fprintf(stderr,"Gethostname error\n");

exit(1);

} /* 客户程序开始建立sockfd 描述符*/

printf ("正在建立套接口...\n");

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

{ fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));

exit(1);

} /* 客户程序填充服务端的资料*/

bzero(&server_addr,sizeof(server_addr));

server_addr.sin_family=AF_INET;

server_addr.sin_port=htons(PORT);

server_addr.sin_addr=*((struct in_addr *)host->h_addr);

printf ("套接口创建成功,正在链接服务器...\n"); /* 客户程序发起连接请求*/ if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)

{ fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));

exit(1);

} /* 连接成功了*/

Printf ("链接服务器成功\n欢迎来到聊天室\n");

Printf ("请输入你的用户昵称\n");

scanf("%s",clientname);

Printf ("\n\n开始聊天吧(\"Quit\"断开连接)\n\n");

thr_id = pthread_create(&p_thread, NULL,(void*) recvfromserver, NULL);

while(1)

{ memset(buffer,0,sizeof(buffer));

memset(mes,0,sizeof(mes));

scanf("%s",buffer);

strcat(mes,clientname);

strcat(mes,":");

strcat(mes,buffer);

if((write(sockfd,mes,sizeof(mes)))==-1)

{ fprintf(stderr,"Write Error:%s\n",strerror(errno));

exit(1);

}

if(strcmp(buffer,"Quit")==0)

{ break;

}

} /* 结束通讯*/

close(sockfd);

exit(0);

}

/******* 服务器程序(server.c) ************/

#include

#include

#include

#include

#include

#include

#incliude

#include

#include

#include

#define MAXLINE 1000 //在一条消息中最大的输出字符数

#define LISTENQ 20 //最大监听队列

#define PORT 5000 //监听端口

#define MAXFD 20 //最大的在线用户数量

void *get_client(void *);

int sockfd,i;

static int maxi=0;//maxi表示当前client数组中最大的用户的i值

static int client[MAXFD];

void recvandsend(void) //监听转发线程入口函数

{ int index=0;

int nbytes=0;

char buffer[1024];

int len;

int outindex=0;

while(1)

{ if(maxi>0)

{ memset(buffer,0,sizeof(buffer));

nbytes=0;

//index++;

nbytes=read(client[index++],buffer,sizeof(buffer));

if(nbytes>0)

{ buffer[nbytes]='\0';

printf(" %s\n",buffer);

outindex=0;

while(outindex

if(write(client[outindex++],buffer,sizeof(buffer))==-1)

{ fprintf(stderr,"Write Error:%s\n",strerror(errno));

exit(1);

}

}

}

if(index>=maxi)

index=0;

}

pthread_exit(NULL);

}

int main(int argc, char *argv[])

{

struct sockaddr_in server_addr;

struct sockaddr_in client_addr;

int sin_size,portnumber;

char hello[]="Hello! Are You Fine?\n";

int thr_id; /* thread ID for the newly created thread */

pthread_t p_thread; /* thread's structure */ int new_fd=0;

memset(client,0,sizeof(client));

if(argc!=1)

{ fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);

exit(1);

} /* 服务器端开始建立socket 描述符*/

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

{ fprintf(stderr,"Socket error:%s\n\a",strerror(errno));

exit(1);

} /* 服务器端填充sockaddr 结构*/

bzero(&server_addr,sizeof(struct sockaddr_in));

server_addr.sin_family=AF_INET;

server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

server_addr.sin_port=htons(PORT); /* 捆绑sockfd 描述符*/

if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,"Bind error:%s\n\a",strerror(errno));

exit(1);

}

printf("服务器监听端口%d...\n",PORT);

/* 监听sockfd 描述符*/

if(listen(sockfd,LISTENQ)==-1)

{ fprintf(stderr,"Listen error:%s\n\a",strerror(errno));

exit(1);

}

thr_id = pthread_create(&p_thread, NULL,(void*) recvandsend, NULL);

printf("欢迎来到本聊天室\n");

while(1)

{

/* 服务器阻塞,直到客户程序建立连接*/

if(maxi>=20)

{ printf("以达到人数上线\n");

continue;

}

sin_size=sizeof(struct sockaddr_in);

if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)

{ fprintf(stderr,"Accept error:%s\n\a",strerror(errno));

exit(1);

}

client[maxi++]=new_fd;

printf("\n新用户进入聊天室%d\n",new_fd);

}

close(sockfd);

exit(0);

}