Socket 群聊功能

1、Server端:

  拥有一个存放与客户端连接对象的List<socket> 有一个客户端发信息后 遍历List 实现群发功能 代码如下:

  

 1 package com.socket;
 2
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStreamReader;
 6 import java.io.PrintWriter;
 7 import java.net.ServerSocket;
 8 import java.net.Socket;
 9 import java.util.ArrayList;
10 import java.util.List;
11
12 public class MyServer {
13
14     public static void main(String[] args) throws Exception {
15         ServerSocket ss = new ServerSocket(10002);
16         List<Socket> allClient = new ArrayList<>();
17         System.out.println("server is starting....");
18         while(true){
19             Socket s = ss.accept();
20             allClient.add(s);
21             new Thread(new ServerThread(s, allClient)).start();
22         }
23     }
24
25 }
26 class ServerThread implements Runnable{
27     private Socket s;
28     private List<Socket> allClient;
29
30     public ServerThread(Socket s, List<Socket> allClient) {
31         super();
32         this.s = s;
33         this.allClient = allClient;
34     }
35
36     @Override
37     public void run() {
38         try {
39             System.out.println(s.getInetAddress().getHostAddress()+"上线了...");
40             BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
41             String line = null;
42             while((line = in.readLine())!=null){
43                 for(Socket soc:allClient){
44                     //向其他客户端发信息
45                     if(!soc.equals(s)){
46                         PrintWriter pw = new PrintWriter(soc.getOutputStream(),true);
47                         pw.println(line);
48                     }
49                 }
50             }
51         } catch (IOException e) {
52             // TODO Auto-generated catch block
53             e.printStackTrace();
54         }
55
56     }
57
58 }

2、客户端:
  客户端需要注意的是用户不仅可以输入,还可以随时的接受服务端发来的信息,这就要求读和写分开两个线程来操作代码如下:

  

 1 package com.socket;
 2
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStreamReader;
 6 import java.io.PrintWriter;
 7 import java.net.InetAddress;
 8 import java.net.Socket;
 9
10 public class Client {
11
12     public static void main(String[] args) throws IOException, Exception {
13         final Socket s = new Socket(InetAddress.getLocalHost(),10002);
14         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
15         PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
16         String line = null;
17         new Thread(new Runnable() {
18             @Override
19             public void run() {
20                 try {
21                     BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
22                     String str = null;
23                     while((str = br.readLine())!=null){
24                         System.out.println(str);
25                     }
26                 } catch (IOException e) {
27                     // TODO Auto-generated catch block
28                     e.printStackTrace();
29                 }
30             }
31         }).start();
32         while ((line = br.readLine())!=null){
33             pw.println(line);
34         }
35         s.close();
36         br.close();
37     }
38 }
时间: 2024-08-26 21:27:36

Socket 群聊功能的相关文章

Java--&gt;实现群聊功能(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; /** * 客户端 * *

代码发布项目(二)——django实现websocket(使用channels)、基于channels实现群聊功能、gojs插件、paramiko模块

一.django实现websocket django默认是不支持websocket,只支持http协议 在django中如果想要基于websocket开发项目 你需要安装模块:channles pip3 install channels==2.3 版本不要使用最新的,如果安装最新的可能会自动把你的django版本升级到最新版 对应的解释器环境建议使用3.6(官网的说法:3.5可能有问题,3.7可能也有问题...具体原因没有给解释) channels模块内部已经帮我们封装好了 握手/加密/解密 面

实现了私聊和群聊功能的聊天工具

在前面的博客(简单的C/S聊天室)中,我们已经提到了,采用的是多线程的方法.服务器端主线程负责不断的侦听端口,子线程负责接收和发送消息.客户端主线程需要接收键盘消息,将其发送到服务器端,子线程需要接收服务器端发过来的消息.在这个简易的C/S聊天室的实现中,仅仅实现了群聊的功能,没有实现私聊.那么,本文就讲实现私聊和群聊. 首先我们想到的是,消息发过来,我怎么知道是公聊消息还是私聊消息呢.所以,这里需要对消息进行处理,比如说在消息前后都加上一些特殊的字符,我们称为协议字符.为此,我们可以定义一个接

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

休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开始在原有的基础上添加功能. 1.表情功能 表情我用了一个jquery插件,qqFace.由于GitHub中源码已经包含,我这里不在粘贴地址.先看一下添加表情后的效果吧. 表情这里不要忘了加页面样式,表情选中样式.还有一个就是小bug就是,表情框被聊天框限制住了.另外,初始化表情插件的地方应该在有元素

简单通讯聊天 群聊功能 Windows下的客户端 Linux下的epoll服务器

1 服务器代码  Linux eclipse C++ 1 //============================================================================ 2 // Name : epollServer.cpp 3 // Author : fangjunmin 4 // Version : 5 // Copyright : Your copyright notice 6 // Description : Hello World in C

基于netty实现单聊、群聊功能

学习资料 https://juejin.im/book/5b4bc28bf265da0f60130116/section/5b6a1a9cf265da0f87595521 收获: 1. Netty 是什么? 经过我们整个小册的学习,我们可以了解到,Netty 其实可以看做是对 BIO 和 NIO 的封装,并提供良好的 IO 读写相关的 API,另外还提供了非常多的开箱即用的 handler,工具类等等. 2. 服务端和客户端启动 Netty 提供了两大启动辅助类,ServerBootstrap

实现在同一台服务器上登录的ssh用户的群聊(聊天室)功能

直接上代码了,注释还算清晰,有问题欢迎提问指证. 为方便下载编译,代码都放到一个文件里了. 服务器是CentOS,客户端用的secureCRT. /* 功能: 在同一台服务器上ssh登录的用户可以群聊(聊天室) 原理:<span style="white-space:pre"> </span>1.通过roomNo.来区分不同的房间或群组: 2.以roomNo.作为key来创建一块共享内存,来保存进入到该room的用户列表: 3.用户以ssh(或其它方式)登录到服

Socket通信 简单实现私聊、群聊(dos命令下)

很久以前的一个Demo,这里服务器只做转发功能,根据ID地址和端口号来标识身份,群聊和私聊只是简单实现, 服务器代码如下: import java.util.*; import java.io.*; import java.net.*; public class Server extends Thread { private static Vector<Socket> vecClient = new Vector<Socket>(); private PrintWriter out

群聊内实现私聊功能

首先我们想到的是,消息发过来,我怎么知道是公聊消息还是私聊消息呢.所以,这里需要对消息进行处理,比如说在消息前后都加上一些特殊的字符,我们称为协议字符.为此,我们可以定义一个接口,专门来定义协议字符. 第二个问题就是,如果是私聊信息,客户端会将目的用户(私聊对象)发给服务器端,那么服务器端是如何将找到那个目的用户的呢.这里,很明显,我们需要建立一个用户和Socket的映射关系,所以我们采用了map,但是这里的map我们需要改进一下,因为其实我们这里不仅仅是key不能重复,而且value也不能重复