基于linux下的聊天程序的开发与设计内容摘要:

HP, Guile,Perl, Python, TOM, Ada95, Objective C, Free Pascal, and Eiffel。 本章总结: 技术是开发的基础,只有熟练掌握了这些技术,才能高效、快速的完成所设计的软件。 上面已经总体上列出聊天程序的基本技术,接下来的工作就是利用这 些技术实现所需要的功能。 10 第三章 软件详细设计及代码实现 我们所看到的软件是这个软件的图形界面,这些界面要容易被大众所接受,而实现软件的功能就是代码了。 软件界 面设计: ( 1)服务器端 如图 31 图 31 服务器端 ( 2)登录界面 如图 32 11 图 32 登录界面 ( 3)注册界面 如图 33 图 33 注册界面 ( 4)注册成功 如图 34 图 34 注册成功 ( 5)客户端窗口 如图 35 12 图 35 客户端 ( 6)用户 2 对用户 3 聊天 如图 36 图 36 聊天示意图 ( 7)系统发布消 息 如图 37 13 图 37 系统发布消息 软件主要代码实现: int initial_server (char *ip, int server_listen_port) { int sockfd。 if ((sockfd=socket(AF_INET, SOCK_STREAM,0))0) { printf(服务器不能创建套接字 !\n)。 fflush(stdout)。 return(0)。 } printf(sockfd is %d\n,sockfd)。 bzero((char*)amp。 server_address, sizeof(server_address))。 =AF_INET。 =i_addr(ip)。 =htons(server_listen_port)。 setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, amp。 flag, len)。 if(bind(sockfd,(structsockaddr*)amp。 server_address,sizeof(server_address))0){ printf(服务器不能绑定本地 IP 地址 !\n)。 fflush(stdout)。 return(0)。 } printf(服务器端口号为: %d\n,server_listen_port)。 return(sockfd)。 } void set_address(fd_set *sockset, int sockfd){ int i。 FD_ZERO(sockset)。 FD_SET(sockfd, sockset)。 14 for(i=0。 iMAX_CLIENT。 i++){ if(user_client[i].socketfd!=0){ FD_SET( user_client[i].socketfd,sockset)。 } } } int max(int a, int b) { return a b ? a : b。 } int user_free() { int i=0。 while ((user_client[i].state!=0)amp。 amp。 (iMAX_CLIENT)) i++。 if (i==MAX_CLIENT) return(1)。 return(i)。 } void init_user_client (void){ int i。 for(i=0。 iMAX_CLIENT。 i++){ bzero(user_client[i].id,MAX_NAME)。 bzero(user_client[i].name,MAX_NAME)。 user_client[i].socketfd=0。 user_client[i].state=0。 } } void textviewclear (GtkWidget * text_view)//清空 textview { GtkTextBuffer *buffer。 GtkTextIter start, end。 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view))。 gtk_text_buffer_get_bounds (buffer, amp。 start, amp。 end)。 gtk_text_buffer_delete (buffer, amp。 start, amp。 end)。 } ( 1) treeiew 信号处理函数 gboolean selection_changed(GtkWidget * widget, gpointer data) { GtkTreeIter iter。 GtkTreeModel *model。 char *value,*token。 if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(widget), amp。 model, amp。 iter)) { gtk_tree_model_get(model, amp。 iter, 0, amp。 value, 1)。 show_foot(label1_to,value)。 strcpy(to_man,value)。 if(strcmp(value,飞鸽传书 )==0){ sprintf(to_id,all)。 //点击飞鸽 }else{ token = strtok(value, ( )。 token = strtok(NULL, ))。 //bzero(del_m,MAX_ROW)。 sprintf(to_id,%s,token)。 printf(value=%s,to_id%s\n, value,to_id)。 } /*if (strcmp(value, 在线好友 ) != 0 amp。 amp。 strcmp(value, 离线好友 ) != 0) { strtok(value, )。 strcpy(sid, value + (strlen(value) + 2))。 printf(%s\n, sid)。 //GtkWidget *to_to。 //to_to=create_toto(1)。 15 //gtk_widget_show_all(to_to)。 int i。 for (i = 0。 i MAX_CLIENT。 i++) { if (strcmp(list[i].id, sid) == 0) { printf(i=%d\n, i)。 printf(id=%s\n, list[i].id)。 if (list[i].state == 0) { //g_thread_create(G_THREAD_FUNC(dialog),NULL,FALSE, NULL)。 break。 } else { printf(id=%s\n, list[i].id)。 if (list[i].p == 0) { g_thread_create(G_THREAD_FUNC(func_action), (void*)i, FALSE, NULL)。 } break。 } } } }*/ } } ( 2) 显示好友列表 GtkTreeModel *createmodel() { int unline。 int online。 const gchar *files[] = { , , }。 GtkWidget *cellView。 GdkPixbuf *pixbuf。 GtkTreeIter iter1, iter2。 gint i, j, s, k = 0。 char to_tree[MAX_CLIENT][MAX_NAME],fly[MAX_NAME]。 store = gtk_tree_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING)。 cellView = gtk_cell_view_new()。 sprintf(fly,飞鸽传书 \0)。 pixbuf = gdk_pixbuf_new_from_file(files[1], NULL)。 gtk_tree_store_append(store, amp。 iter1, NULL)。 gtk_tree_store_set(store, amp。 iter1, PIXBUF_COL, pixbuf, TEXT_COL, fly, 1)。 printf(tree_cont=%s\n,fly)。 gdk_pixbuf_unref(pixbuf)。 for (i = 0。 i MAX_CLIENT。 i++) { if(strlen(user_client[i].id)!=0){ //my_friend[i].f_name //my_friend[i].f_id sprintf(to_tree[i],%s( %s ),user_client[i].name,user_client[i].id)。 pixbuf = gdk_pixbuf_new_from_file(files[1], NULL)。 gtk_tree_store_append(store, amp。 iter1, NULL)。 gtk_tree_store_set(store, amp。 iter1, PIXBUF_COL, pixbuf, TEXT_COL, to_tree[i], 1)。 printf(tree_cont=%s\n,to_tree[i])。 gdk_pixbuf_unref(pixbuf)。 } } /*list[messcount] if (i == 0) { for (j = 0。 j MAX_CLIENT。 j++) { if (list[j].state == 1) { 16 bzero(tables, MAX_NAME)。 sprintf(tables, %s%s, list[j].name, list[j].id)。 printf(%s\n, list[j].name)。 s = rand() % 5。 pixbuf = gdk_pixbuf_new_from_file(file[i], NULL)。 //pixbuf=gtk_widget_render_icon(cellView,stocks[s],GTK_ICON_SIZE_BUTTON, NULL)。 gtk_tree_store_append(store, amp。 iter2, amp。 iter1)。 gtk_tree_store_s。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。