简单实现linux聊天室程序

花了很长时间用来练习掌握linux上socket的一个聊天室程序,可以实现的哦。
具体代码如下

代码一:

#ifndef _I_H

#define _I_H

#include <math.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <inttypes.h>
#include <time.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <signal.h>
#include <ncurses.h>
#include <math.h>

#define SEVR_IP   "127.0.0.1"
#define SEVR_PORT  8081
#define CNTNT_LEN  150
#define MSG_LEN   sizeof(struct msg)
#define ADDR_LEN  sizeof(struct sockaddr)
#define USR_LEN   sizeof(struct user)
#define PRT_LEN   8
#define HSTR_LEN  sizeof(struct chat_history)

/* declare Global variables */
int mainfd;/* used as chat histroy file handle*/
int sockfd;/* used as socket local handle */
int count;
struct sockaddr_in server;

/* msg is used for communicating message */
struct msg
{
  int flag; /* flag meaning:1,ordinary; 2,log msg; 3,reg msg, other,file*/
  int id_from;
  int id_to;
  char content[CNTNT_LEN];
  char append[10];
};

/* user is used information list */
struct user
{
  int id;
  char name[10];
  char password[10];
  char *p_chatlog;
  struct sockaddr user_addr;
};
/* chat_history used for reading chat history */
struct chat_history
{
  char content[CNTNT_LEN];
  char time[25];
  int to;
  int from;
  int count;
};

/* i_functions below is funtions needed by both client and sever */
extern int i_saveto_chat(struct msg *pmsg);

int i_clean_stdin ()
{
  while ('\n' == getchar())
  {
    continue;
  }

  return(0);
}

int i_print(char *pmsg, int size)
{
  int i = 1;

  for (i; i<= size; i++)
  {
    if (*pmsg != '\n')
    {
      printf("%c", *pmsg);
      pmsg ++;
    }
    else
    {
      return(0);
    }
  }

  return(0);
}
int i_input(char *p_input)
{
  char c = '\0';
  int i; 

  for (i = 0; i < CNTNT_LEN; i++)
  {
    p_input[i] = getchar();
    if (p_input[i] =='\n')
    {
      return(0);
    }
  }

  printf("you have input long enough!\n");
  return(0);
}
int i_socket(int domain, int type, int protocol)
{
  int fd; 

  if ((fd = socket(domain, type, protocol)) == -1)
  {
    perror("creat socket error:");
    exit(1);
  }

  return(fd);
}

int i_bind(int fd, const struct sockaddr *addr, int namelen)
{
  if (-1 == bind(fd, addr, namelen))
  {
    perror("i_bind error:");
    exit(1);
  }

  return (0);
}

int i_recvfrom(int fd, void *buf, size_t len, int flags,
    struct sockaddr *addr, int *size)
{
  if (-1 == recvfrom(fd, buf, len, flags, addr, size))
  {
    perror("i_recvfrom error:");
    exit(1);
  }

  return(0);
}

int i_sendto(int fd, void *buf, size_t len, int flags,
    struct sockaddr *addr, int size)
{
  if (-1 == sendto(fd, buf, len, flags, addr, size))
  {
    perror("i_sendto error");
    exit(1);
  }

  return (0);
}

int i_open(const char *pathname, int flags)
{
  int fd;
  if ((fd = open(pathname, flags)) == -1)
  {
    perror("open_failed");
    exit(1);
  }

  return (fd);
}
int i_read(int fd, void *msg, int len)
{
  if(-1 == read(fd, msg, len))
  {
    perror("i_read error");
    exit(1);
  }
  return(0);
}
int i_write(int fd, void *msg, int len)
{
  if (-1 == write(fd, msg, len))
  {
    perror("i_write error");
    exit(0);
  }
  return(0);
}

/* init a socket,file and server addr */
int i_init()
{
  mainfd = i_open("./chat_log", O_RDWR|O_CREAT);
  sockfd = i_socket(AF_INET, SOCK_DGRAM, 0);

  /* initialize server address */
  bzero(&server, sizeof(server));
  server.sin_family = AF_INET;
  inet_pton(AF_INET, "127.0.0.1", &server.sin_addr);
  server.sin_port = htons(SEVR_PORT);

  perror("init");

  return (0);
}

char *i_get_time()
{
  time_t time_now;
  time(&time_now);

  return(ctime(&time_now));
}
int i_lseek(int fd, off_t size, int position)
{
  if (-1 == lseek(fd, size, position))
  {
    perror("seek error");
    exit(1);
  }
  return(0);
}
int i_saveto_chat(struct msg *pmsg)
{
  struct chat_history hstr;

  bzero(&hstr, HSTR_LEN);
  count = count + 1;
  hstr.count =count;
  hstr.from = pmsg->id_from;
  hstr.to = pmsg->id_to;
  strncpy(hstr.content, pmsg->content, CNTNT_LEN);
  strncpy(hstr.time, i_get_time(), 25);

  i_lseek(mainfd, 0, SEEK_END);

  i_write(mainfd, &hstr, HSTR_LEN);

  return(0);
}

int i_print_history(int len, int i)
{
  struct chat_history chat_reader;
  int j;
  int position;

  bzero(&chat_reader, HSTR_LEN);
  if (i != 0)
  {
    position = len*i*HSTR_LEN;
    i_lseek(mainfd, position, SEEK_END);
  }
  else
  {
    position = len*i*HSTR_LEN;

    i_lseek(mainfd, HSTR_LEN, SEEK_SET);
  }

  for (j = 1; j <= len; j++)
  {

    i_read(mainfd, &chat_reader, HSTR_LEN);
    printf("\n#item%d:id%dto id%d \n", j,
      chat_reader.from, chat_reader.to);
    i_print(chat_reader.content, CNTNT_LEN);
    printf("\n Time:%s\n", chat_reader.time);
  }

  return(0);
}

#endif

代码二:

#include "i.h"

int user_list_fd;

/* start:initialization */
int init()
{
  i_init();

  user_list_fd = i_open("./user_list", O_RDWR|O_CREAT);

  struct user usr;
  /* init the user list file's fist user to 0*/
  memset((struct user*)&usr, '\0', sizeof(struct user));
  i_lseek(user_list_fd, 0, SEEK_SET);
  i_write(user_list_fd, (char*)&usr, USR_LEN);

  /* bind the struct sockaddr_in server to the sockfd */
  i_bind(sockfd, (struct sockaddr*)&server, ADDR_LEN);  

  struct chat_history apple; 

  bzero(&apple, HSTR_LEN);
  i_lseek(mainfd, 0, SEEK_SET);
  i_write(mainfd, &apple, HSTR_LEN);
  i_lseek(mainfd, -HSTR_LEN, SEEK_END);
  i_read(mainfd, &apple, HSTR_LEN);
  count = apple.count;

  return(0);
}
/* end:initialization */

/* start:message control */
int send_msg(struct msg *msg_recv, struct sockaddr *addr)
{
  int i;
  struct user usr;

  /* a common message come */
  printf("a ordinar message come !\n");

  i = msg_recv->id_to;
  i_lseek(user_list_fd, i*USR_LEN, SEEK_SET);
  i_read(user_list_fd, &usr, USR_LEN);
  strncpy(msg_recv->append, usr.name, 10);

  i_sendto(sockfd, msg_recv, MSG_LEN, 0,
    &(usr.user_addr), ADDR_LEN);

  printf("id%d send a message to id%d sucess!\n", msg_recv->id_from, msg_recv->id_to);

  return(0);
}
int check_login(struct msg *msg_recv, struct sockaddr *addr)
{
  int i = msg_recv->id_from;;
  struct user usr;

  /* a login requet */
  printf("a login request come!\n");

  /* get the id's information */
  i_lseek(user_list_fd, i*USR_LEN, SEEK_SET);
  i_read(user_list_fd, &usr, USR_LEN);

  int n;
  n = strcmp(usr.password, msg_recv->content);
  /* 如果验证成功,则发送成功信息 */
  if (n == 0)
  {
    /* save user new address */
    i_lseek(user_list_fd, -USR_LEN, SEEK_CUR);
    usr.user_addr = *addr;
    i_write(user_list_fd, &usr, USR_LEN);
    /* tell user pass */
    i_sendto(sockfd, (struct msg*)msg_recv, sizeof(struct msg), 0,
      &(usr.user_addr), ADDR_LEN);

  }
  else
  {
    /* 出错的话的respond */
    if (0 != n)
    {
      printf("id %d login error.\n", i);
      bzero(msg_recv->content, CNTNT_LEN);
      msg_recv->flag = -1;
      i_sendto(sockfd, (struct msg*)msg_recv, sizeof(struct msg), 0,
        &(usr.user_addr), ADDR_LEN);

    }
    return(1);
  }
  printf("Id %d login sucess!\n", i); 

  return(0);
}
int reg_user(struct msg *msg_recv, struct sockaddr *addr)
{
  struct user usr;

  printf("a regit requet come:\n");

  /* find the last user and hava the please to add a new user */
  int n;
  i_lseek(user_list_fd, -USR_LEN, SEEK_END);
  i_read(user_list_fd, &usr, USR_LEN);
  /* 把新用户的信息赋值到usr然后填入到user list file中 */
  const char *name;
  const char *password;

  name = &(msg_recv->content[0]);
  password = &(msg_recv->content[10]);
  strcpy((usr.name), name);
  strcpy(usr.password, password);
  memcpy(&(usr.user_addr),addr, ADDR_LEN);

  usr.id = (usr.id + 1);
  i_lseek(user_list_fd, 0, SEEK_END);
  i_write(user_list_fd, &usr, USR_LEN);

  msg_recv->id_from = usr.id;
  /* regist to the user list then tell the user reg success */
  i_sendto(sockfd, (struct msg*)msg_recv, sizeof(struct msg), 0,
    addr, ADDR_LEN); 

  printf("Id %d regist sucess!\n", usr.id);

  return(0);

}
int msg_cntl()
{
  struct msg msg_recv;
  struct sockaddr addr_recv;

  printf("begin listen input...\n");
  int size = ADDR_LEN;

  for (;;)
  {
    bzero(&msg_recv, MSG_LEN);
    i_recvfrom(sockfd, &msg_recv, sizeof(struct msg), 0,
      &addr_recv, &size);
    printf("message received...\n");

    i_saveto_chat(&msg_recv);

    switch (msg_recv.flag)
    {
      case 1 :
        send_msg(&msg_recv,(struct sockaddr*)&addr_recv);/* send ordinary chat */
        break;
      case 2 :
        check_login(&msg_recv, (struct sockaddr*)&addr_recv);
        break;
      case 3 :
        reg_user(&msg_recv, (struct sockaddr*)&addr_recv);
        break;
      default :
        break;
    }
  }
  return(0);
}
/* end:message control*/
/* start:exit_sys()*/
int exit_sys()
{
  close(sockfd);
  close(mainfd);
  close(user_list_fd);
  printf("exit system");
  kill(0, SIGABRT);

  exit(0);
}
/* end:exit_sys()*/

/* start:chat_history*/
int get_page_size()
{
  struct chat_history page_size_reader;

  i_lseek(mainfd, -HSTR_LEN, SEEK_END);
  i_read(mainfd, &page_size_reader, HSTR_LEN);

  return(page_size_reader.count);
}

int read_chat_history()
{
  printf("****char*history***");
  printf("(n-nextpage; p-prepage; q-quit)\n");

  int page_num;/* */
  int remains;
  int berry = get_page_size();

  page_num = berry / 8;
  remains = berry % 8;

  if (remains != 0)
    page_num ++;
  else
    page_num = page_num;

  printf("there are %d page total %d items",
    page_num, berry);

  int i = -1;

  while (1)
  {
    char flag; 

    if ((berry + i*8) >= 0)
    {
      printf("(%d~%d)\n", (berry + i*8), (berry + (i+1)*8));

      i_print_history(PRT_LEN, i);

      printf("@@@\n");
      while ('\n' == (flag = getchar()))
      {
      }

      switch (flag)
      {
        case 'p' :
          i--;
          break;
        case 'n' :
          i++;
          break;
        case 'q' :
          return(0);
        default :
          break;
      }
      if (i >= 0)
      {
        printf("have at the end!\n");
        printf("return to menu!\n");
      }
    }
    else
    {
      printf("(1~%d)\n", remains);      

      i_print_history(remains, 0);

      printf("#########over##############\n");

      return(0);
    }
  }

  return(0);
}
/* end:chat_history*/
/* start:menu*/
int menu()
{
  sleep(1);

  printf("----------help----menu---------\n");
  printf("\t r--report to user\n");
  printf("\t c--chat history\n");
  printf("\t h--help menu\n");
  printf("\t e--exit the system\n");
  printf("----------help_menu---------\n");

  int command = 0;

  printf("input command>");
  command = getchar();
  switch(command)
  {

    case 'c':
      read_chat_history();
      break;
    case 'e':
      exit_sys();
      break;
    case 'r':
      //report();
      //break;
    default :
      menu();
      break;
  }
  getchar();

  return(0);
}
/* end:menu*/
int main()
{
  init();
  pid_t pid;
  switch (pid = fork())
  {
    case -1 :
      perror("fork error\n");
      exit(1);
      break;
    case 0 :
      msg_cntl();
      break;
    default :
      menu();
      break;
  }

  return(0);
}

代码三:

#include "i.h"

#define START_PORT 8089

struct sockaddr_in my_addr;
int my_id;

int my_log();/* declare funtion*/

/* */
int i_send_msg()
{
  int id;
  struct msg the_msg;
  char end = '@';

  printf("input recver id:");
  scanf("%d", &id);
  getchar();
  printf("\ninput content:");
  i_input(the_msg.content);  

  char flag = 'y';

  if (1)
  {
    the_msg.flag = 1;
    the_msg.id_from = my_id;
    the_msg.id_to = id;

    i_sendto(sockfd, &the_msg, sizeof(struct msg), 0,
      (struct sockaddr*)&server, sizeof(struct sockaddr));

    i_saveto_chat(&the_msg); /* save to history */

    printf("send to id:%d success.\n", my_id);
    return(0);
  }
  else
    return(1);

  return(0);
}

int reply()
{
  return(0);
}
int send_file()
{
  return(0);
}
/**/
/* start:initialize */
int init()
{
  struct ifreq req;
  struct sockaddr_in *host;
  int port;

  i_init();
  /* init user addr */
  bzero(&my_addr, sizeof(struct sockaddr));
  my_addr.sin_family = AF_INET;
  strcpy(req.ifr_name, "lo");
  if ( ioctl(sockfd, SIOCGIFADDR, &req) < 0 ) /* get local ip address */
  {
    perror("get local ip error");
    exit(1);
    } 

  host = (struct sockaddr_in*)&(req.ifr_addr);
  printf("ip: %s\n", inet_ntoa(host->sin_addr));

  memcpy(&my_addr, (struct sockaddr_in*)&(req.ifr_addr),
     sizeof(struct sockaddr_in));

  port = START_PORT;

  do
  {
    port++;
    my_addr.sin_port = htons(port);
    bind(sockfd, (struct sockaddr*)&my_addr,
       sizeof(struct sockaddr));
  }
  while (errno == EADDRINUSE);

  struct chat_history apple; 

  memset(&apple, 'b', HSTR_LEN);
  i_lseek(mainfd, 0, SEEK_SET);
  apple.count = 0;
  i_write(mainfd, &apple, HSTR_LEN);
  i_lseek(mainfd, -HSTR_LEN, SEEK_END);
  i_read(mainfd, &apple, HSTR_LEN);
  count = apple.count;

  printf("port:%d\n", port);
  printf("init successful!!!\n"); 

  return(0);

}
/* end:initialize */
/* start:chat_history*/
int get_page_size()
{
  struct chat_history page_size_reader;

  i_lseek(mainfd, -HSTR_LEN, SEEK_END);
  i_read(mainfd, &page_size_reader, HSTR_LEN);

  return(page_size_reader.count);
}

int read_chat_history()
{
  printf("****char*history***");
  printf("(n-nextpage; p-prepage; q-quit)\n");

  int page_num;/* */
  int remains;
  int berry = get_page_size();

  page_num = berry / 8;
  remains = berry % 8;

  if (remains != 0)
    page_num ++;
  else
    page_num = page_num;

  printf("there are %d page total %d items",
    page_num, berry);

  int i = -1;

  while (1)
  {
    char flag; 

    if ((berry + i*8) >= 0)
    {
      printf("(%d~%d)\n", (berry + i*8), (berry + (i+1)*8));

      i_print_history(PRT_LEN, i);

      printf("@@@\n");
      while ('\n' == (flag = getchar()))
      {
      }

      switch (flag)
      {
        case 'p' :
          i--;
          break;
        case 'n' :
          i++;
          break;
        case 'q' :
          return(0);
        default :
          break;
      }
      if (i >= 0)
      {
        printf("have at the end!\n");
        printf("return to menu!\n");
      }
    }
    else
    {
      printf("(1~%d)\n", remains);      

      i_print_history(remains, 0);

      printf("#########over##############\n");

      return(0);
    }
  }

  return(0);
}
/* end:chat_history*/
/* start:exit_sys*/
void exit_sys()
{
  close(sockfd);
  close(mainfd);
  kill(0, SIGABRT);

  exit(0);
}
/* end:exit_sys*/

/* start:menu*/
int print_menu()
{
  printf("\n--------------help--menu----------------\n");
  printf("\t h--help munu\n");
  printf("\t s--send message\n");
  printf("\t r--reply to\n");
  printf("\t c--chat history\n");
  printf("\t f--send files\n");
  printf("\t e--exit the system\n");
  printf("----------------help--menu----------------\n");
}
int get_input(char *command)
{
  printf(">");
  scanf("%c", command);

  return(1);
}
int menu()
{
  /* to avoid the output at mixed with the sub process */
  sleep(1);

  print_menu();

  char command;

  while (1 == get_input(&command))
  {
    switch(command)
    {
      case 'h':
        print_menu();
        break;
      case 's':
        i_send_msg();
        break;
      case 'r':
        reply();
        break;
      case 'f':
        send_file();
        break;
      case 'c':
        read_chat_history();
        break;
      case 'e':
        exit_sys();
        break;
      default :
        printf(">");
        break;
    }
  }
  return(0);
}
/* end:menu*/
/* start:message contol :send_msg and recv_msg */
int ordnary_msg_recv(struct msg *pmsg)
{
  char time_info[25];
  char end_symble;
  end_symble = '&';

  /* handle the msg */
  printf("Message:from %s(id%d) to U:\n", pmsg->append, pmsg->id_from);
  i_print(pmsg->content, MSG_LEN);
  printf("\n\t%s", i_get_time());

  return(0);
}
int file_msg_recv(struct msg *pmsg)
{
}
int handle_msg(struct msg *pmsg)
{
  if (pmsg->flag == 1)
  {
    ordnary_msg_recv(pmsg);
    return(0);
  }
  else if (pmsg->flag >= 4)
  {
    file_msg_recv(pmsg);
    return(0);
  }
  return(0);
}
int listen_msg()
{
  struct msg msg_recv;
  struct sockaddr addr_recv;
  int len = ADDR_LEN;

  printf("begin listen...\n");

  for ( ; ; )
  {
    i_recvfrom(sockfd, &msg_recv, MSG_LEN, 0,
       &addr_recv, &len);

    i_saveto_chat(&msg_recv); /* save to history */

     ordnary_msg_recv(&msg_recv);
  }
}

/* end:message contol*/

/* start:log process :login and regist */
int login()
{
  /* input id:*/
  printf("*****login>>\n");
  printf("id:");
  scanf("%d", &my_id);
  /* input password*/
  char password[15];
  printf("\npassword(*less 15 char):");
  scanf("%s", password);
  getchar();

  /* send login information */
  struct msg log_msg;

  bzero(&log_msg, MSG_LEN);
  log_msg.flag = 2;
  log_msg.id_from = my_id;
  log_msg.id_to = 0;
  strncpy(log_msg.content, password, 15);

  i_saveto_chat(&log_msg); /* save to history */

  i_sendto(sockfd, (struct msg*)&log_msg, MSG_LEN, 0,
    (struct sockaddr*)&server, sizeof(struct sockaddr));
//printf("log_msg : %d\n", log_msg.id_from);
//printf("password: %s\n", log_msg.content);
  /* after input msg ,wait for server respond*/
  struct sockaddr in_addr;
  int len = ADDR_LEN;
  i_recvfrom(sockfd, (struct msg*)&log_msg, MSG_LEN,0,
    &in_addr, &len);
  if (2 == log_msg.flag)
  {
    printf("login success\n");
    return(0);
  }
  else
  {
    printf("login error:%s\n", log_msg.content);
    printf("please relog..\n");
    menu();
  }

  return (0);
}
int regist()
{
  printf("*****regist>>\n");
  /* input chat name */
  char name[10];

  bzero(name, 10);
  printf("input your chat name(less 8 char):");
  scanf("%s", name);

  //name[9] = ';';     /* add a ; symbol in the end of name */
  /* input password */
  char password[15];

  bzero(password, 15);
  printf("\ninput your password(less 14 char):");
  scanf("%s", password);

  /* send regist information*/
  struct msg reg_msg;

  bzero(&reg_msg, MSG_LEN);
  reg_msg.flag = 3;
  reg_msg.id_from = 0;
  reg_msg.id_to = 0;
  bzero(reg_msg.content, CNTNT_LEN);
  strncpy(reg_msg.content, name, 10);
  strncpy(&(reg_msg.content[10]), password, 15);
  reg_msg.content[25] = '\n';

  i_saveto_chat(&reg_msg); /* save to history */

  /* send regist informatin to server */
  i_sendto(sockfd, (struct msg*)&reg_msg, sizeof(struct msg), 0,
    (struct sockaddr*)&server, ADDR_LEN);
  /* after input msg ,wait for server respond*/
  printf("wating for server reply...\n");

  struct sockaddr in_addr;
  struct msg msg_back;
  int len = ADDR_LEN;

  bzero(&in_addr, ADDR_LEN);
  bzero(&msg_back, MSG_LEN);
  i_recvfrom(sockfd,(struct msg*)&msg_back, MSG_LEN,0,
    &in_addr, &len);

  /* check whether pass */
  if (3 != msg_back.flag)
  {
    printf("error: %s \n", msg_back.content);
    exit(1);
  }
  else
    my_id = msg_back.id_to;
    printf("congratulate! you have regist"
      "id %s(id %d) success\n", msg_back.content, msg_back.id_to);

    login();

  return(0);
}

int my_log()
{
  /* choose login or regist*/
  char flag;
  printf("are you want login or regist(l/r)\n");
  scanf("%c", &flag);
  getchar();
  switch (flag){
    case 'l' :
      login();
      break;
    case 'r' :
      regist();
      break;
    default :
      printf("error input\n");
      my_log();
      break;
  }
  return (0);
}
/* end:log */

int main()
{
  init();
  printf("\n************welcome!************\n");
  my_log();

  pid_t pid;

  switch (pid = fork())
  {
    case -1 :
      perror("fork error!\n");
      exit(1);
      break;
    case 0 :
      listen_msg();
      break;
    default :
      menu();
      break;
  }
}

希望本文所述对大家实现linux多人聊天室程序。

(0)

相关推荐

  • Python聊天室实例程序分享

    上一篇 我们学习了简单的Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的理解. 一.聊天室程序需求 我们要实现的是简单的聊天室的例子,就是允许多个人同时一起聊天,每个人发送的消息所有人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.如下图: 我们要实现的有两部分: Chat Server:聊天服务器,负责与用户建立 Socket 连接,并将某个用

  • 小小聊天室Python代码实现

    相对于Java方式的聊天室,Python同样可以做得到.而且可以做的更加的优雅.想必少了那么多的各种流的Python Socket,你一定会喜欢的. 至于知识点相关的内容,这里就不多说了. UDP方式 服务器端 # coding:utf-8 # __author__ = 'Mark sinoberg' # __date__ = '2016/7/7' # __Desc__ = 创建一个简单的套接字监听请求 import socket HOST = '192.168.59.255' PORT = 9

  • JavaEE7+Websockets+GlassFish4打造聊天室

    在客户机和服务器之间建立单一的双向连接,这就意味着客户只需要发送一个请求到服务端,那么服务端则会进行处理,处理好后则将其返回给客户端,客户端则可以在等待这个时间继续去做其他工作,整个过程是异步的.在本系列教程中,将指导用户如何在JAVA EE 7的容器GlassFish 4中,使用JAVA EE 7中的全新的解析Json API(JSR-353),以及综合运用jQuery和Bootstrap.本文要求读者有一定的HTML 5 Websocket的基础原理知识. 效果图 我们先来看下在完成这个教程

  • php实现简易聊天室应用代码

    核心逻辑 在定义应用程序的核心功能之前,先来看一看聊天应用程序的基本外观,如以下截图所示: 通过聊天窗口底部的输入框输入聊天文本.点击Send按钮,就开始执行函数set_chat_msg.这是一个基于Ajax的函数,因此无需刷新页面就可以将聊天文本发送到服务器.程序在服务器中执行chat_send_ajax.php以及用户名和聊天文本. // // Set Chat Message // function set_chat_msg() { if(typeof XMLHttpRequest !=

  • Redis实现多人多聊天室功能

    本文为大家分享了Redis支持多人多聊天室功能的设计代码,供大家参考,具体内容如下 设计原理 左边的一个数据域,代表两个聊天室,聊天室id分别是827,729 在聊天室827里,有2个人,分别是jason22,jeff24他们分别已经阅读过聊天室内的id为5和6的消息 右边的一个数据域,代表了用户在不同的聊天室,jason22参与了827与729聊天室,在这两个聊天室里,他分别阅读到了id为5和id为10的消息 另外827聊天室内id为5的消息与729聊天室内id为5的消息不一样. 同时还有三个

  • Asp.net使用SignalR实现聊天室的功能

    一.引言 在前一篇文章<Asp.net使用SignalR实现酷炫端对端聊天功能>中,我向大家介绍了如何实现实现端对端聊天的功能的,在这一篇文章中将像大家如何使用SignalR实现群聊这样的功能. 二.实现思路 要想实现群聊的功能,首先我们需要创建一个房间,然后每个在线用户可以加入这个房间里面进行群聊,我们可以为房间设置一个唯一的名字来作为标识.那SignalR类库里面是否有这样现有的方法呢?答案是肯定的. // IGroupManager接口提供如下方法 // 作用:将连接ID加入某个组 //

  • Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室

    为更好的运用这两天学到的Ajax的相关的知识,就做了个简单的在线网络聊天室. 思路 实现聊天室,基本上就是通过Ajax来传递数据,让PHP来实现对数据的差入和查找,再交给前端JavaScript实现页面的更新,达到即时聊天的功能. 消息显示区 消息显示区就是一个DIV块,我们会借助Ajax获取到服务器端信息之后,使用JavaScript来更新页面. <h3>消息显示区</h3> <div id="up"> </div> <hr /&

  • ASP建立一个简单的聊天室

    经过一个阶段的asp学习,下面我们结合所学过的内容建立一个最简单的聊天室,虽然很简单,但是大家可以通过它来掌握一个聊天室建立的基本过程,并且可以不断的完善其功能. 下面介绍其主要步骤: 1,添加Global.asa文件里面的代码.这部分代码主要处理Application_onStart事件,在此事件中,定义了一个有15个元素的数据,并把它赋给了一个Application对象的属性.Global.asa文件的内容如下. <SCRIPT LANGUAGE="VBScript" RUN

  • Android编写简单的聊天室应用

    最近写了一个简单的聊天室应用,可以发送表情,更改头像这些功能.主要技术点就是怎样把表情图片放到textview等Ui控件中展示.这里废话不多说,下面是效果图: 这里主要讲下怎样把文本替换到表情,先说下思路,首先我们的图片是保存在本地资源目录drawable中而所有的资源文件都是R这个类来管理,所以我们可以利用正则表达式找出图片id包装成ImageSpan然后把ImageSpan放到SpannableString中,最后把SpannableString放入edittext中,下面是源码: pack

  • java实现一个简单TCPSocket聊天室功能分享

    本文实例为大家分享了java实现TCPSocket聊天室功能的相关代码,供大家参考,具体内容如下 1.TCPserver.java import java.net.*; import java.io.*; import java.util.*; import java.util.concurrent.*; public class TCPserver{ private static final int SERVERPORT = 8888; private ServerSocket MyServe

随机推荐