linux课程设计.docx
《linux课程设计.docx》由会员分享,可在线阅读,更多相关《linux课程设计.docx(50页珍藏版)》请在冰豆网上搜索。
![linux课程设计.docx](https://file1.bdocx.com/fileroot1/2023-2/3/37283fe0-4d83-4932-879a-36813eede0eb/37283fe0-4d83-4932-879a-36813eede0eb1.gif)
linux课程设计
Linux操作系统与程序设计
课程设计报告书
*******
小组成员:
胡海强软件工程099074146
张文敬软件工程099074169
孙玲软件工程099074155
纵清华软件工程099074174
摘要
随着嵌入式在生活年中的应用越来越广泛,嵌入式Linux下的socket网络编程也越来越热门。
为了加强对LINUX系统下的编程的各种知识点的整合与灵活运用,让我们更加熟悉Linux下的编程操作,我们的课程设计的题目为Linux下网络聊天工具。
本系统主要功能是用GTK实现UDP通信。
同时使用文件将用户的相关信息保存。
应用Linux下的socket网络编程并使用UDP实现简单聊天程序。
编程中不断用各种网络调试工具进行调试程序,最终做成了简单的在Linux下的聊天工具。
关键词:
Linux下的socket网络编程UDP聊天工具
第一章绪论
1.1实验项目目的
本次课程设计是为了加强对Linux系统下的编程的各种知识点的整合与灵活运用,让我们更加熟悉Linux下的编程操作。
重点在Linux下的socket编程,了解TCP,UDP等协议的使用,并完成课程设计题目。
1.2课程设计的实验环境
硬件:
基于linux系统的PC机
软件:
opensuse系统emacs编译器
1.3课程设计总体要求
在Lniux下用GTK实现网络聊天的功能。
第二章系统方案
本实验是一个Linux下的网络即时通信工具,系统功能与模块划分如下2.1系统功能
本系统的功能主要是在linux平台下用GTK实现网络聊天的功能。
2.1功能模块图
客户端
服务器
第三章实验项目的人员组成及职责划分
我们实验组总共由2个同学组成,姓名,专业,学号及职责划分如下:
①胡海强(专业及班级:
软件工程091班,学号099074146),小组组长,负责代码编写、测试及课程设计报告书编写。
②张文敬(专业班级:
软件工程091班,学号:
099074169),负责部分代码的编写,测试及课程设计报告书编写。
孙玲(专业及班级:
软件工程091班,学号099074155),负责测试及课程设计报告书编写。
纵清华(专业班级:
软件工程091班,学号:
099074174),负责测试及课程设计报告书编写。
第四章设计与实现
4.1系统结构
4.1.1系统结构图
4.2客户端
4.2.1登录模块
登录模块截图
登录模块代码:
voidload()
{
GtkWidget*window;
GtkWidget*table;
GtkWidget*entry;
use_ruser;
GtkWidget*login;
GtkWidget*regist;
window=gtk_dialog_new();////在内存中创建一个新的对话框
log_dialog=window;//在销毁时使用
gtk_window_set_title((GtkWindow*)window,"登录...");
gtk_window_set_default_size(GTK_WINDOW(window),200,100);//宽和高
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);//设置刚开始的位置是在屏幕中央
//创建一个表格,再包含进对话框中
table=gtk_table_new(3,3,TRUE);//6行6列
gtk_container_add(GTK_BOX(GTK_DIALOG(window)->action_area),table);
//创建一个标签
entry=gtk_label_new("用户名:
");
gtk_table_attach(GTK_TABLE(table),entry,0,1,0,1,GTK_FILL,GTK_FILL,0,0);//
entry=gtk_label_new("密码:
");
gtk_table_attach(GTK_TABLE(table),entry,0,1,1,2,GTK_FILL,GTK_FILL,0,0);//
//创建一个文本区
user.userName=gtk_entry_new_with_max_length(20);//限制用户名输入的字符,不能超过20个字节
gtk_table_attach(GTK_TABLE(table),user.userName,1,3,0,1,GTK_FILL,GTK_FILL,0,0);//
user.passwd=gtk_entry_new_with_max_length(10);//限制密码最多不能超过10个字节
gtk_entry_set_visibility(GTK_ENTRY(user.passwd),FALSE);//在显示字符的地方用不可见字符代替
gtk_table_attach(GTK_TABLE(table),user.passwd,1,3,1,2,GTK_FILL,GTK_FILL,0,0);//
login=gtk_button_new_with_label("登录");
gtk_table_attach(GTK_TABLE(table),login,2,3,2,3,GTK_FILL,GTK_FILL,0,0);//
regist=gtk_button_new_with_label("注册");
gtk_table_attach(GTK_TABLE(table),regist,0,1,2,3,GTK_FILL,GTK_FILL,0,0);//
//前面将登录的界面构建成功
//将真正的功能赋予这些按钮,即连接回调函数,通过信号传递
g_signal_connect(G_OBJECT(login),"clicked",G_CALLBACK(log_hwQQ),&user);
g_signal_connect(G_OBJECT(regist),"clicked",G_CALLBACK(reg_hwQQ),NULL);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(quit),NULL);
gtk_widget_show_all(window);
gtk_main();//把控制权交给GTK+来启动交互过程,并且一直运行,直到调用gtk_main_quit()才返回
}
voidlog_hwQQ(GtkWidget*login,use_r*user)//点击登录时,产生的动作
{
//需要先设置登录状态,此时还没有登录成功,所以为0
logSta=0;
if(strcmp(gtk_entry_get_text(GTK_ENTRY(user->userName)),"")==0||
strcmp(gtk_entry_get_text(GTK_ENTRY(user->passwd)),"")==0)
{
g_print("用户名或密码不能为空,请重新登录!
\n");//终端输出
return;
}
//设置好信息的相关内容,再进行发送
messageMess;
strcpy(Mess.gusName,gtk_entry_get_text(GTK_ENTRY(user->userName)));
strcpy(Mess.pawd,gtk_entry_get_text(GTK_ENTRY(user->passwd)));
strcpy(useName,Mess.gusName);
strcpy(pawd,Mess.pawd);
//printf("yonghu%s",useName);
//printf("mima%s",pawd);
Mess.flags=2;//代表登录
//发送
write(sockfd,(char*)&Mess,sizeof(message));
while
(1)
{
if(logSta!
=0)//如果状态不是登录成功的状态,就一直等待,死循环
break;
}
if(logSta==1)//登录成功,需要将该登录界面销毁,同时打开hw_QQ界面
{
gtk_widget_destroy(GTK_WIDGET(log_dialog));
g_print("/*恭喜您,已经登录成功!
(客户端)*/\n");
//进入hw_QQ界面,可通过选择好友来聊天,但还不是聊天的界面
chatmain_dialog();
}
}
4.2.2注册模块
注册模块截图
注册模块代码
voidreg_handle(GtkWidget*resButton,r_user*p_re_user)
{
if(strcmp(gtk_entry_get_text(GTK_ENTRY(p_re_user->userName)),"")==0||
strcmp(gtk_entry_get_text(GTK_ENTRY(p_re_user->passwd)),"")==0||
strcmp(gtk_entry_get_text(GTK_ENTRY(p_re_user->agaPasswd)),"")==0)
{
g_print("用户名,密码或确认密码不能为空,请重新输入!
\n");
return;
}
if(strcmp(gtk_entry_get_text(GTK_ENTRY(p_re_user->passwd)),gtk_entry_get_text(GTK_ENTRY(p_re_user->agaPasswd)))!
=0)
{
g_print("密码和确认密码不一致,请重新输入!
\n");
return;
}
//要传送的消息构造
messageresMess;
strcpy(resMess.gusName,gtk_entry_get_text(GTK_ENTRY(p_re_user->userName)));
strcpy(resMess.pawd,gtk_entry_get_text(GTK_ENTRY(p_re_user->passwd)));
resMess.flags=1;//代表注册消息
//可以传送该消息了,将注册消息传送至服务器端
write(sockfd,(char*)&resMess,sizeof(message));
gtk_widget_destroy(GTK_WIDGET(reg_dialog));
g_print("/*恭喜你,注册成功!
(客户端)*/\n");
}
//类似于登录的界面
voidreg_hwQQ(GtkWidget*login,use_r*user)
{
GtkWidget*window;
GtkWidget*table;
GtkWidget*entry;
r_userre_user;
GtkWidget*resButton;
window=gtk_dialog_new();
reg_dialog=window;
gtk_window_set_title((GtkWindow*)window,"注册...");
gtk_window_set_default_size(GTK_WINDOW(window),250,130);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
table=gtk_table_new(4,3,TRUE);//
gtk_container_add(GTK_BOX(GTK_DIALOG(window)->action_area),table);
entry=gtk_label_new("用户名:
");
gtk_table_attach(GTK_TABLE(table),entry,0,1,0,1,GTK_FILL,GTK_FILL,0,0);//
entry=gtk_label_new("密码:
");
gtk_table_attach(GTK_TABLE(table),entry,0,1,1,2,GTK_FILL,GTK_FILL,0,0);//
entry=gtk_label_new("确认密码:
");
gtk_table_attach(GTK_TABLE(table),entry,0,1,2,3,GTK_FILL,GTK_FILL,0,0);//
re_user.userName=gtk_entry_new_with_max_length(20);
gtk_table_attach(GTK_TABLE(table),re_user.userName,1,3,0,1,GTK_FILL,GTK_FILL,0,0);//
re_user.passwd=gtk_entry_new_with_max_length(10);
gtk_entry_set_visibility(GTK_ENTRY(re_user.passwd),FALSE);
gtk_table_attach(GTK_TABLE(table),re_user.passwd,1,3,1,2,GTK_FILL,GTK_FILL,0,0);//
re_user.agaPasswd=gtk_entry_new_with_max_length(10);
gtk_entry_set_visibility(GTK_ENTRY(re_user.agaPasswd),FALSE);
gtk_table_attach(GTK_TABLE(table),re_user.agaPasswd,1,3,2,3,GTK_FILL,GTK_FILL,0,0);//
resButton=gtk_button_new_with_label("注册");
gtk_table_attach(GTK_TABLE(table),resButton,2,3,3,4,GTK_FILL,GTK_FILL,0,0);//
g_signal_connect(G_OBJECT(resButton),"clicked",G_CALLBACK(reg_handle),&re_user);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(quit),NULL);
gtk_widget_show_all(window);
gtk_main();
}
4.2.3用户界面设计
用户设计界面截图
用户设计界面代码
voidchatmain_dialog()//登录进入之后的自己聊天好友记录界面
{
GtkWidget*window;
GtkWidget*table;
GtkAdjustment*horizontal;
GtkAdjustment*vertical;
GtkWidget*scrollWindow;
GtkWidget*frame;
GtkWidget*entry;
GtkWidget*button1;
GtkWidget*button2;
//GtkWidget*button3;
charc[20];
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
chatMain_dialog=window;
gtk_window_set_title((GtkWindow*)window,"小强聊天室");
gtk_window_set_default_size(GTK_WINDOW(window),150,300);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
table=gtk_table_new(12,12,TRUE);
gtk_container_add(GTK_CONTAINER(window),table);
//printf("%s\n",useName);
sprintf(c,"%s的好友列表",useName);
entry=gtk_label_new(c);
gtk_table_attach(GTK_TABLE(table),entry,0,12,0,1,GTK_FILL,GTK_FILL,0,0);
frame=gtk_frame_new(NULL);//新建一个框架
gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_IN);//框架的模式是outline在里面
gtk_table_attach(GTK_TABLE(table),frame,0,12,1,11,GTK_FILL,GTK_FILL,0,0);
list=gtk_list_new();
//GTK_SELECTION_SINGLEselection可以是`NULL`或对一个已选项目,包含一个GList*pointer.
gtk_list_set_selection_mode((GtkList*)list,GTK_SELECTION_SINGLE);
vertical=GTK_ADJUSTMENT(gtk_adjustment_new(0,0,0,1,10,0));//初始值,最小值,最大值,步进的调整增量.页面的调整的增量.显示页面的大小.
horizontal=GTK_ADJUSTMENT(gtk_adjustment_new(0,0,0,1,10,0));
scrollWindow=gtk_scrolled_window_new(horizontal,vertical);//创建一个滚动条,包括水平和垂直的
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollWindow)
GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);//设置水平和垂直滚动条都是需要时才出现
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollWindow),list);//将列表构件加入滚动窗口中
gtk_container_add(GTK_CONTAINER(frame),scrollWindow);
gtk_list_scroll_vertical(GTK_LIST(list),GTK_SCROLL_END,1);//
upda_num=0;
button1=gtk_button_new_with_label("选择好友");
gtk_table_attach(GTK_TABLE(table),button1,7,11,11,12,GTK_FILL,GTK_FILL,0,0);
button2=gtk_button_new_with_label("更新列表");
gtk_table_attach(GTK_TABLE(table),button2,1,5,11,12,GTK_FILL,GTK_FILL,0,0);
//button1=gtk_button_new_with_label("有新消息");
//gtk_table_attach(GTK_TABLE(table),button1,9,12,11,12,GTK_FILL,GTK_FILL,0,0);
g_signal_connect(G_OBJECT(button1),"clicked",G_CALLBACK(seleFriend),NULL);
g_signal_connect(G_OBJECT(button2),"clicked",G_CALLBACK(updaFriend),NULL);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(quit_mainChat),NULL);
gtk_widget_show_all(window);
gtk_main();
}
4.2.4聊天界面设计
聊天界面设计截图
聊天界面设计代码
voidchat_with_friend(guinti)//和好友聊天的对话框,并进行聊天
{
charfriName[20];
//先要创建聊天的对话框,再将聊天的内容以及要聊天好友的信息传送给服务器端
GtkWidget*dialog;
GtkWidget*table;
GtkWidget*recv_list;//接收
GtkWidget*send_entry;//发送
GtkWidget*scrollWindow;//滚动窗口
GtkAdjustment*horizontal;
GtkAdjustment*vertical;//横向和纵向的调整对象
GtkWidget*send_button;
GtkWidget*frame;
//printf("%d\n",friends.Friend[i].status);
if(friends.Friend[i].status!
=1)//表示不在线
{
g_print("该好友不在线,不能发送消息!
\n");
return;
}
dialog=gtk_window_new(GTK_WINDOW_TOPLEVEL);
chatDialog[i].dialog=dialog;
sprintf(friName,"好友%s",friends.Friend[i].name);
gtk_window_set_title((GtkWindow*)dialog,friName);
gtk_window_set_default_size(GTK_WINDOW(dialog),100,300);
gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_CENTER);
//printf("3lihuajie\n");
table=gtk_table_new(10,6,TRUE);
gtk_container_add(GTK_CONTAINER(dialog),table);//将表格加入到对话框中
//printf("1buzhidao\n");
//滚动窗口,并设置滚动条出现的情况(都是需要时才出现)
vertical=GTK_ADJUSTMENT(gtk_adjustment_new(0,0,0,1,10,0));
horizontal=GTK_ADJUSTMENT(gtk_adjustment_new(0,0,