1、linux课程设计Linux操作系统与程序设计课程设计报告书 * 小组成员:胡海强 软件工程 099074146张文敬 软件工程 099074169孙玲 软件工程 099074155 纵清华 软件工程 099074174 摘 要 随着嵌入式在生活年中的应用越来越广泛,嵌入式Linux下的socket网络编程也越来越热门。为了加强对LINUX系统下的编程的各种知识点的整合与灵活运用,让我们更加熟悉Linux下的编程操作,我们的课程设计的题目为Linux下网络聊天工具。 本系统主要功能是用GTK实现UDP通信。同时使用文件将用户的相关信息保存。应用Linux下的socket网络编程并使用UDP实现
2、简单聊天程序。编程中不断用各种网络调试工具进行调试程序,最终做成了简单的在Linux下的聊天工具。 关键词 :Linux下的socket 网络编程 UDP 聊天工具第一章 绪 论1.1实验项目目的 本次课程设计是为了加强对Linux系统下的编程的各种知识点的整合与灵活运用,让我们更加熟悉Linux下的编程操作。重点在Linux下的socket编程,了解TCP,UDP等协议的使用,并完成课程设计题目。1.2 课程设计的实验环境硬件:基于linux系统的PC机软件:open suse系统 emacs编译器1.3 课程设计总体要求 在Lniux下用GTK实现网络聊天的功能。第二章 系统方案本实验是一
3、个Linux下的网络即时通信工具,系统功能与模块划分如下2.1系统功能本系统的功能主要是在linux平台下用GTK实现网络聊天的功能。2.1 功能模块图 客户端服务器第三章 实验项目的人员组成及职责划分我们实验组总共由2个同学组成,姓名,专业,学号及职责划分如下: 胡海强(专业及班级:软件工程091班,学号099074146),小组组长,负责代码编写、测试及课程设计报告书编写。 张文敬(专业班级:软件工程091班,学号:099074169),负责部分代码的编写,测试及课程设计报告书编写。 孙玲(专业及班级:软件工程091班,学号099074155),负责测试及课程设计报告书编写。 纵清华(专业
4、班级:软件工程091班,学号:099074174),负责测试及课程设计报告书编写。 第四章 设计与实现41 系统结构411 系统结构图42 客户端421 登录模块登录模块截图登录模块代码:void load() GtkWidget *window; GtkWidget *table; GtkWidget *entry; use_r user; GtkWidget *login; GtkWidget *regist; window=gtk_dialog_new();/在内存中创建一个新的对话框 log_dialog=window;/在销毁时使用 gtk_window_set_title(GtkW
5、indow *)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_la
6、bel_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),us
7、er.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
8、_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_sig
9、nal_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()才返回void log_hwQQ(GtkWidget *login,use_r *user)/点击登录时,产生的动作 /需要先设置登录状态,此时还没有登录成功,所以为0
10、 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; /设置好 信息的相关内容,再进行发送 message Mess; strcpy(Mess.gusName,gtk_entry_get_text(GTK_ENTRY(user-userName); strcpy(Mess.pawd,gtk_entry_get_text(
11、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_de
12、stroy(GTK_WIDGET(log_dialog); g_print(/*恭喜您,已经登录成功!(客户端)*/n); /进入hw_QQ界面,可通过选择好友来聊天,但还不是聊天的界面 chatmain_dialog(); 422 注册模块注册模块截图注册模块代码void reg_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-p
13、asswd),)=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; /要传送的消息构造 message resMess; strcpy(re
14、sMess.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); /
15、类似于登录的界面void reg_hwQQ(GtkWidget *login,use_r *user) GtkWidget *window; GtkWidget *table; GtkWidget *entry; r_user re_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_wind
16、ow_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
17、_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.pa
18、sswd=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_
19、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_OBJ
20、ECT(window),destroy,G_CALLBACK(quit),NULL); gtk_widget_show_all(window); gtk_main(); 423 用户界面设计用户设计界面截图用户设计界面代码void chatmain_dialog()/登录进入之后的自己聊天好友记录界面 GtkWidget *window; GtkWidget *table; GtkAdjustment *horizontal; GtkAdjustment *vertical; GtkWidget *scrollWindow; GtkWidget *frame; GtkWidget *entry
21、; GtkWidget *button1; GtkWidget *button2; /GtkWidget *button3; char c20; 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
22、_CENTER); table=gtk_table_new(12,12,TRUE); gtk_container_add(GTK_CONTAINER(window),table);/printf(%sn,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
23、_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_SINGLE selection可以是NULL 或对一个已选项目, 包含一个GList* pointer. gtk_list_set_selection_mode(GtkList *)list,GTK_SELECTION_SINGLE); vertical=GTK_ADJUSTMENT(
24、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_
25、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
26、_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_
27、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聊天界面设计聊天界面设计截图聊天界面设计代码v
28、oid chat_with_friend(guint i)/和好友聊天的对话框,并进行聊天 char friName20; /先要创建聊天的对话框,再将聊天的内容以及要聊天好友的信息传送给服务器端 GtkWidget *dialog; GtkWidget *table; GtkWidget *recv_list;/接收 GtkWidget *send_entry;/发送 GtkWidget *scrollWindow;/滚动窗口 GtkAdjustment *horizontal; GtkAdjustment *vertical;/横向和纵向的调整对象 GtkWidget *send_butt
29、on; GtkWidget *frame; /printf(%dn,friends.Friendi.status); if(friends.Friendi.status!=1)/表示不在线 g_print(该好友不在线,不能发送消息!n); return; dialog=gtk_window_new(GTK_WINDOW_TOPLEVEL); chatDialogi.dialog=dialog; sprintf(friName,好友%s,friends.Friendi.name); gtk_window_set_title(GtkWindow *)dialog,friName); gtk_wi
30、ndow_set_default_size(GTK_WINDOW(dialog),100,300); gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_CENTER);/printf(3lihuajien); table=gtk_table_new(10,6,TRUE); gtk_container_add(GTK_CONTAINER(dialog),table);/将表格加入到对话框中 /printf(1buzhidaon);/滚动窗口,并设置滚动条出现的情况(都是需要时才出现) vertical=GTK_ADJUSTMENT(gtk_adjustment_new(0,0,0,1,10,0); horizontal=GTK_ADJUSTMENT(gtk_adjustment_new(0,0,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1