
正文
Java-->实现群聊功能(C/S模式--TCP协议)
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
--> Java 对TCP协议的支持:
--> java.net包中定义了两个类ServerSocket 和Socket ,分别用来实现双向连接的server 端和client 端。
--> Client 类定义客户端
package com.dragon.java.tcpchat; import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException; /**
* 客户端
*
* @author Auser
*
*/
public class Client {
public static void main(String args[]) throws UnknownHostException,
IOException {
Socket client = new Socket("192.168.1.188", 10000); // 穿件发送信息的线程
new ClientSend(client).start();
// 创建接收信息的线程
new ClientReceive(client).start();
// 因为要实现聊天功能,而不是只发送一次信息,所以输出流和客户端都不能关闭。
// client.shutdownOutput();
// client.close(); }
}
--> ClientSend 类 定义客户端向服务端发送信息的线程
package com.dragon.java.tcpchat; import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner; /**
* 客户端向服务端发送信息的线程
*
* @author Auser
*
*/
public class ClientSend extends Thread {
private Scanner scanner;
private Socket socket; public ClientSend(Socket socket) {
this.socket = socket;
} @Override
public void run() {
scanner = new Scanner(System.in); try {
PrintStream ps = new PrintStream(socket.getOutputStream());
String line = "";
// 阻塞式发送信息
while ((line = scanner.nextLine()) != null) {
ps.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
--> ClientReceive 类 定义客户端接收服务端信息的线程
package com.dragon.java.tcpchat; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket; /**
* 客户端接收信息的线程
*
* @author Auser
*
*/
public class ClientReceive extends Thread {
private Socket socket; public ClientReceive(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
// 按行接收信息
String line = "";
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
} }
--> Server 类定义服务端
package com.dragon.java.tcpchat; import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List; /**
* 服务器
*
* @author Auser
*
*/
public class Server {
public static void main(String[] args) throws IOException,
InterruptedException {
List<Socket> list = new ArrayList<>(); // 创建服务器端的套接字
ServerSocket server = new ServerSocket(10000); while (true) {
// 接收客户端的阻塞方法
Socket socket = server.accept();
// 设计到多个线程可能会对集合进行增删的操作,要进行同步的处理
synchronized (list) {
list.add(socket);
}
// 启动一个新的线程去处理这个客户端的交流
new HandleSocket(socket, list).start();
}
// 因为不知道客户端什么时候发送信息,所以服务端要一直开启不能关闭。
}
}
--> HandleSocket 类对连接到服务端的客户端进行操作(上下线通知、屏蔽拉黑、将信息发送到每个客户端等...)
package com.dragon.java.tcpchat; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.List; /**
* 处理每个(单个)连接到服务器的客户端的线程
*
* @author Auser
*
*/
public class HandleSocket extends Thread { private Socket socket;
private List<Socket> list; /**
* 构造方法
*
* @param socket
* 当前连接的客户端
* @param list
* 存储已连接客户端的集合
*/
public HandleSocket(Socket socket, List<Socket> list) {
this.socket = socket;
this.list = list;
} /**
* 线程run方法
*/
@Override
public void run() {
InetAddress address = socket.getInetAddress(); // 获取连接到服务器的这的客户端的地址
String ip = address.getHostAddress();
System.out.println(ip + "上线了!");
if (ip.equals("192.168.1.117")) {
synchronized (list) {
sendToAll(ip + "由于违规操作,已被拉入黑名单!");
list.remove(socket);
}
return;
} try {
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream(), "gbk")); String line = "";
while ((line = br.readLine()) != null) {
String msg = ip + ":" + line;
System.out.println(msg); // 输出到服务器端的控制台
// 把这个客户端说的话,发给其他所有的客户端
sendToAll(msg);
} } catch (IOException e) {
// e.printStackTrace();
System.out.println(ip + "下线了!");
synchronized (list) {
list.remove(socket);
}
}
} /**
* 把信息发送给所有的客户端,去除当前socket
*
* @param msg
* 发送的信息
*/
private void sendToAll(String msg) {
synchronized (list) {
for (Socket s : list) {
if (s != socket) {
try {
PrintStream ps = new PrintStream(s.getOutputStream());
ps.println();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
} }
--> 注意:因为要实现客户端连接到服务端,即客户端要先找到服务端,所以服务端要先开启,再开启服务端...
--> 这是一个弱小的局域网群聊功能...
Java-->实现群聊功能(C/S模式--TCP协议)的更多相关文章
-
day04-1群聊功能
多用户即时通讯系统04 4.编码实现03 4.5功能实现-群聊功能实现 4.5.1思路分析 群聊的实现思路和私聊的实现非常类似. 不同的是:私聊时,服务端接收到消息后,只需要找出接收方的socket并 ...
-
java项目-----客户端与客户端通信--实现群聊功能的代码
这是这个网络聊天室项目的原理图: 很简单,首先ABCD是4个客户端,当A发送信息给服务器,服务器实现以广播的形式把信息全发给每个人---群发群聊 客户端代码: package com.aa; impo ...
-
netty实现群聊功能
[概述] 实现一个网络群聊工具.参与聊天的客户端消息是通过服务端进行广播的. 主要由两块组成:聊天服务器端(ChatServer)和聊天客户端(ChatClient). 聊天服务器(ChatServe ...
-
Asp.net SignalR 应用并实现群聊功能 开源代码
ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...
-
ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能
休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...
-
netty无缝切换rabbitmq、activemq、rocketmq实现聊天室单聊、群聊功能
netty的pipeline处理链上的handler:需要IdleStateHandler心跳检测channel是否有效,以及处理登录认证的UserAuthHandler和消息处理MessageHan ...
-
Websocket 群聊功能
websocket 群聊 前提关闭防火墙 写入代码 from flask import Flask,request,render_template from geventwebsocket.handl ...
-
基于koa模块和socket.io模块搭建的node服务器实现通过jwt 验证来渲染列表、私聊、群聊功能
1. 具体代码在需要的下载 https://gitee.com/zyqwasd/socket 效果: 2. package.json文件 1. 下载基本的模块 修改了start 脚本 nodemo ...
-
Java网络编程Demo,使用TCP 实现简单群聊功能GroupchatSimple,多个客户端输入消息,显示在服务端的控制台
效果: 服务端 客户端 实现代码: 服务端 import java.io.IOException; import java.net.ServerSocket; import java.net.Sock ...
随机推荐
-
treap codevs 4543普通平衡树
#include<cstdio>#include<ctime>#include<cstdlib>struct shu{ int l,r,sum1,zhi,dui,s ...
-
“Unable to execute dex: Multiple dex files”如何解决?
遇到报错: [2014-02-13 17:27:03 - Dex Loader] Unable to execute dex: Multiple dex files define Lcom/kkdia ...
-
IPTables系列:如何配置Ubuntu 14.04中的IPTables防火墙
IPTables基本命令 在向大家介绍复杂防火墙规则之前,还是先上一些简单的料,让大家对IPTables最为基本的命令有一些简单了解. 首先要说明的是IPTables命令必需以root权限运行,这意味 ...
-
php base64_decode 解码方法
<?php header('Content-Type:text/html;charset=utf-8'); function encode_file_contents($filename) { ...
-
银行支票和汇票中使用的专用字体MICR E13B条形码控件字体
MICR E13B条形码控件字体是一种在美国.加拿大.波多黎各.巴拿马.英国和其它少数国家的银行支票和汇票中使用的专用字体,主要用来打印适用于磁性和光学字符识别系统的MICR字符.MICR E13B条 ...
-
ODI中显示us7ascii字符集的测试
安装oracle DB时,选择的字符集:美国.英语.US7ASCII. 在不设置nls_lang的情况,插入中文,成功,但存进去的是乱码,select看到也是??(无论后面再怎么设置nls_lang) ...
-
MongoDB 语法(转)
Mongod.exe 是用来连接到mongo数据库服务器的,即服务器端. Mongo.exe 是用来启动MongoDB shell的,即客户端. 其他文件: mongodump 逻辑备份工具. mon ...
-
JS 原型继承的几种方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
-
openstack 本地化
研究了一下 openstack中的本地化:主要使用gettext模块: 其中本地化包括对一般字符串的本地化和log的本地化: (1) _localedir = os.environ.get('es ...
-
加载JS
多用户即时通讯系统04 4.编码实现03 4.5功能实现-群聊功能实现 4.5.1思路分析 群聊的实现思路和私聊的实现非常类似. 不同的是:私聊时,服务端接收到消息后,只需要找出接收方的socket并 ...
这是这个网络聊天室项目的原理图: 很简单,首先ABCD是4个客户端,当A发送信息给服务器,服务器实现以广播的形式把信息全发给每个人---群发群聊 客户端代码: package com.aa; impo ...
[概述] 实现一个网络群聊工具.参与聊天的客户端消息是通过服务端进行广播的. 主要由两块组成:聊天服务器端(ChatServer)和聊天客户端(ChatClient). 聊天服务器(ChatServe ...
ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...
休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...
netty的pipeline处理链上的handler:需要IdleStateHandler心跳检测channel是否有效,以及处理登录认证的UserAuthHandler和消息处理MessageHan ...
websocket 群聊 前提关闭防火墙 写入代码 from flask import Flask,request,render_template from geventwebsocket.handl ...
1. 具体代码在需要的下载 https://gitee.com/zyqwasd/socket 效果: 2. package.json文件 1. 下载基本的模块 修改了start 脚本 nodemo ...
效果: 服务端 客户端 实现代码: 服务端 import java.io.IOException; import java.net.ServerSocket; import java.net.Sock ...
-
treap codevs 4543普通平衡树
#include<cstdio>#include<ctime>#include<cstdlib>struct shu{ int l,r,sum1,zhi,dui,s ...
-
“Unable to execute dex: Multiple dex files”如何解决?
遇到报错: [2014-02-13 17:27:03 - Dex Loader] Unable to execute dex: Multiple dex files define Lcom/kkdia ...
-
IPTables系列:如何配置Ubuntu 14.04中的IPTables防火墙
IPTables基本命令 在向大家介绍复杂防火墙规则之前,还是先上一些简单的料,让大家对IPTables最为基本的命令有一些简单了解. 首先要说明的是IPTables命令必需以root权限运行,这意味 ...
-
php base64_decode 解码方法
<?php header('Content-Type:text/html;charset=utf-8'); function encode_file_contents($filename) { ...
-
银行支票和汇票中使用的专用字体MICR E13B条形码控件字体
MICR E13B条形码控件字体是一种在美国.加拿大.波多黎各.巴拿马.英国和其它少数国家的银行支票和汇票中使用的专用字体,主要用来打印适用于磁性和光学字符识别系统的MICR字符.MICR E13B条 ...
-
ODI中显示us7ascii字符集的测试
安装oracle DB时,选择的字符集:美国.英语.US7ASCII. 在不设置nls_lang的情况,插入中文,成功,但存进去的是乱码,select看到也是??(无论后面再怎么设置nls_lang) ...
-
MongoDB 语法(转)
Mongod.exe 是用来连接到mongo数据库服务器的,即服务器端. Mongo.exe 是用来启动MongoDB shell的,即客户端. 其他文件: mongodump 逻辑备份工具. mon ...
-
JS 原型继承的几种方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
-
openstack 本地化
研究了一下 openstack中的本地化:主要使用gettext模块: 其中本地化包括对一般字符串的本地化和log的本地化: (1) _localedir = os.environ.get('es ...
-
加载JS







