#include <gtk/gtk.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define OURPORT 8088 gint sd; struct sockaddr_in s_in; gchar username[64]; gchar buf[1024]; gchar get_buf[1048]; gboolean isconnected=FALSE; static GtkWidget *text; static GtkTextBuffer *buffer; static GtkWidget *message_entry; static GtkWidget *message_entry; static GtkWidget *name_entry; static GtkWidget *login_button; // void get_message(void) { GtkTextIter iter; gchar get_buf[1024]; gchar buf[1024]; while(read(sd,buf,1024)!=-1) { sprintf(get_buf,"%s",buf); gdk_threads_enter(); gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,get_buf,-1); gdk_threads_leave(); } } void on_destory(GtkWidget *widget,GdkEvent *event,gpointer data) { sprintf(username,"guest"); if(do_connect()==TRUE) { //set widget's sensitive gtk_widget_set_sensitive(login_button,FALSE); g_thread_create((GThreadFunc)get_message,NULL,FALSE,NULL); } gtk_widget_destroy(widget); } void on_button_clicked(GtkButton *button,gpointer data) { const gchar *name; name=gtk_entry_get_text(GTK_ENTRY(name_entry)); sprintf(username,"%s",name); if(do_connect()) { gtk_widget_set_sensitive(login_button,FALSE); g_thread_create((GThreadFunc)get_message,NULL,FALSE,NULL); } gtk_widget_destroy(data); } void create_win(void) { //Creaet login frame GtkWidget *win,*vbox; GtkWidget *button; win=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(win),"Please input userName"); gtk_window_set_position(GTK_WINDOW(win),GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(win),400,400); gtk_container_set_border_width(GTK_CONTAINER(win),10); g_signal_connect(G_OBJECT(win),"delete_event",G_CALLBACK(on_destory),NULL); //gtk_window_set_modal(GTk_WINDOW(win),TRUE); gtk_window_set_position(GTK_WINDOW(win),GTK_WIN_POS_CENTER); vbox=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(win),vbox); name_entry=gtk_entry_new(); gtk_box_pack_start(GTK_BOX(vbox),name_entry,TRUE,TRUE,5); button=gtk_button_new_from_stock(GTK_STOCK_OK); g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_button_clicked),win); gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,5); gtk_widget_show_all(win); } gboolean do_connect(void) { GtkTextIter iter; gint slen; sd=socket(AF_INET,SOCK_STREAM,0); if(sd<0) { gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"Open socket error!\n",-1); return FALSE; } s_in.sin_family=AF_INET; s_in.sin_port=OURPORT; slen=sizeof(s_in); if(connect(sd,(struct sockaddr *)&s_in,slen)<0) { gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"Connect server error!\n",-1); return FALSE; } else { gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,username,-1); gtk_text_buffer_get_end_iter(buffer,&iter); gtk_text_buffer_insert(buffer,&iter,"\nSuccessfully connected to a server!\n",-1); write(sd,username,64); isconnected=TRUE; return TRUE; } } void on_send(GtkButton *button,gpointer data) { const char* message; //if(isconnection==FALSE) return; message=gtk_entry_get_text(GTK_ENTRY(message_entry)); sprintf(buf,"%s\n",message); write(sd,buf,1024); gtk_entry_set_text(GTK_ENTRY(message_entry),""); } void on_login(GtkWidget *button,gpointer data) { create_win(); } void on_delete_event(GtkWidget *widget,GdkEvent *event,gpointer data) { close(sd); gtk_main_quit(); } int main(int argc,char*argv[]) { GtkWidget *window; GtkWidget *vbox,*hbox,*button,*label,*view; if(!g_thread_supported()) g_thread_init(NULL); gtk_init(&argc,&argv); window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window),"client point"); gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window),400,400); g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(on_delete_event),NULL); gtk_container_set_border_width(GTK_CONTAINER(window),10); vbox=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(window),vbox); hbox=gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5); label =gtk_label_new("Please click the login button to connect the server"); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,5); //create login button login_button=gtk_button_new_with_label("login"); gtk_box_pack_start(GTK_BOX(hbox),login_button,FALSE,FALSE,5); g_signal_connect(G_OBJECT(login_button),"clicked",G_CALLBACK(on_login),NULL); view=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(view),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); text=gtk_text_view_new(); gtk_box_pack_start(GTK_BOX(vbox),view,TRUE,TRUE,5); gtk_container_add(GTK_CONTAINER(view),text); buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); hbox=gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5); label=gtk_label_new("Input message:"); gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,5); message_entry=gtk_entry_new(); gtk_box_pack_start(GTK_BOX(hbox),message_entry,FALSE,FALSE,5); button=gtk_button_new_with_label("send"); gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,5); g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_send),NULL); gtk_widget_show_all(window); gdk_threads_enter();// gtk_main(); gdk_threads_leave(); return FALSE; //gtk_widget_show_all(window); //gtk_main(); //return 0; }
相关推荐
在本资源"linux_chatroom.rar"中,我们探讨的是一个专为Linux系统设计的网络聊天程序。这个程序具有很高的学习价值,尤其对于那些热衷于Linux编程和网络通信的开发者而言,它提供了一个实践和理解相关技术的实例。让...
【标题】"chatroom(java).rar" 是一个包含使用Java编程语言实现的聊天室功能的压缩文件,其中的核心应用是 "HTML ClogIn_chatroom.war"。这个WAR(Web ARchive)文件是Java Web应用程序的标准打包格式,通常用于部署...
在这个“linux-chatroom.rar”项目中,我们看到的是一个利用多路复用实现的聊天室应用,它包括客户端(fu.c)和服务端(ke.c)。 1. **多路复用技术** - **select**: 这是最基础的多路复用技术,它可以监控多个...
总之,"linux-chatroom.rar"项目展示了在Linux环境下,如何利用网络编程技术创建一个安全、功能完善的聊天室,并提供了对不当内容的有效管理。这样的项目不仅锻炼了开发者在网络编程和并发处理方面的技能,也体现了...
ChatRoom.rarChatRoom.rarChatRoom.rarChatRoom.rarChatRoom.rarChatRoom.rarChatRoom.rarChatRoom.rarChatRoom.rarChatRoom.rarChatRoom.rarChatRoom.rarChatRoom.rarChatRoom.rarChatRoom.rarChatRoom.rarChatRoom...
在本资源中,我们主要探讨的是Linux环境下的网络编程,特别是使用`select`函数实现一个异步通信的聊天程序。`select`是Linux系统中一个非常重要的I/O多路复用函数,它允许程序同时监控多个文件描述符,等待它们就绪...
Simple version of the Internet chat room.
本项目名为“Linux-chatroom”,通过分析其提供的代码,我们可以深入理解如何在Linux环境下实现多客户端连接并支持群聊、私聊功能。这个项目涉及的技术点主要包括网络编程、多线程、并发处理以及数据通信协议。 1. ...
【Java聊天室系统详解】 Java聊天室系统是一种基于Java编程语言实现的实时通讯应用,它允许用户通过网络进行文本、语音甚至视频的交互。在Java技术栈中,开发这样的系统通常涉及多线程、网络编程、并发处理以及可能...
在"WebSocket 聊天室 chatRoom.zip"这个项目中,开发者使用了Go语言(golang)来构建一个基于WebSocket的实时聊天应用。 1. **WebSocket API**: WebSocket API 是HTML5引入的一种技术,使得Web应用程序可以实现低...
标题中的"chatroom.tar.gz"是一个压缩文件,其中包含了一个简单的Linux聊天室应用程序。让我们深入探讨这个聊天室实现可能涉及的技术和概念。 1. **网络编程**: - **套接字(Sockets)**:网络通信的基础,是进程...
【标题】"chatroom.zip" 是一个包含了基于WebSocket技术实现的简单聊天室项目的压缩包。这个项目使用了Java后端的主流技术栈,包括Spring、SpringMVC和MyBatis(SSM)进行整合,数据库选择了MySQL,服务器环境是...
【标题】"chatroom101:chatroom101.ga的开源代码-Chat source code"揭示了这是一个关于在线聊天室的开源项目,其源代码是公开的,允许用户研究、学习和改进。这个项目可能旨在创建一个实时的、交互式的聊天平台,让...
【标题】"a_c!s_chatroom.rar_Chatroom_chat_java程序" 提供了一个Java编程实现的聊天室项目,这个程序旨在创建一个简单的、易于理解的在线交流平台。通过使用Java语言,开发者构建了一个功能基础但实用的聊天环境,...
P2P即时聊天系统,实现功能如下: 1) 点对点的单人聊天 2) 多人同时聊天 3) 用户可以自由加入和退出。 4)可以共享文件 混合P2P模式。系统开发主要涉及到socket编程技术和多线程技术。支持流Socket通信:...
总的来说,"ChatRoom.zip"项目是一个很好的学习和实践Linux下C语言socket编程、文件操作、守护进程以及日志记录的实例。通过理解并实现这样一个项目,开发者能够增强对网络通信、进程管理以及文件操作的理解,这对于...
通过研究这个`ChatRoom`项目,你不仅可以巩固Java基础,还能深入理解网络编程和多线程技术,对提升你的编程技能和解决实际问题的能力大有裨益。对于想要从事网络应用开发的Java程序员来说,这是一个很好的学习资源。
chatroom-master.zip
在这个"chatroom.rar"压缩包中,包含的是一份Java聊天室的实例代码,旨在演示客户端和服务端如何通过Socket进行通信,实现消息的发送与接收。 在TCP/IP协议栈中,Socket是提供进程间网络通信的接口,它允许两个运行...
网鼎杯计算机网络的最终项目,一个用Python编写的聊天室,名为network pj chatroom.zip计算机网络的最终项目,一个用Python编写的聊天室,名为network pj chatroom.zip计算机网络的最终项目,一个用Python编写的聊天...