linux课程设计.docx

上传人:b****7 文档编号:9339053 上传时间:2023-02-04 格式:DOCX 页数:50 大小:159.09KB
下载 相关 举报
linux课程设计.docx_第1页
第1页 / 共50页
linux课程设计.docx_第2页
第2页 / 共50页
linux课程设计.docx_第3页
第3页 / 共50页
linux课程设计.docx_第4页
第4页 / 共50页
linux课程设计.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

linux课程设计.docx

《linux课程设计.docx》由会员分享,可在线阅读,更多相关《linux课程设计.docx(50页珍藏版)》请在冰豆网上搜索。

linux课程设计.docx

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,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1