C++实现多人聊天室

本文实例为大家分享了C++实现多人聊天室的具体代码,供大家参考,具体内容如下

UDP

服务端代码:

// Test_Console.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <Windows.h>
#include <thread>
#include <cstdio>

using namespace std;

#pragma region 全局变量

SOCKET server;     // 服务端套接字
sockaddr_in sai_server;   // 服务端信息(ip、端口)

// 消息格式
struct umsg {
 int type;    // 协议(1:加入 2:退出 3:发消息)
 char name[64];   // 用户名字
 char text[512];   // 文本信息
};

// 客户端链表
typedef struct ucnode {
 sockaddr_in addr;  // 客户端的地址和端口号
 umsg msg;    // 客户端传来的消息
 ucnode* next;
} *ucnode_t;

#pragma endregion

#pragma region 依赖函数

// 链表插入数据
ucnode* insertNode(ucnode* head, sockaddr_in addr,umsg msg) {
 ucnode* newNode = new ucnode();
 newNode->addr = addr;
 newNode->msg = msg;
 ucnode* p = head;
 if (p == nullptr) {
  head = newNode;
 }
 else {
  while (p->next != nullptr) {
   p = p->next;
  }
  p->next = newNode;
 }
 return head;
}

// 链表删除数据
ucnode* deleteNode(ucnode* head, umsg msg) {
 ucnode* p = head;
 if (p == nullptr) {
  return head;
 }
 if (strcmp(p->msg.name, msg.name) == 0){
  head = p->next;
  delete p;
  return head;
 }
 while (p->next != nullptr && strcmp(p->next->msg.name, msg.name) != 0) {
  p = p->next;
 }
 if (p->next == nullptr) {
  return head;
 }
 ucnode* deleteNode = p->next;
 p->next = deleteNode->next;
 delete deleteNode;
 return head;
}

#pragma endregion

int main()
{
 cout << "我是服务端" << endl;

 // 初始化 WSA ,激活 socket
 WSADATA wsaData;
 if (WSAStartup(
  MAKEWORD(2, 2),   // 规定 socket 版本为 2.2
  &wsaData    // 接收关于套接字的更多信息
  )) {
  cout << "WSAStartup failed : " << GetLastError() << endl;
 }

 // 初始化 socket、服务器信息
 server = socket(
  AF_INET,   // IPV4
  SOCK_DGRAM,  // UDP
  0    // 不指定协议
  );
 sai_server.sin_addr.S_un.S_addr = 0; // IP地址
 sai_server.sin_family = AF_INET;  // IPV4
 sai_server.sin_port = htons(8090);  // 传输协议端口

 // 本地地址关联套接字
 if (bind(
  server,      // 要与本地地址绑定的套接字
  (sockaddr*)&sai_server,  // 用来接收客户端消息的 sockaddr_in 结构体指针
  sizeof(sai_server)
  )) {
  cout << "bind failed : " << GetLastError() << endl;
  WSACleanup();
 }

 // 初始化客户端链表
 ucnode* listHead = new ucnode();
 listHead->next = nullptr;
 ucnode* lp = listHead;

 // 监听消息
 while (1) {
  // 接收来自客户端的消息
  umsg msg;
  int len_client = sizeof(sockaddr);
  recvfrom(
   server,      // 本地套接字
   (char*)&msg,     // 存放接收到的消息
   sizeof(msg),
   0,        // 不修改函数调用行为
   (sockaddr*)&sai_server,  // 接收客户端的IP、端口
   &len_client     // 接收消息的长度,必须初始化,否则默认为0 收不到消息
  );

  // sin_addr 转 char[](char[] 转 sin_addr 使用 inet_top)
  char arr_ip[20];
  inet_ntop(AF_INET, &sai_server.sin_addr, arr_ip, 16);

  // 处理消息(1:用户登录,2:用户退出,3:普通会话)
  switch (msg.type) {
  case 1:
   insertNode(listHead, sai_server, msg);
   cout << "[" << arr_ip << ":" << ntohs(sai_server.sin_port) << "] " << msg.name << ":" << "---登录---" << endl;
   break;
  case 2:
   deleteNode(listHead, msg);
   cout << "[" << arr_ip << ":" << ntohs(sai_server.sin_port) << "] " << msg.name << ":" << "---退出---" << endl;
   break;
  case 3:
   cout << "[" << arr_ip << ":" << ntohs(sai_server.sin_port) << "] " << msg.name << ":" << msg.text << endl;
   // 更新 msg.text
   lp = listHead;
   while (lp) {
    if (strcmp(lp->msg.name, msg.name) == 0) {
     strncpy(lp->msg.text, msg.text, sizeof(msg.text));
     lp->msg.type = msg.type;
     break;
    }
    lp = lp->next;
   }
   // 向其他客户端广播(除自己之外)
   lp = listHead;
   while (lp) {
    if (strcmp(lp->msg.name,"") != 0 && strcmp(lp->msg.name, msg.name) != 0) {
     sendto(
      server,      // 本地套接字
      (char*)&msg,     // 消息结构体
      sizeof(msg),
      0,        // 不修改函数调用行为
      (sockaddr*) & lp->addr,  // 目标客户端地址
      sizeof(lp->addr)
     );
    }
    lp = lp->next;
   }
   break;
  }
 }

 // 禁用 socket
 WSACleanup();

 getchar();
    return 0;
}

客户端代码:

// Test_Console_2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <Windows.h>
#include <thread>
#include <cstdio>
#include <string>

#pragma comment(lib,"ws2_32.lib")

using namespace std;

#pragma region 全局变量

SOCKET client;     // 客户端套接字
sockaddr_in sai_client;   // 存放客户端地址、端口
sockaddr_in sai_server;   // 存放服务端发送的消息

// 发送和接收的信息体
struct umsg {
 int type;     // 协议(1:登录,2:退出,3:发消息)
 char name[64];    // 用户名字
 char text[512];    // 文本
};

#pragma endregion

#pragma region 依赖函数

// 监听服务器消息
void recvMessage()
{
 while (1){
  umsg msg;
  int len_server = sizeof(sockaddr);
  int len = recvfrom(client, (char*)&msg,sizeof(msg),0,(sockaddr*)&sai_server,&len_server);

  cout << msg.name << ": " << msg.text << endl;
 }
}

#pragma endregion

int main()
{
 cout << "我是客户端" << endl;

 // 初始化 WSA ,激活 socket
 WSADATA wsaData;
 if (WSAStartup(
  MAKEWORD(2, 2),  // 规定 socket 版本
  &wsaData   // 接收 socket 的更多信息
  )) {
  cout << "WSAStartup failed : " << GetLastError() << endl;
 }

 // 初始化 socket、客户端信息
 client = socket(
  AF_INET,  // IPV4
  SOCK_DGRAM,  // UDP
  0    // 不指定协议
  );
 sai_client.sin_family = AF_INET;         // IPV4
 inet_pton(AF_INET, "192.168.1.105", &sai_client.sin_addr);   // 服务器 IP地址
 sai_client.sin_port = htons(8090);         // 端口

 // 输入用户名
 string name;
 getline(cin, name);

 // 发送登录消息
 umsg msg;
 msg.type = 1;
 strncpy_s(msg.name, sizeof(msg.name), name.c_str(), 64);
 strncpy_s(msg.text, sizeof(msg.text), "", 512);
 sendto(
  client,       // 本地套接字
  (char*)&msg,      // 发送的消息
  sizeof(msg),
  0,         // 不修改函数调用行为
  (sockaddr*) & sai_client,  // 消息目标
  sizeof(sai_client)
 );

 // 接收服务器消息
 HANDLE h_recvMes = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)recvMessage, 0, 0, 0);
 if (!h_recvMes) { cout << "CreateThread failed :" << GetLastError() << endl; }

 // 发送消息
 while (1) {
  string content;
  getline(cin, content);

  // 如果是退出消息
  if (content == "quit") {
   msg.type = 2;
   sendto(client, (char*)&msg, sizeof msg, 0, (struct sockaddr*) & sai_client, sizeof(sai_client));
   closesocket(client);
   WSACleanup();
   return 0;
  }

  // 如果是会话消息
  msg.type = 3;
  strncpy_s(msg.text, sizeof(msg.text), content.c_str(), 512);
  sendto(
   client,       // 本地套接字
   (char*)&msg,      // 要发送的消息
   sizeof(msg),
   0,         // 不修改函数调用行为
   (sockaddr*) & sai_client,   // 发送目标
   sizeof(sai_client)
  );
 }

    getchar();
    return 0;
}

效果图:

TCP

服务器代码:

// Test_Console.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <Windows.h>
#include <thread>
#include <cstdio>

using namespace std;

#pragma region 全局变量

SOCKET server;    // 本地套接字
sockaddr_in sai_server;  // 存放服务器IP、端口

// 消息格式
struct umsg {
 int type;    // 协议(1:登录,2:退出,3:发消息)
 char name[64];   // 用户名字
 char text[512];   // 文本信息
};

// 客户端信息
struct clientInfo {
 SOCKET client;
 sockaddr_in saddr;
 umsg msg;
};

// 客户端链表
typedef struct ucnode {
 clientInfo cInfo;
 ucnode* next;
} *ucnode_t;

ucnode* listHead;  // 客户端链表头
ucnode* lp;    // 客户端链表指针

#pragma endregion

#pragma region 依赖函数

// 链表插入数据
ucnode* insertNode(ucnode* head,SOCKET client, sockaddr_in addr, umsg msg) {
 ucnode* newNode = new ucnode();
 newNode->cInfo.client = client;
 newNode->cInfo.saddr = addr;
 newNode->cInfo.msg = msg;
 ucnode* p = head;
 if (p == nullptr) {
  head = newNode;
 }
 else {
  while (p->next != nullptr) {
   p = p->next;
  }
  p->next = newNode;
 }
 return head;
}

// 链表删除数据
ucnode* deleteNode(ucnode* head, SOCKET client) {
 ucnode* p = head;
 if (p == nullptr) {
  return head;
 }
 if (p->cInfo.client == client) {
  head = p->next;
  delete p;
  return head;
 }
 while (p->next != nullptr && p->next->cInfo.client != client) {
  p = p->next;
 }
 if (p->next == nullptr) {
  return head;
 }
 ucnode* deleteNode = p->next;
 p->next = deleteNode->next;
 delete deleteNode;
 return head;
}

// 接收客户端消息(某个)
void recvMessage(PVOID pParam) {
 clientInfo* cInfo = (clientInfo*)pParam;

 while (1) {
  // 接收来自客户端的消息
  umsg msg;
  int len_client = sizeof(sockaddr);
  int ret_recv = recv(
   cInfo->client, // 本地套接字
   (char*)&msg, // 存放接收的消息
   sizeof(msg), // 消息大小
   0    // 不修改函数调用行为
  );
  if (ret_recv <= 0) { cout << msg.name << "断开连接: " << GetLastError() << endl; break; }
  cInfo->msg = msg;

  // sin_addr 转 char[](char[] 转 sin_addr 使用 inet_top)
  char arr_ip[20];
  inet_ntop(AF_INET, &cInfo->saddr.sin_addr, arr_ip, 16);

  // 处理消息(1:登录,2:退出,3:会话)
  switch (cInfo->msg.type) {
  case 1:
   // 插入数据到链表
   insertNode(listHead,cInfo->client, cInfo->saddr,cInfo->msg);
   // 打印消息
   cout << "[" << arr_ip << ":" << ntohs(cInfo->saddr.sin_port) << "] " << msg.name << ":" << "---登录---" << endl;
   break;
  case 2:
   // 从链表删除数据
   deleteNode(listHead, /*cInfo->msg*/cInfo->client);
   // 打印消息
   cout << "[" << arr_ip << ":" << ntohs(cInfo->saddr.sin_port) << "] " << msg.name << ":" << "---退出---" << endl;
   break;
  case 3:
   // 打印消息
   cout << "[" << arr_ip << ":" << ntohs(cInfo->saddr.sin_port) << "] " << msg.name << ":" << cInfo->msg.text << endl;
   // 向其他客户端广播(除自己之外)
   lp = listHead;
   while (lp) {
    if (strcmp(lp->cInfo.msg.name, "") != 0 && strcmp(lp->cInfo.msg.name, cInfo->msg.name) != 0) {
     send(
      lp->cInfo.client,  // 本地套接字
      (char*)&cInfo->msg,  // 发送的消息
      sizeof(cInfo->msg),  // 消息大小
      0      // 不指定调用方式
     );
     int error_send = GetLastError();
     if (error_send != 0) { cout << "send failed:" << error_send << endl; }
    }
    lp = lp->next;
   }
   break;
  }
 }
}

#pragma endregion

int main()
{
 cout << "我是服务端" << endl;

 // 初始化 WSA ,激活 socket
 WSADATA wsaData;
 if (WSAStartup(
  MAKEWORD(2, 2),   // 规定 socket 版本为 2.2
  &wsaData    // 接收关于套接字的更多信息
 )) {
  cout << "WSAStartup failed : " << GetLastError() << endl;
 }

 // 初始化 socket、服务器信息
 server = socket(
  AF_INET,   // IPV4
  SOCK_STREAM, // TCP
  0    // 不指定协议
 );
 sai_server.sin_addr.S_un.S_addr = 0; // IP地址
 sai_server.sin_family = AF_INET;  // IPV4
 sai_server.sin_port = htons(8090);  // 传输协议端口

 // 本地地址关联套接字
 if (bind(
  server,      // 要与本地地址绑定的套接字
  (sockaddr*)&sai_server,  // 用来接收客户端消息的 sockaddr_in 结构体指针
  sizeof(sai_server)
 )) {
  cout << "bind failed : " << GetLastError() << endl;
  WSACleanup();
 }

 // 套接字进入监听状态
 listen(
  server,  // 本地套接字
  SOMAXCONN // 挂起连接队列的最大长度,SOMAXCONN:最大合理值
 );

 // 初始化客户端链表
 listHead = new ucnode();
 listHead->next = nullptr;
 lp = listHead;

 // 接收消息
 while (1) {
  // 接收登录消息(首次连接是触发,之后发送消息不触发)
  clientInfo* cInfo = new clientInfo();
  int len_client = sizeof(sockaddr);
  cInfo->client = accept(server, (sockaddr*) &cInfo->saddr, &len_client);
  if (GetLastError() != 0) { continue; }

  // 接收登录者的消息(每个客户端对应一个线程)
  HANDLE h_recvMes = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)recvMessage, cInfo, 0, 0);
  if (!h_recvMes) { cout << "CreateThread failed :" << GetLastError() << endl; }
 }

 // 禁用 socket
 WSACleanup();

 getchar();
    return 0;
}

客户端代码:

// Test_Console_2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <Windows.h>
#include <thread>
#include <cstdio>
#include <string>

#pragma comment(lib,"ws2_32.lib")

using namespace std;

#pragma region 全局变量

SOCKET client;     // 本地套接字
sockaddr_in sai_client;   // 存放客户端IP地址、端口

// 消息格式
struct umsg {
 int type;     // 协议(1:登录,2:退出,3:发消息)
 char name[64];    // 用户名字
 char text[512];    // 文本
};

#pragma endregion

#pragma region 依赖函数

// 监听服务器消息
void recvMessage()
{
 while (1){
  umsg msg;
  int ret_recv = recv(
   client,   // 本地套接字
   (char*)&msg, // 存放接收的消息
   sizeof(msg), // 消息大小
   0    // 不指定调用方式
  );
  if (ret_recv <= 0) { cout << "recv failed: " << GetLastError() << endl; break; }

  // 打印消息
  cout << msg.name << ": " << msg.text << endl;
 }
}

#pragma endregion

int main()
{
 cout << "我是客户端" << endl;

 // 初始化 WSA ,激活 socket
 WSADATA wsaData;
 if (WSAStartup(
  MAKEWORD(2, 2),  // 规定 socket 版本
  &wsaData   // 接收 socket 的更多信息
 )) {
  cout << "WSAStartup failed : " << GetLastError() << endl;
 }

 // 初始化 socket、客户端信息
 client = socket(
  AF_INET,  // IPV4
  SOCK_STREAM, // TCP
  0    // 不指定协议
 );
 sai_client.sin_family = AF_INET;         // IPV4
 inet_pton(AF_INET, "192.168.1.100", &sai_client.sin_addr);   // 服务器 IP地址
 sai_client.sin_port = htons(8090);         // 端口

 // 连接服务器
 int ret_connect = connect(
  client,      // 本地套接字
  (sockaddr*) &sai_client,  // 目标
  sizeof(sai_client)
 );if (ret_connect != 0) { cout << "connect failed:" << GetLastError() << endl; }

 // 输入用户名
 umsg msg;
 msg.type = 1;
 string name;
 getline(cin, name);
 strncpy_s(msg.name, sizeof(msg.name), name.c_str(), 64);
 strncpy_s(msg.text, sizeof(msg.text), "", 512);

 // 发送登录消息
 send(
  client,   // 本地套接字
  (char*)&msg, // 发送的消息
  sizeof(msg), // 消息大小
  0    // 不指定调用方式
 );
 int error_send = GetLastError();
 if (error_send != 0) { cout << "send failed:" << error_send << endl; }

 // 接收服务器消息
 HANDLE h_recvMes = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)recvMessage, 0, 0, 0);
 if (!h_recvMes) { cout << "CreateThread failed :" << GetLastError() << endl; }

 // 发送消息
 while (1) {
  string content;
  getline(cin, content);

  // 退出消息
  if (content == "quit") {
   msg.type = 2;
   send(
    client,   // 本地套接字
    (char*)&msg, // 发送的消息
    sizeof(msg), // 消息大小
    0    // 不指定调用方式
   );
   error_send = GetLastError();
   if (error_send != 0) { cout << "send failed:" << error_send << endl; }
   closesocket(client);
   WSACleanup();
   return 0;
  }

  // 会话消息
  msg.type = 3;
  strncpy_s(msg.text, sizeof(msg.text), content.c_str(), 512);
  send(
   client,   // 本体套接字
   (char*)&msg, // 发送的消息
   sizeof(msg), // 消息大小
   0    // 不指定调用方式
  );
  error_send = GetLastError();
  if (error_send != 0) { cout << "send failed:" << error_send << endl; }

 }

    getchar();
    return 0;
}

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++实现Window环境聊天室功能

    C++ Window环境聊天室,供大家参考,具体内容如下 最近闲来无事,想学习一下C++的并发编程和Socket信息传输,故以聊天室为载体进行学习.话不多说,代码开干. 聊天室分为多个客户端和一个服务器.服务器负责接收各个客户端传来的信息,然后转发给各个客户端,起到"中介"的作用:而客户端可以发送消息,并接收消息. 1.服务端 根据上述所说,一个服务器需要做的事: ① 接受新的客户端连接请求 ② 聆听各个已连接的客户端的新消息 ③ 将收到的信息逐个传送给各个已连接的服务器 所以,我设置

  • C++ SOCKET多线程实现聊天小程序

    本文实例为大家分享了C++ SOCKET多线程实现聊天小程序的具体代码,供大家参考,具体内容如下 TCP/IP协议与SOCKET 什么是网络协议? 计算机网络中,各个实体之间的数据交换必须遵守事先约定好的规则,这些规则就称为协议. 网络协议的组成要素有: 1.语法,数据与控制信息的结构或格式 2.语义:需要发出何种控制信息,完成哪些动作以及做出何种响应 3.时序:事件实现顺序的详细说明 在一个网络协议中,通信的实体的相同层次的结构必须执行相同的协议,这是协议的对等性原则. TCP/IP体系结构与

  • C++实现聊天小程序

    C++写一个游戏聊天服务器,供大家参考,具体内容如下 最近学习网络编程写了个聊天小程序,写个博客记录下自己的代码 涉及的技术: c++网络编程 c++多线程 c++ STL 设计原理 以一个结构体的形式存储客户端,用vector存取存在的客户端,开启多线程处理逻辑 服务器允许登陆多个客户端,允许公屏聊天也允许私聊,默认情况下属于公屏聊天,若想私聊,格式为"@用户名+要发送的消息":运行效果如下图: 服务器实现 #include "stdafx.h" #include

  • 使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室

    一,利用Node搭建静态服务器 这个是这个项目的底层支撑部分.用来支持静态资源文件像html, css, gif, jpg, png, javascript, json, plain text等等静态资源的访问.这里面是有一个mime类型的文件映射. mime.js /** * mime类型的 map * @ author Cheng Liufeng * @ date 2014/8/30 * 当请求静态服务器文件的类型 html, css, gif, jpg, png, javascript,

  • 基于Nodejs利用socket.io实现多人聊天室

    socket.io简介 在Html5中存在着这样的一个新特性,引入了websocket,关于websocket的内部实现原理可以看这篇文章,这篇文章讲述了websocket无到有,根据协议,分析数据帧的头,进行构建websocket.虽然代码短,但可以很好地体现websocket的原理. ,这个特性提供了浏览器端和服务器端的基于TCP连接的双向通道.但是并不是所有的浏览器都支持websocket特性,故为了磨平浏览器间的差异,为开发者提供统一的接口,引入了socket.io模块.在不支持webs

  • nodejs+express搭建多人聊天室步骤

    前言 本文主要是笔者在学习node的时候,作为练手的一个小项目,花了几天空余时间,边码边写教程的一个过程.适用于对node理论知识看的多,实战少的同学,那么现在就让我们开始吧! 准备工作 新建一个文件夹 chatroom 在终端输入以下命令,按照步骤npm(没装过的去官网安装下node和npm)会自动给你生成一个package.json文件 安装express和socket.io package.json文件如下: //package.json { "name": "chat

  • 利用GO语言实现多人聊天室实例教程

    前言 运用go里面的net包中的相关方法来实现一个基于tcp的简单多人聊天室,用一个服务器来管理,主要反馈客户端是否连接成功并显示客户端输入的内容,并且发送给每一个在服务器上连接的客服端,下面话不多说了,来一起看看详细的介绍吧. 示例代码 服务器代码 // server package main import ( "fmt" "net" ) var ConnMap map[string]*net.TCPConn func checkErr(err error) in

  • Java基于中介者模式实现多人聊天室功能示例

    本文实例讲述了Java基于中介者模式实现多人聊天室功能.分享给大家供大家参考,具体如下: 一 模式定义 中介者模式,用一个中介对象来封装一系列对象之间的交互,使各个对象中不需要显示地引用其他对象实例,从而降低各个对象之间的耦合度,并且可以独立地改变对象间的交互关系. 二 模式举例 1 模式分析 我们借用多人聊天室来说明这一模式 2 中介模式静态类图 3 代码示例 3.1中介者接口--IMediator package com.demo.mediator; import com.demo.coll

  • Go语言多人聊天室项目实战

    本文为大家分享了Go语言多人聊天室项目实战,供大家参考,具体内容如下 功能需求 实现单撩 实现群撩 实现用户上线的全网通知 实现用户昵称 实现聊天日志的存储和查看 服务端实现 type Client struct { conn net.Conn name string addr string } var ( //客户端信息,用昵称为键 //clientsMap = make(map[string]net.Conn) clientsMap = make(map[string]Client) ) f

  • java编程实现多人聊天室功能

    本文实例为大家分享了java实现多人聊天室的具体代码,供大家参考,具体内容如下 程序源代码及运行截图: server.java //server.java package Socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; impor

  • java使用MulticastSocket实现基于广播的多人聊天室

    使用MulticastSocket实现多点广播: (1)DatagramSocket只允许数据报发给指定的目标地址,而MulticastSocket可以将数据报以广播的方式发送到多个客户端. (2)IP协议为多点广播提供了这批特殊的IP地址,这些IP地址的范围是:224.0.0.0至239.255.255.255.. (3)MulticastSocket类时实现多点广播的关键,当MulticastSocket把一个DaragramPocket发送到多点广播的IP地址时,该数据报将会自动广播到加入

  • Java NIO Selector用法详解【含多人聊天室实例】

    本文实例讲述了Java NIO Selector用法.分享给大家供大家参考,具体如下: 一.Java NIO 的核心组件 Java NIO的核心组件包括:Channel(通道),Buffer(缓冲区),Selector(选择器),其中Channel和Buffer比较好理解 简单来说 NIO是面向通道和缓冲区的,意思就是:数据总是从通道中读到buffer缓冲区内,或者从buffer写入到通道中. 关于Channel 和 Buffer的详细讲解请看:Java NIO 教程 二.Java NIO Se

  • Java SE实现多人聊天室功能

    本文实例为大家分享了Java SE实现多人聊天室功能的具体代码,供大家参考,具体内容如下 实现功能: 1.实现用户注册上线,下线 2.实现群聊和私聊功能 3.实现统计当前在线人数 实现思路: 1.首先,要实现服务端与客户端之间的连接 这里是使用套接字建立TCP连接: (1)服务器端先实例化一个描述服务器端口号的ServerSocket对象 (2)客户端要创建Socket对象来连接指定的服务器端 (3)服务器端调用ServerSocket类的accept()方法来监听连接到服务器端的客户端信息 (

随机推荐