精华内容
下载资源
问答
  • Linux下qt实现局域网聊天qq
  • linux下用qt实现qq聊天的工具

    热门讨论 2012-10-04 17:52:06
    代码实现了简单的qq聊天功能,利用Qt工具实现了简单的qq聊天功能
  • 基于Linux模拟QQ,单进程实现显示在线人数,聊天,发送文件等功能
  • linuxQQ聊天系统

    2014-05-29 10:30:14
    实现了传送文件,发送表情,群聊,私聊等功能!各部分操作步骤程序运行后有相关解释。如果运行不了,我再重发一份,谢谢!
  • Linux实现的仿QQ聊天系统,C语言实现,WebSocket,功能包括【注册用户和登录】,【单对单发送消息】,【单对多发送消息】。数据传输格式为JOSN
  • C语言实现Linux聊天工具

    千次阅读 2019-01-08 11:46:13
    C语言实现Linux聊天工具。

    项目源码https://github.com/One-Snail/mychatroom

    引言

    在互联网越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网 络,QQ、微软MSN、移动的Fetion等,都是做的比较成功的, 随着网络的日益普及,各种聊天工具也层出不穷,当我们学习《网络与程序设计》这门课程之 后,接下来的课程设计就是针对一个简单的网络聊天程序,利用C语言为开发工具,实现基本的通讯功能。

     

    【一】项目题目及功能

    项目题目:socket聊天工具

    功能:

    • 实现注册功能。
    • 登录功能。
    • 客户可以通过服务器转发,实现一对一聊天。
      • 4.客户端程序应该可以实时显示目前其它用户的在线状态。
      • 5.具有文件传输功能
      • 6.具有易用、美观的界面。


     

    【二】项目整体设计框架图及说明

    • 客户端:

     

     

     

     1. 界面部分 

    主界面分别为登录(login),注册(register),离开(quit)三个选项,当用户登陆成功以后,二级界面为显示在线用户列表(show users_online),聊天(chat),返回(goback),注销(write off).

    2. 功能部分

    主函数使用TCP流式套接字与服务器进行通信,通信地址为本机地址,主进程负责连接服务器,另有聊天函数,在此函数中新建一个子进程用于接受来自服务器端的通信,而父进程负责发送客户端的数据到服务器,这样可以避免进程因为write函数和read函数一直阻塞,并且各个客户端发送过程中不会互相干扰.除此之外,还有注册函数和登录函数,用户注册和登录的信息会被发送到服务器,然后由服务器发送给MySQL。

     

    • 服务器:

     

    1. 主函数模块

    该模块负责服务器创建套接字、绑定、监听等初始化设置,以及如果有连接到达了就创建新的线程,然后在线程中处理客户端的请求。

    2. 功能函数

    服务器的功能是与客户端的功能大多一一对应的,例如登录、注册、聊天等,服务器根据客户机的请求提供不同的服务。此外,服务器与MySQL的交互函数也在这个模块里。


     

    【三】项目分模块设计说明,流程图

    • 服务器:

    1. 处理注册信息
    2. 处理登录信息
    3. 转发聊天消息
    4. 发送在线用户列表

    • 客户端:

    1. 主函数模块
    2. 界面模块
    3. 聊天模块
    4. 注册模块
    5. 登录模块
    6. 文件传输模块


     

    【四】项目关键数据结构及说明

    服务器与客户端都定义了两个结构体变量:

    typedef struct
    
    {
    
        char loginid[20];         /*用户名*/
    
        char password[20];      /*密码*/
    
    } users_t;
    typedef struct
    
    {
    
        int r_sockfd;          //接收方的socketfd
    
        char content[500];     //消息内容
    
    } hdr_t;
    
    


    其中,users_t存放用户的信息,包括用户的ID和这密码;hdr_t存放用户发送的消息,包括接收方的sockfd和要发送的消息内容。


     

    【五】项目关键函数说明及流程图

    • 服务器:

    1_register()

    1. 函数形式:void _register(int);
    2. 功能:处理客户的注册请求,成功则将客户发送的用户信息加入MySQL中的“users_info”表中,并发送注册成功的消息给用户;否则发送注册失败的提示信息给用户。

    2_login()

    1. 函数形式:users_t  _login(int);
    2. 功能:处理客户的登录请求,成功则将客户信息加入MySQL中的“users_online”表中,并发送登录成功的消息给用户;否则发送登录失败的提示信息给用户。
    3. 返回值:成功则返回包含客户信息的users_t结构体,否则返回NULL。

    3_chat()

    1. 函数形式:void _chat(int);
    2. 功能:转发客户的消息,以实现聊天功能。

    4_online()

    1. 函数形式:void _online(int);
    2. 功能:显示在线用户的列表。

    5_quit()

    1. 函数形式:void _quit(int);
    2. 功能:用户退出。

    6write_off()

    1. 函数形式:void write_off(int);
    2. 功能:用户注销。

    7gif_handle_client()

    1. 函数形式:void gif_handle_client(int *);
    2. 功能:线程处理函数。创建新线程后线程的处理函数,根据用户输入的不同命令执行不同的动作。

    8sql_manage()

    1. 函数形式:void sql_manage(void)
    2. 功能:数据库处理函数,包括数据库的初始化、连接等行为。
    • 客户端:

     

    1_chat()

    1. 函数形式:void _chat(int);
    2. 功能:客户端聊天函数,实现和服务器的通信。
    3. 具体实现:

    使用了fork()函数创建一个子进程,当fork函数的返回值pid为0时,即代表子进程启动,这个子进程用于接受服务器端的数据,这里定义了一个字符数组缓冲区recvbuf来接受服务器端的数据,用read函数来将套接字缓冲区中的数据读入到recvbuf中,read函数还需要判断一下返回值的类型,返回-1代表客户端读取失败,返回0代表服务器关闭,返回其他值则代表正常接收数据。然后用fputs函数将缓冲区中的数据打印到客户端屏幕上。父进程用于发送客户端数据到服务器,这里定义一个发送缓冲区sendbuf,从客户端标准输入中接受数据到sendbuf中,然后在while循环中使用send函数将sendbuf中的数据复制到客户端与服务器连接的套接字缓冲区中。最后,如果while循环退出,则代表客户端的服务器父进程退出,这时因为父子进程中的变量和内存不共享,所以需要用一个信号函数通知子进程客户端已关闭。

     

    2_login()

    1. 函数形式:int _login(int,users_t);
    2. 功能:实现客户端登录。
    3. 具体实现:

    首先定义一个字符型的数组buf用于存储用户的登录信息,然后使用memcpy函数将用户信息结构体user中的信息拷贝到buf中,最后,需要用send将buf中的用户信息复制到客户端套接字缓冲区中,服务器端接收到后会与服务器的数据库中的已注册用户信息进行比较,如果数据库中有相应的用户,则服务器会将此用户信息做一系列处理,比如加入到数据库的在线用户表中,然后给客户端返回一个登陆成功的信息,客户端在login函数中使用recv函数接受此信息,并将信息打印出来反馈给客户,表示客户已经连接成功,这里服务器返回一个字符串:login successfully!,所以我们在登录成功后会在客户端看到服务器返回的字符串。

     

    3. mysystem()

    1. 函数形式:void mysystem(int);
    2. 功能:客户端界面函数。提示用户输入不同的命令。
    3. 具体实现:

    客户端定义了三个主界面功能,分别是login,register,quit。

    其中,login表示用户登录,要求用户输入已经注册过的用户名和密码进行登录。如果没有注册的话,需要用户自己用register注册一个新的用户名和密码。register表示用户注册,进入后会要求用户输入相应的用户名和密码进行新用户的注册,如果服务器的数据库中没有注册过这个用户,就会将这个新用户的信息存储在用户索引数据库中。quit表示客户端用户退出。

    在用户使用login后,客户顿会进入另外一个界面,即用户登录二级界面,里面包括四个二级界面功能,分别是:show users_online, chat, goback, write off, file translation。 其中show users­_online表示显示在线用户列表,会将当前所有的在线用户打印到客户端的屏幕上,chat表示与其他客户端进行通信,goback对返回到上一级目录,write off会将当前登录用户注销,file translation表示文件传输功能,可以实现两个客户端之间的文件传输,或者可以将文件上传到服务器端。客户端使用这个功能后,会进入另外一个文件传输界面,主要包括一下功能:list,get,put,quit。其中list表示显示当前目录的所有文件,get表示从服务器获取文件,put表示传送文件到服务器端,quit表示离开当前界面。这里每一个界面功能都有一个相应的函数与之对应,如chat功能会对应一个函数,为chat函数,这样就可以实现界面与相应功能的连接。

     

    4_register()

    1. void _register(int);
    2. 功能:新用户注册函数。
    3. 具体实现:

    首先定义一个buf缓冲区,用于存储用户注册信息,之后由用户输入注册的用户名和密码,再使用send函数将用户名和密码发送到服务器端,和登录操作一样,服务器接收到用户的注册请求后会做相关的处理,然后返回一个套接字描述符给客户端,表示用户注册成功,之后客户端将这个文件描述符答应道屏幕上呈现给用户。

     

    5.文件传输函数---translation file();

    子函数1:int list_handler();

    功能:list指令函数,打印服务端的文件

    具体实现:

    判断用户输入的字符串是否为“list”,如果是那么就使用recv函数接受服务器端的文件列表,然后打印到客户端程序。

    子函数2int get_file(char *filename)

    功能:下载文件,传入文件名,文件不存在则报错

    具体实现:

    • 变量定义

    char buff[MAXSENDSIZE];   接受文件缓冲区

       Message msg;     消息结构体,存储用户输入命令

       int nrd = 0;      

       int nwr = 0;

       int fdwr;        套接字

       char flag;      

    • 流程

    首先使用access函数检测文件是否存在,如果存在进行下一步,使用open函数打开文件准备写入,发送指令。

     

    子函数3int put_file(char *filename)

    功能:向服务端发送文件

    具体实现:

    • 变量定义:

    char buff[MAXSENDSIZE];发送文件缓冲区

    Message msg;    发送的消息结构体、

    int fdrd;      文件描述符

    int nrd = 0;     

    • 流程:

    首先比对用户输入是否和put一致,若是一致,则进行下一步比对文件是否存在,不存在就退出,如果存在,进行下一步,使用open打开文件,将文件内容通过send发行到服务器具体代码见文件传输文件。


     

    【六】项目文件列表.文件功能说明及项目编译步骤

    • 服务器:server.c 

      1. 编译:在Linux环境下编译,需要引用mysqlclient和pthread库,因此编译命令为:

    gcc server.c -o server -lpthread -lmysqlclient1
    

      2. 执行时,MySQL可能需要root权限,故执行命令为:

    sudo ./server1
    

     

    • 客户端:client.c 

      1. 编译:仅有一个文件client.c,在当前目录下,故直接使用命令:

    gcc client.c -o client -lpthread1
    

      2. 进行编译.生成可执行文件:client, 再使用命令:

    ./client 

      3. 运行客户端程序即可.


     

    【七】项目演示步骤

    一、注册

    • 注册之前的用户信息表:

     

    • 客户端选择功能“2”,然后输入注册ID和密码。

     

    • 按下回车,可见结果已注册成功;服务器上也显示出了新建用户的信息,同时查看MySQL的表“user_info,可见已多出了用户“1618012”的信息。

     

     

     

    二、登录

    • 登录之前的”user_online”表:

     

     

     

    • 客户端登录:

     

     

    • 服务器上显示出了用户的信息,同时MySQL”user_online”表里多出了用户”1618012”的信息

     

     

    三、聊天

    • 打开两个客户端,并同时选择‘chat’选项:

     

     

    • 发送消息如图:

     

     

    四、显示在线用户:

    1. MySQL中的”user_online”表:

     

    • 用户选择“show users_online”选项后:

     

    五、用户退出

    • 用户退出前的”user_online”表:

     

    • 用户选择主界面的‘quit’选项:

     

    • 退出后的”user_online”如图(退出的是1618012用户)

     

    六、用户注销

    • 用户注销前的”user_info”表:

     

    • 用户选择“注销“:

     

    • 注销后的”user_info”表(注销的是1992用户)

     

    七、文件传输:

    • 假设从客户端“client”给客户端“client1”传输文件。传输前文件夹里的文件列表如图:

     

     

    • 分别登录客户端、服务器,client选择“put”文件,client1选择“get”文件:

     

     

    • 点击回车后,结果如图:

    • 此时查看服务器状态如图,同时可见client1文件夹里已经有了a.txt文件。

     

     

     

    展开全文
  • linuxQQ聊天

    2005-06-24 11:19:00
    想在linuxQQ聊天,还大费用折。 先是用gaim打补丁,总是编译不成功,也不知是什么缘故。 后来用openQQ,安装倒是成功通过了,可就是登录不上,也放弃了。 最后用lumaQQ,还比较顺利,只需要下载安装包后解压...
     
    
      想在linux上QQ聊天,还大费用折。
      先是用gaim打补丁,总是编译不成功,也不知是什么缘故。
      后来用openQQ,安装倒是成功通过了,可就是登录不上,也放弃了。
      最后用lumaQQ,还比较顺利,只需要下载安装包后解压即可直接使用,记得要打补丁哟。
      用lumaQQ有时也登录不上去,在设置中将登录模式由UDP改为TCP好象要容易登录一些。
    展开全文
  • 一款基于Linux开发的QQ聊天室,实现基本的在线显示,管理员设置,添加用户,删除用户,和一些聊天保存,还有对文件的操作
  • linux系统下用epoll实现的简易聊天,简单的qq。所有源码都在里面,直接可运行,分为客户端和服务器两个文件夹
  • LINUX课程设计QQ聊天

    2013-07-12 16:40:20
    接收用户输入方式为图形化界面 容许一次传送多个命令(主要是传送的数据格式支持多个命令) 容许并发对多个命令进行真真操作 私聊和群聊
  • Linux下C实现聊天

    2014-08-13 21:02:13
    一个在Linux下可以使用的聊天软件,要求至少实现如下功能: 1. 采用Client/Server架构 2. Client A 登陆聊天服务器前,需要注册自己的ID和密码 3. 注册成功后,Client A 就可以通过自己的ID和密码登陆聊天服务器 4. 多个...
  • 这几天在弄有关Linux实现socket通信方面的东西,发现了yi

    这几天在弄有关Linux下实现socket通信方面的东西,发现了一段比较好的代码,用于实现简单聊天的程序。


    服务器端代码分析:

    服务器端流程如下:

    (1)根据用户命令行输入,设置欲绑定的IP地址、端口以及listen队列大小

    (2)创建基于IPV4的数据流方式socket对象

    (3)绑定IP地址,监听网络,等待客户端连接

    (4)先阻塞等待终端输入数据,如果接收到数据,将数据发送到客户端,然后再结束socket消息,等待客户端数据,如果接收到数据,打印到终端。完成后继续循环

    以下是服务器端的代码内容:

    #include<stdio.h>
    #include<stdlib.h>
    #include<errno.h>
    #include<string.h>
    #include<sys/types.h>
    #include<netinet/in.h>
    #include<sys/socket.h>
    #include<sys/wait.h>
    #include<unistd.h>
    #include<arpa/inet.h>
    #define MAXBUF 1024
    
    int main(int argc,char *argv[])
    {
    	int pid;
    	int sockfd,new_fd;
    	socklen_t len;
    	struct sockaddr_in my_addr,their_addr;
    	unsigned int myport,lisnum;
    	char buf[MAXBUF+1];
    	if(argv[2])
    		myport=atoi(argv[2]);
    	else
    		myport=7575;
    	if(argv[3])
    		lisnum=atoi(argv[3]);
    	else
    		lisnum=5;
    	if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    	{
    		perror("socket");
    		exit(EXIT_FAILURE);
    	}
    
    	bzero(&my_addr,sizeof(my_addr));
    	my_addr.sin_family=AF_INET;
    	my_addr.sin_port=htons(myport);
    	if(argv[1])
    		my_addr.sin_addr.s_addr=inet_addr(argv[1]);
    	else
    		my_addr.sin_addr.s_addr=INADDR_ANY;
    	if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
    	{
    		perror("bind");
    		exit(EXIT_FAILURE);
    	}
    	if(listen(sockfd,lisnum)==-1)
    	{
    		perror("listen");
    		exit(EXIT_FAILURE);
    	}
    	printf("wait for connect!\n");
    	len=sizeof(struct sockaddr);
    	if((new_fd=accept(sockfd,(struct sockaddr *)&their_addr,&len))==-1)
    	{
    		perror("accept");
    		exit(EXIT_FAILURE);
    	}
    	else
    		printf("server:got connection from %s,port %d,socket %d\n",inet_ntoa(their_addr.sin_addr),ntohs(their_addr.sin_port),new_fd);
    	while(1)
    	{
    		printf("newfd=%d\n",new_fd);
    		bzero(buf,MAXBUF+1);
    		printf("input the message to send:");
    		fgets(buf,MAXBUF,stdin);
    		if(!strncasecmp(buf,"quit",4))
    		{
    			printf("i will close the connect!\n");
    			break;		
    		}
    		len=send(new_fd,buf,strlen(buf)-1,0);
    		if(len>0)
    			printf("message:%s\t send sucessful,send %dbyte!\n",buf,len);
    		else
    		{
    			printf("message'%s' send failure!errno code is %d,errno message is '%s'\n",buf,errno,strerror(errno));
    			break;	
    		}
    		bzero(buf,MAXBUF+1);
    		len=recv(new_fd,buf,MAXBUF,0);
    		if(len>0)
    			printf("message recv successful:'%s',%dByte recv\n",buf,len);
    		else
    		{
    			if(len<0)
    				printf("recv failure!errno code is %d,errno message is '%s'\n",errno,strerror(errno));
    			else
    				printf("the other one close quit\n");
    			break;
    		}
    	}
    	close(new_fd);
    	close(sockfd);
    	return 0;
    }
    

    客户器端代码分析:

    客户器端流程如下:

    (1)根据用户命令行输入,设置欲连接的服务IP地址、端口

    (2)创建基于IPV4的数据流方式socket对象

    (3)向服务器端发起连接

    (4)先阻塞等待服务器端数据,如果接收到数据,打印该数据,然后再阻塞于终端,等待终端输入数据,然后发出数据到服务端。完成后继续循环

    #include<stdio.h>
    #include<string.h>
    #include<errno.h>
    #include<sys/socket.h>
    #include<resolv.h>
    #include<stdlib.h>
    #include<netinet/in.h>
    #include<arpa/inet.h>
    #include<unistd.h>
    #define MAXBUF 1024
    int main(int argc,char **argv)
    {
    	int sockfd,len;
    	struct sockaddr_in dest;
    	char buffer[MAXBUF+1];
    	if(argc!=3)
    	{
    		printf("error format,it must be:\n\t\t%s IP port\n",argv[0]);
    		exit(EXIT_FAILURE);
    	}
    	if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
    	{
    		perror("Socket");
    		exit(errno);
    	}
    	printf("socket created\n");
    	bzero(&dest,sizeof(dest));
    	dest.sin_family=AF_INET;
    	dest.sin_port=htons(atoi(argv[2]));
    	if(inet_aton(argv[1],(struct in_addr *)&dest.sin_addr.s_addr)==0)
    	{
    		perror(argv[1]);
    		exit(errno);
    	}
    	if(connect(sockfd,(struct sockaddr *)&dest,sizeof(dest))==-1)
    	{
    		perror("Connect");
    		exit(errno);
    	}
    	printf("server connected\n");
    	while(1)
    	{
    		bzero(buffer,MAXBUF+1);
    		len=recv(sockfd,buffer,MAXBUF,0);	
    		if(len>0)
    			printf("recv successful:'%s',%d byte recv\n",buffer,len);
    		else
    		{
    			if(len<0)
    				printf("send failure,errno code is %d,err message is '%s'\n",errno,strerror(errno));
    			else
    				printf("the other one close,quit\n");
    			break;
    		}
    		bzero(buffer,MAXBUF+1);
    		printf("pls send message to send:");
    		fgets(buffer,MAXBUF,stdin);
    		if(!strncasecmp(buffer,"quit",4))
    		{
    			printf("i will quit!\n");
    			break;
    		}
    		len=send(sockfd,buffer,strlen(buffer)-1,0);
    		if(len<0)
    		{
    			printf("message '%s' send failure,errno code is %d,errno message is '%s'\n",buffer,errno,strerror(errno));
    			break;
    		}
    		else
    			printf("message:%s\tsend successful,%dbyte send!\n",buffer,len);
    	}
    	close(sockfd);
    	return 0;
    }
    



    展开全文
  • GTK+实现linux聊天室代码详解-server端

    千次阅读 2018-12-29 09:20:17
    GTK+实现linux聊天室代码详解
  • 本系统是在linux平台下,用c语言编写的非图形界面的简单的QQ聊天系统。它的主要模块有注册、登陆、私聊、群聊、查看聊天记录、查看在线用户。
  • GTK+实现linux聊天室代码详解-clientr端

    千次阅读 热门讨论 2018-12-29 09:20:30
    GTK+实现linux聊天室代码
  • C语言实现简易Linux终端版本聊天

    千次阅读 2019-09-26 16:28:46
    今天我们来实现一个简单的小项目,在这个项目中,我们将实现一个终端版的简易Linux聊天室。 实现的效果:服务器启动,监测客户端连接的个数,监测每个客户端的IP地址以及端口号,当每个客户端发送消息时,服务器上...
  • linux下的基于TCP/IP,采用socket通信的聊天室,群聊,私聊,禁言,管理员权限
  • A,B两个进程通过管道通信,互相聊天一样,然后A进程每次接收到的数据通过A1进程显示(一个新进程,用于显示A接收到的信息),A和A1间的数据传递采用共享内存,对应的有一个B1进程,用于显示B进程接收到的信息。...
  • 在基于QT的界面基础上,两个窗口通过套接字实现网络通信,所用协议包括TCP和UDP协议,为了模拟不同的计算机,建立两个虚拟机,一个虚拟机运行一个类似QQ的界面,两个界面实现类似QQ聊天
  • QQ聊天系统---linux课设

    2018-06-09 15:48:40
    QQ聊天系统,Linux课程设计,Socket编程,Client/Server模式,实现了群聊,私聊,在线人员显示等基本功能。
  • 客户端实现的具体内容:利用多线程实现,采取输入命令的方式让用户选择服务类型,根据不同的服务类型调用不同的处理函数,完成请求,利用json和自定义的上层协议完成和服务器端的数据的交互。在登陆成功之后启动一个...
  • !!!若果是发送方需要对方IP地址, !!!将“127.0.0.1”替换
  • 1. 步骤最简单,功能最少,非常稳定。假设已经安装好 Ubuntu Linux 的汉语支持点击屏幕左上角的 应用程序 > 互联网>pidgin ...可以实现的功能:QQ聊天,发送文件,QQ群聊天不可以实现的功能:好友分组,视频聊天,语
  • linux gtk 仿qq聊天程序

    千次阅读 2014-03-17 09:50:14
    Linux操作系统,且装有TCP/IP,及POP3,SMTP协议,运行服务端要装有MYSQL数据库。 创建数据库:  启动数据库 service mysqld start 进行数据库 mysql -u root -p123456 数据库密码一定要是...
  • Linux irc QQ MSN 聊天 互联网深入人心好久了,目前用电脑如果说不能上网估计是让人觉得不可思议的事了。 上网做什么呢?浏览网页和聊天占了大家多半时间吧。真正说上网学习的时间估计不到五分之一吧。 Linux下...
  • linux下也用QQ聊天

    2017-11-16 22:20:00
    经过一大番折腾后,红帽子(Linux Red Hat)终于给爱机弄上了,呵,不过倒苦了俺,机子上的那么多的MM照片全给删了,MM照片没了 倒还可以向人要,当务之急是怎么联系别人,下面就看看俺 是怎样在Linux下用QQ的...
  • 基于linux下的聊天程序设计与实现

    千次阅读 2013-11-16 13:19:29
    这是一个聊天室程序,可以实现群聊的功能,即当某个客户发出消息后,服务器和其他个客户端都能收到此消息。且能够显示客户端的用户名。但客户端退出聊天室后,服务器和其他在线客户端会有提示。
  • Linux+Tcp+聊天室+代码+文档
  • poll实现udp_qq聊天

    2015-06-17 16:56:02
    linux下通过C语言的poll函数实现udp聊天程序(同时跟多个用户进行通信,数据收发,灵活切换)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,041
精华内容 4,416
关键字:

linux实现qq聊天

linux 订阅