--> 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协议)的更多相关文章

  1. day04-1群聊功能

    多用户即时通讯系统04 4.编码实现03 4.5功能实现-群聊功能实现 4.5.1思路分析 群聊的实现思路和私聊的实现非常类似. 不同的是:私聊时,服务端接收到消息后,只需要找出接收方的socket并 ...

  2. java项目-----客户端与客户端通信--实现群聊功能的代码

    这是这个网络聊天室项目的原理图: 很简单,首先ABCD是4个客户端,当A发送信息给服务器,服务器实现以广播的形式把信息全发给每个人---群发群聊 客户端代码: package com.aa; impo ...

  3. netty实现群聊功能

    [概述] 实现一个网络群聊工具.参与聊天的客户端消息是通过服务端进行广播的. 主要由两块组成:聊天服务器端(ChatServer)和聊天客户端(ChatClient). 聊天服务器(ChatServe ...

  4. Asp.net SignalR 应用并实现群聊功能 开源代码

    ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...

  5. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能

    休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...

  6. netty无缝切换rabbitmq、activemq、rocketmq实现聊天室单聊、群聊功能

    netty的pipeline处理链上的handler:需要IdleStateHandler心跳检测channel是否有效,以及处理登录认证的UserAuthHandler和消息处理MessageHan ...

  7. Websocket 群聊功能

    websocket 群聊 前提关闭防火墙 写入代码 from flask import Flask,request,render_template from geventwebsocket.handl ...

  8. 基于koa模块和socket.io模块搭建的node服务器实现通过jwt 验证来渲染列表、私聊、群聊功能

    1. 具体代码在需要的下载 https://gitee.com/zyqwasd/socket 效果: 2. package.json文件 1. 下载基本的模块  修改了start 脚本  nodemo ...

  9. Java网络编程Demo,使用TCP 实现简单群聊功能GroupchatSimple,多个客户端输入消息,显示在服务端的控制台

    效果: 服务端 客户端 实现代码: 服务端 import java.io.IOException; import java.net.ServerSocket; import java.net.Sock ...

随机推荐

  1. excel的变量

    因需要定制游戏的公式,公式是以一个系数乘以等级,我想达到修改系数,每个等级对应的值就立即显示出来, 但把系数写在一个单元格,一拉,系数单元格也会跟着增长行数--不是我想要的: 但只要把系数单元格改成变 ...

  2. ubnutu安装sougou 输入法

    先安百度经验安装fcitx 1.首先下载sogoupinyin_2.0.0.0068_amd64.deb,点击安装后,会通过ubuntu软件中心安装,安装玩成后,任然是无法使用.然后: 2.然后执行下 ...

  3. Android ScrollView与ViewPager滑动冲突

    前段时间做项目碰到在ScrollView里添加ViewPager,但是发现ViewPager的左右滑动和ScrollView的滑动冲突了,解决这个问题的方法是重写ScrollView. 代码: pub ...

  4. 使用OCI向Oracle插入Geometry数据

    使用C/C++操作Oracle数据库,使用OCI可谓是最强大,当然也是最难的方式.Oracle是一个功能复杂而强大的数据库,它可以很好的支持空间数据(Oracle spatial).如何使用OCI向O ...

  5. matlab 2012 vs2010混合编程

    电脑配置: 操作系统:window 8.1 Matlab 2012a安装路径:D:\Program Files\MATLAB\R2012a VS2010 : OpenCV 2.4.3:D:\Progr ...

  6. SharePoint 沙盒解决方案 VS 场解决方案

    博客地址 http://blog.csdn.net/foxdave 最近看书正好看到了关于沙盒解决方案的介绍,便整理记录一下. 虽然沙盒解决方案已经在最新的SharePoint开发中被否决弃用了(被A ...

  7. linux安装时出现your cpu does not support long mode的解决方法

    如果你确定你的电脑支持64bit且是64bit的宿主系统,则需要修改BIOS中的Inter Virtualization Technology为enabled.

  8. 一篇介绍jquery很好的

    本文基于jQuery1.7.1版本,是对官方API的整理和总结,完整的官方API见http://api.jquery.com/browser/ 0.总述 jQuery框架提供了很多方法,但大致上可以分 ...

  9. 简单实现web单点登录

    主要参考文档:http://blog.csdn.net/jimmy609/article/details/18605781 1.工程总体结构: 2.修改C:\Windows\System32\driv ...

  10. solaris下的常用命令

    屏幕显示: cat输出到屏幕: more 整屏显示,b显示上一屏,f显示下一屏: head显示文件的前n行: tail显示文件的后n行: man查看命令帮助: 目录操作: 创建目录: mkdir,   ...