java聊天室私聊群聊代码(群聊源代码大全)
多人聊天室原理图

源码
工具类:
该类用于关闭各种流。
public class CloseUtil {
public static void CloseAll(Closeable... closeable){
for(Closeable c:closeable){
if (c != null) {
try {
c.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
服务器:
服务器端创建一个serverSocket对象通过accept()方法监听是否有tcp连接,同时有一个储存socket对象的集合将连接进来的对象储存到List集合中,服务器将消息进行转发。
//服务器
public class Server {
//存储每一个连接进来的客户端
public static List<MyChannel> list=new ArrayList<>();
public static void main(String[] args) throws Exception {
//创建ServerSocket对象
ServerSocket serverSocket = new ServerSocket(9999);
while (true){
//连接进来的客户端
Socket client = serverSocket.accept();
System.out.println(client.getInetAddress()+"进入聊天室");
MyChannel myChannel = new MyChannel(client);
list.add(myChannel);
new Thread(myChannel).start();
}
}
}
消息转发类:
具体的消息转发实现类,将信息发给除发送消息以外的其他客户端。
//用于信息转发
public class MyChannel implements Runnable{
private DataInputStream dis;
private DataOutputStream dos;
private boolean flag=true;
public MyChannel(Socket socket) {
try{
dis=new DataInputStream(socket.getInputStream());
dos=new DataOutputStream(socket.getOutputStream());
}catch (IOException e){
flag=false;
CloseUtil.CloseAll(dis,dos);
}
}
//接收数据的方法
private String receive(){
String str="";
try{
str= dis.readUTF();
}catch (IOException e){
flag=false;
CloseUtil.CloseAll(dis,dos);
Server.list.remove(this);
}
return str;
}
//发送数据的方法
private void send(String str){
try {
if (str != null && str.length() != 0) {
dos.writeUTF(str);
dos.flush();
}
}catch (Exception exception){
flag=false;
CloseUtil.CloseAll(dos,dis);
Server.list.remove(this);
}
}
//转发消息的方法
private void sendToOther(){
String str=this.receive();
List<MyChannel> list = Server.list;
for (MyChannel other:list) {
if(other==list){
continue;//不发送信息给自己
}
//将消息发送给其他客户端
other.send(str);
}
}
@Override
public void run() {
while (flag){
sendToOther();
}
}
}
发送信息类:
用于从键盘上获取数据然后将数据发送出去
public class Send implements Runnable{
//从键盘上获取数据
private BufferedReader br;
private DataOutputStream dos;
private boolean flag=true;
public Send() {
br=new BufferedReader(new InputStreamReader(System.in));
}
public Send(Socket socket){
this();
try{
dos=new DataOutputStream(socket.getOutputStream());
}catch (Exception e){
flag=false;
CloseUtil.CloseAll(dos,socket);
e.printStackTrace();
}
}
private String getMessage(){
String str="";
try{
str=br.readLine();
}catch (IOException e){
flag=false;
CloseUtil.CloseAll(br);
}
return str;
}
private void send(String str){
try {
dos.writeUTF(str);
dos.flush();
} catch (IOException e) {
flag=false;
CloseUtil.CloseAll(dos);
e.printStackTrace();
}
}
@Override
public void run() {
while (flag){
this.send(getMessage());
}
}
}
信息接收类:
public class Receive implements Runnable{
//接受数据流
private DataInputStream dis;
private boolean flag=true;
public Receive(Socket socket){
try {
dis = new DataInputStream(socket.getInputStream());
}catch (Exception e){
flag=false;
CloseUtil.CloseAll(dis,socket);
}
}
private String getMessage(){
String str="";
try {
str=dis.readUTF();
} catch (IOException e) {
flag=false;
CloseUtil.CloseAll(dis);
e.printStackTrace();
}
return str;
}
@Override
public void run() {
while (flag){
System.out.println(this.getMessage());
}
}
}
客户端:
public class client {
public static void main(String[] args) throws Exception{
Socket socket = new Socket(InetAddress.getLocalHost(),9999);
Send send = new Send(socket);
Receive receive = new Receive(socket);
new Thread(send).start();
new Thread(receive).start();
}
}
先将服务器启动然后启动客户端:测试结果如下

有喜欢的小伙伴可以自己拿去玩,代码复制直接有效。
推荐阅读
-
家用保险柜什么牌子好(选择家用保险箱看这四个方面)
很多人认为家用保险柜有点多此一举,其实它大有用途。在居家环境下保险柜除了可以放置一些贵重物品以及各种证件以外,其实还可以将一些药物...
-
香蕉与芭蕉差别在哪里(香蕉和芭蕉的三个差异)
香蕉的种类有很多,有大的也有小的,有黄的也有青的,但是最让人容易搞混的,就是芭蕉和香蕉这种水果了。很多人分不清芭蕉和香蕉,但它们到...
-
防晒霜哪个牌子最好用(21款热门防晒霜测评结果)
-
香奈儿和lv谁的档次高(一文带你了解奢侈品品牌段位)
-
草原之王是什么动物(草原之王是否也有劲敌呢)
狮子是有名的“草原之王”,它们凶猛有力,可以击倒一头半吨重的非洲野水牛,能够一次性吞下30千克的肉。那么,“草原之王”是否也有劲敌...
-
中国最好的牙膏是什么(2023牙膏十大国民品牌排行榜)
-
世界经典科幻小说全集精选(强推5本世界顶级科幻小说)
-
正确洗脸用冷水还是温热水(有效洗脸方法和洗脸后保养)
不管属于哪种皮肤,只有正确地使用一些清洁皮肤的方法,才能有效地深层清理。而且对于不同的肤质,要采用不同的护肤品进行清洁,当清洁皮肤...
-
怎样判断脸上有角质(判断角质方法及去角质的注意事项)
角质层是我们人体必须的保护层。但过厚的角质层会阻碍营养物质的吸收,导致皮肤状况恶化。那么我们如何判断是否需要去角质呢?怎样判断脸上...
-
台湾经典偶像剧排行榜(公认最好看的台偶收视率top10)