把基本的tutorial 在官网上过一遍.
然后自己写个telnet的聊天室, 多人none blocking的就可以了.不用和别人学,别人写的也不一定好.
另外多看看go容易犯的错误.
我们可以看到 gorilla/websocket中的examples中有一个聊天室的demo.
我们进入该项目可以看到里面有这样的一些内容
按照官方的运行方式来运行这个项目
就是这样一个简单的demo.
然后我们去看一下它的具体实现.
在这个项目中首先定义了一个hub的结构体:
我们打开main.go,main函数的源码为:
今天这一节首先会新开一个goroutine,去跑hub的run方法,run方法中一个死循环,不停地去轮询hub中的内容
如果取到了新用户,就加入到clients中,如果取到了信息,就循环所有的client,将信息写到client.send中.
而在请求路径为"/ws"的时候,他会执行一个serveWS的函数.
每当一个新的用户进来之后,首先将连接升级为长连接,然后将当前的client写到register中,由hub.run函数去做处理.然后开启两个goroutine,一个去读client中发送来的数据,一个将数据写入到所有的client中,去发送给用户.
这就是整个聊天室的实现原理.
上一节中,我们为每个连接都创建了一个goroutine来读取其中的消息,现在我们将这个读取消息的方法实现一下.
我们在application目录下新建controllers目录,并在其中创建一个MessageController.go文件.
首先我们新建一个MessageController的结构体,内容如下
这个结构体包括两个内容,一个是我们将连接放在数组之后,返回的索引,另一个是连接本身.
这个是具体的方法.
我们首先设置了一下读消息的大小、超时时间以及超时后需要的操作.
超时时间如果设置为0,那么就是永不超时.之前今天这一节直接写0,被告知需要传一个time.Time类型的数据.最终谷歌后才得到了这个值time.Time{}为"0001-01-01 00:00:00 +0000 UTC".
我们将用户手法消息的内容定义为一个结构体,然后将用户的订阅信息的json通过json.unmarshal转换成这个结构体.
之后的switch操作与我们在Swoole中的操作基本雷同,在查询到login之后,调用service中 的login方法来进行注册.
下一节中我们再介绍具体的注册逻辑.
我们在mian函数中,首先初始化配置文件,然后新建http连接.
这个方法中首先我们创建一个websocket的Upgrader实例,然后我们使用Upgrader的upgrade方法来升级一下我们的连接为长连接.
升级完成之后会返回一个*websocket.Conn的连接,我们之后所有的关于连接的操作,都是基于该conn的.
在该连接完成之后,我们将连接存放到一个名为Client的map中,以便之后管理更为方便.
之后,我们启动一个goroutine来读取连接中发送的信息内容,再根据内容进行相应的操作.
这样:
#include stdlib.h
#include stdio.h
#include errno.h
#include string.h
#include unistd.h
#include netdb.h
#include sys/socket.h
#include netinet/in.h
#include sys/types.h
#include arpa/inet.h
#include pthread.h
#define MAXLINE 100;
void *threadsend(void *vargp);
void *threadrecv(void *vargp);
int main()
{
int *clientfdp;
clientfdp = (int *)malloc(sizeof(int));
*clientfdp = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in serveraddr;
struct hostent *hp;
bzero((char *)serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
if(connect(*clientfdp,(struct sockaddr *)serveraddr,sizeof(serveraddr)) 0){
? ? printf("connect error\n");
? ? exit(1);
}
printf("connected\n");
while(1){
pthread_create(tid1,NULL,threadsend,clientfdp);
return EXIT_SUCCESS;
void *threadsend(void * vargp)
int connfd = *((int *)vargp);
int idata;
char temp[100];
//printf("me: \n ");
fgets(temp,100,stdin);
send(connfd,temp,100,0);
printf("? ? ? ? ? client send OK\n");
printf("client send\n");
return NULL;
void *threadrecv(void *vargp)
int idata = 0;
idata = recv(connfd,temp,100,0);
if(idata 0){
printf("server :\n%s\n",temp);
扩展资料:
注意事项
linux下编译多线程代码时,shell提示找不到 pthread_create函数,原因是 pthread.h不是linux系统默认加载的库文件,应该使用类似如下gcc命令进行编译:
gcc echoserver.c -lpthread -o echoserver
只要注意 -lpthread参数就可以了.
以上就是土嘎嘎小编为大家整理的go语言写个聊天室相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!