linux课程设计Word下载.docx
《linux课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《linux课程设计Word下载.docx(50页珍藏版)》请在冰豆网上搜索。
1.3课程设计总体要求
在Lniux下用GTK实现网络聊天的功能。
第二章系统方案
本实验是一个Linux下的网络即时通信工具,系统功能与模块划分如下2.1系统功能
本系统的功能主要是在linux平台下用GTK实现网络聊天的功能。
2.1功能模块图
客户端
服务器
第三章实验项目的人员组成及职责划分
我们实验组总共由2个同学组成,姓名,专业,学号及职责划分如下:
①胡海强(专业及班级:
软件工程091班,学号099074146),小组组长,负责代码编写、测试及课程设计报告书编写。
②张文敬(专业班级:
软件工程091班,学号:
099074169),负责部分代码的编写,测试及课程设计报告书编写。
孙玲(专业及班级:
软件工程091班,学号099074155),负责测试及课程设计报告书编写。
纵清华(专业班级:
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);
//
密码:
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),"
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);
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));
/*恭喜您,已经登录成功!
(客户端)*/\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->
strcmp(gtk_entry_get_text(GTK_ENTRY(p_re_user->
agaPasswd)),"
用户名,密码或确认密码不能为空,请重新输入!
passwd)),gtk_entry_get_text(GTK_ENTRY(p_re_user->
agaPasswd)))!
=0)
密码和确认密码不一致,请重新输入!
//要传送的消息构造
messageresMess;
strcpy(resMess.gusName,gtk_entry_get_text(GTK_ENTRY(p_re_user->
strcpy(resMess.pawd,gtk_entry_get_text(GTK_ENTRY(p_re_user->
resMess.flags=1;
//代表注册消息
//可以传送该消息了,将注册消息传送至服务器端
resMess,sizeof(message));
gtk_widget_destroy(GTK_WIDGET(reg_dialog));
/*恭喜你,注册成功!
//类似于登录的界面
voidreg_hwQQ(GtkWidget*login,use_r*user)
r_userre_user;
GtkWidget*resButton;
reg_dialog=window;
注册..."
gtk_window_set_default_size(GTK_WINDOW(window),250,130);
table=gtk_table_new(4,3,TRUE);
确认密码:
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),"
G_CALLBACK(reg_handle),&
re_user);
4.2.3用户界面设计
用户设计界面截图
用户设计界面代码
voidchatmain_dialog()//登录进入之后的自己聊天好友记录界面
GtkAdjustment*horizontal;
GtkAdjustment*vertical;
GtkWidget*scrollWindow;
GtkWidget*frame;
GtkWidget*button1;
GtkWidget*button2;
//GtkWidget*button3;
charc[20];
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
chatMain_dialog=window;
小强聊天室"
gtk_window_set_default_size(GTK_WINDOW(window),150,300);
table=gtk_table_new(12,12,TRUE);
gtk_container_add(GTK_CONTAINER(window),table);
%s\n"
sprintf(c,"
%s的好友列表"
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),"
G_CALLBACK(seleFriend),NULL);
g_signal_connect(G_OBJECT(button2),"
G_CALLBACK(updaFriend),NULL);
G_CALLBACK(quit_mainChat),NULL);
4.2.4聊天界面设计
聊天界面设计截图
聊天界面设计代码
voidchat_with_friend(guinti)//和好友聊天的对话框,并进行聊天
charfriName[20];
//先要创建聊天的对话框,再将聊天的内容以及要聊天好友的信息传送给服务器端
GtkWidget*dialog;
GtkWidget*recv_list;
//接收
GtkWidget*send_entry;
//发送
//滚动窗口
//横向和纵向的调整对象
GtkWidget*send_button;
//printf("
%d\n"
friends.Friend[i].status);
if(friends.Friend[i].status!
=1)//表示不在线
该好友不在线,不能发送消息!
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);
3lihuajie\n"
table=gtk_table_new(10,6,TRUE);
gtk_container_add(GTK_CONTAINER(dialog),table);
//将表格加入到对话框中
1buzhidao\n"
//滚动窗口,并设置滚动条出现的情况(都是需要时才出现)
horizontal=GTK_ADJUSTMENT(gtk_adjustment_new(0,0,