返回顶部
首页 > 资讯 > 精选 >Java怎么用局域网实现聊天室功能
  • 409
分享到

Java怎么用局域网实现聊天室功能

2023-06-30 15:06:49 409人浏览 薄情痞子
摘要

这篇文章主要介绍了Java怎么用局域网实现聊天室功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么用局域网实现聊天室功能文章都会有所收获,下面我们一起来看看吧。类和接口Server类(服务器端)pa

这篇文章主要介绍了Java怎么用局域网实现聊天室功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么用局域网实现聊天室功能文章都会有所收获,下面我们一起来看看吧。

类和接口

Java怎么用局域网实现聊天室功能

Server类(服务器端)

package Test;import java.io.IOException;import java.io.PrintStream;import java.net.ServerSocket;import java.net.Socket;public class Server {    private static final int SERVER_PORT=30000;    //使用CrazyitMap对象来保存每个客户名字和对应输出流之间的对应关系    public static CrazyitMap<String,PrintStream> clients=new CrazyitMap<>();    public void init(){        try( //建立监听的ServerSocket             ServerSocket ss=new ServerSocket(SERVER_PORT))        {            //采用死循环来不断地接收来自客户端的请求            while(true){                Socket socket=ss.accept();                new ServerThread(socket).start();            }        }        //如果抛出异常        catch (IOException ex){            System.out.println("服务器启动失败,是否端口"+SERVER_PORT+"已被占用");        }    }    public static void main(String[] args){        Server server=new Server();        server.init();    }}

ServerThread类

package Test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.Socket;public class ServerThread extends Thread {    private Socket socket;    BufferedReader br = null;    PrintStream ps = null;    //定义一个构造器,用于接收一个Socket来创建ServerThread线程    public ServerThread(Socket socket) {        this.socket = socket;    }    public void run() {        try {            //获取该Socket对应的输入流            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));            //获取该Socket对应的输出流            ps = new PrintStream(socket.getOutputStream());            String line = null;            while ((line = br.readLine()) != null) {                //如果读到的行以CrazyitProtocol.USER_ROUND开始,并以其结束                //则可以确定读到的是用户登录的用户名                if (line.startsWith(CrazyitProtocol.USER_ROUND) && line.endsWith(CrazyitProtocol.USER_ROUND)) {                    //得到真实消息                    String userName = getRealMsg(line);                    //如果用户名重复                    if (Server.clients.map.containsKey(userName)) {                        System.out.println("重复");                        ps.println(CrazyitProtocol.NAME_REP);                    } else {                        System.out.println("成功");                        ps.println(CrazyitProtocol.LOGIN_SUCCESS);                        Server.clients.put(userName, ps);                    }                }                //如果读到的行以CrazyitProtocol.PRIVATE_ROUND开始,                //则可以确定是私聊信息,私聊信息只向特定的输入流发送                else if (line.startsWith(CrazyitProtocol.PRIVATE_ROUND) && line.endsWith(CrazyitProtocol.PRIVATE_ROUND)) {                    //得到真实的消息                    String userAndMsg = getRealMsg(line);                    //以SPLIT_SIGN分割字符串,前半是私聊用户,后半是聊天信息                    String user = userAndMsg.split(CrazyitProtocol.SPLIT_SIGN)[0];                    String msg = userAndMsg.split(CrazyitProtocol.SPLIT_SIGN)[1];                    //获取私聊用户对应的输出流,并发送私聊信息                    Server.clients.map.get(user).println(Server.clients.geTKEyByValue(ps) + "悄悄对你说:" + msg);                }                //公聊要向每一个Socket发送                else {                    //得到真实消息                    String msg = getRealMsg(line);                    //遍历clients中的每个输出流                    for (PrintStream clientPs : Server.clients.valueSet()) {                        clientPs.println(Server.clients.getKeyByValue(ps) + "说:" + msg);                    }                }            }        }        //捕获到异常后,表明Socket对应的客户端已经出现了问题        //所以程序将其对应的输出流从Map中删除        catch (IOException e) {            Server.clients.removeByValue(ps);            System.out.println(Server.clients.map.size());            //关闭网络,IO资源            try {                if (br != null) {                    br.close();                }                if (ps != null) {                    ps.close();                }                if (socket != null) {                    socket.close();                }            } catch (IOException ex) {                ex.printStackTrace();            }        }    }    //将读到的内容去掉前后协议字符,恢复成真实数据    private String getRealMsg(String line) {        return line.substring(CrazyitProtocol.PROTOCOL_LEN,line.length()-CrazyitProtocol.PROTOCOL_LEN);    }}

Client类

package Test;import javax.swing.*;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.Socket;import java.net.UnknownHostException;public class Client {    private static final int SERVER_PORT=30000;    private Socket socket;    private PrintStream ps;    private BufferedReader brServer;    private BufferedReader keyIn;    public void init(){        try        {            //初始化代表键盘的输入流            keyIn=new BufferedReader(new InputStreamReader(System.in));            //连接到服务器端            socket=new Socket("127.0.0.1",SERVER_PORT);            //获取该Socket对应的输入流和输出流            ps=new PrintStream(socket.getOutputStream());            brServer=new BufferedReader(new InputStreamReader(socket.getInputStream()));            String tip=" ";            //采用不断循环地弹出对话框要求输入用户名            while(true){                String userName= JOptionPane.showInputDialog(tip+"输入用户名");                //用户输入的用户名前后增加协议字符串后发送                ps.println(CrazyitProtocol.USER_ROUND+userName+CrazyitProtocol.USER_ROUND);                //读取服务器端的响应                String result=brServer.readLine();                //如果用户名重复,则开始下一次循环                if (result.equals(CrazyitProtocol.NAME_REP)){                    tip="用户名重复,请重试";                    continue;                }                //服务器端登录成功                if (result.equals(CrazyitProtocol.LOGIN_SUCCESS)){                    break;                }            }        }        //捕获到异常,关闭网络资源,并退出该程序        catch (UnknownHostException ex){            System.out.println("找不到远程服务器,请确定服务器已经启动");            closeRs();            System.exit(1);        }        catch(IOException ex){            System.out.println("网络异常,请重新登录");            closeRs();            System.exit(1);        }        //以该Socket对应的输入流启动ClientThread线程        new ClientThread(brServer).start();    }    //定义一个读取键盘输出,并以网络发送的方法    private void readAndSend(){        try        {            //不断读取键盘输入            String line=null;            while ((line=keyIn.readLine())!=null){                //如果发送的信号中有冒号,并以//开头,则认为想发送私聊信息                if (line.indexOf(":")>0&&line.startsWith("//")){                    line=line.substring(2);                    ps.println(CrazyitProtocol.PRIVATE_ROUND+line.split(":")[0]+CrazyitProtocol.SPLIT_SIGN+line.split(":")[1]+CrazyitProtocol.PRIVATE_ROUND);                }                else{                    ps.println(CrazyitProtocol.MSG_ROUND+line+CrazyitProtocol.MSG_ROUND);                }            }        }        catch (IOException ex){            System.out.println("网络通信异常!请重新登录");            closeRs();            System.exit(1);        }    }    //关闭Socket,输入流,输出流的方法    private void closeRs(){        try        {            if (keyIn!=null){                ps.close();            }            if (brServer!=null){                ps.close();            }            if (ps!=null){                ps.close();            }            if (socket!=null){                keyIn.close();            }        }        catch (IOException ex){            ex.printStackTrace();        }    }    public static void main(String[] args){        Client client=new Client();        client.init();        client.readAndSend();    }}

ClientThread类

package Test;import java.io.BufferedReader;import java.io.IOException;public class ClientThread extends Thread {    //该客户端线程负责处理输入流    BufferedReader br=null;    //使用一个网络输入流来创建客户端线程    public ClientThread(BufferedReader br){        this.br=br;    }    public void run(){        try        {            String line=null;            //不断地从输入流中读取数据,并将这些数据打印输出            while((line=br.readLine())!=null){                System.out.println(line);            }        }        catch (IOException ex){            ex.printStackTrace();        }        finally {            try {                if (br!=null){                    br.close();                }            }            catch (IOException ex){                ex.printStackTrace();            }        }    }}

CrazyitMap类

package Test;import java.util.*;public class CrazyitMap<k,v> {    //创建一个线程安全HashMap    public Map<k,v> map= Collections.synchronizedMap(new HashMap<k,v>());    //根据value来删除指定项    public synchronized void removeByValue(Object value){        for (Object key:map.keySet()){            if (map.get(key)==value){                map.remove(key);                break;            }        }    }    //获取所有value组成的Set集合    public synchronized Set<v> valueSet(){        Set<v> result=new HashSet<v>();        //将map中的所有value添加到result集合中        map.forEach((key,value)->result.add(value));        return result;    }    //根据value查找key    public synchronized k getKeyByValue(v value){        //遍历所有key组成的集合        for (k key:map.keySet()){            //如果指定key对应的value与被搜索的value相同,则返回对应的key            if(map.get(key)==value||map.get(key).equals(value)){                return key;            }        }        return null;    }    //实现put()方法,该方法不允许value重复    public synchronized v put(k key,v value){        //遍历所有value组成的集合        for (v val:valueSet()){            //如果某个value与试图放入集合的value相同            //则抛出一个RuntimeException异常            if (val.equals(value)&&val.hashCode()==value.hashCode()){                throw new RuntimeException("MyMap实例不允许有重复的value");            }        }        return map.put(key,value);    }}

CrazyitProtocol类

package Test;public interface CrazyitProtocol {    //定义协议字符串的长度    int PROTOCOL_LEN=2;    //下面是一些协议字符串,服务器端和客户端交换的信息都应该在前后添加这种特殊字符串    String MSG_ROUND="ηθ";    String USER_ROUND="∏∑";    String LOGIN_SUCCESS="1";    String NAME_REP="-1";    String PRIVATE_ROUND="★【";    String SPLIT_SIGN="卐";}

运行结果:

打开服务器并且运行三个客户端用户名分别是xuwei,jiji和yaou

Java怎么用局域网实现聊天室功能

首先发送一句公开信息:
xuwei发送了一句话

Java怎么用局域网实现聊天室功能

jiji收到:

Java怎么用局域网实现聊天室功能

yaou收到:

Java怎么用局域网实现聊天室功能

再发送一句私聊信息给jiji
xuwei发送了一句悄悄话:

Java怎么用局域网实现聊天室功能

jiji收到:

Java怎么用局域网实现聊天室功能

yaou没有收到:

Java怎么用局域网实现聊天室功能

关于“Java怎么用局域网实现聊天室功能”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java怎么用局域网实现聊天室功能”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Java怎么用局域网实现聊天室功能

本文链接: https://lsjlt.com/news/329769.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java用局域网实现聊天室功能
    本文实例为大家分享了Java用局域网实现聊天室的具体代码,供大家参考,具体内容如下 类和接口 Server类(服务器端) package Test; import java.io...
    99+
    2024-04-02
  • Java怎么用局域网实现聊天室功能
    这篇文章主要介绍了Java怎么用局域网实现聊天室功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么用局域网实现聊天室功能文章都会有所收获,下面我们一起来看看吧。类和接口Server类(服务器端)pa...
    99+
    2023-06-30
  • Java实现局域网聊天室功能(私聊、群聊)
    本文实例为大家分享了Java实现局域网聊天室功能的具体代码,供大家参考,具体内容如下 Server 服务端 import java.io.IOException; import ja...
    99+
    2024-04-02
  • Unity实现局域网聊天室功能
    基于Unity实现一个简单的局域网聊天室,供大家参考,具体内容如下 学习Unity有一点时间了,之前学的都是做客户端的一些内容,现在开始学习联网。我的这个是在观看了 Siki 的教学...
    99+
    2024-04-02
  • Java实现简单局域网聊天室
    本文实例为大家分享了Java实现简单局域网聊天室的具体代码,供大家参考,具体内容如下 Java 的Socket编程: 1、TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数...
    99+
    2024-04-02
  • java+socket实现简易局域网聊天室
    本文实例为大家分享了java+socket实现简易局域网聊天室的具体代码,供大家参考,具体内容如下 服务器端 ServerFrame.java package com.eze.cha...
    99+
    2024-04-02
  • Java多线程局域网聊天室的实现
    目录1.TCP2.套接字3.C/S架构4.多线程5.服务器客户端局域网聊天室 在学习了一个学期的java以后,觉得java真是博大精深,彻底放弃了因为c++而轻视java的心态,搞了...
    99+
    2024-04-02
  • Java NIO怎么实现聊天室功能
    这篇文章主要介绍了Java NIO怎么实现聊天室功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下代码里面已经包含了必要的注释,这里不详述了。实现了基本...
    99+
    2023-06-21
  • Java聊天室之实现聊天室客户端功能
    目录一、题目描述二、解题思路三、代码详解一、题目描述 题目实现:实现聊天室客户端。运行程序,用户登录服务器后,可以从用户列表中选择单个用户进行聊天,也可以选择多个用户进行聊天。 二、...
    99+
    2022-11-13
    Java实现聊天室 Java 聊天室 Java 客户端
  • Java聊天室之实现聊天室服务端功能
    目录一、题目描述二、解题思路三、代码详解多学一个知识点一、题目描述 题目实现:实现聊天室服务器端功能。运行程序,服务端等待客户端连接,并显示客户端的连接信息。 二、解题思路 创建一个...
    99+
    2022-11-13
    Java实现聊天室 Java 聊天室 Java 服务端
  • Java NIO实现聊天室功能
    本文实例为大家分享了Java NIO实现聊天室功能的具体代码,供大家参考,具体内容如下 代码里面已经包含了必要的注释,这里不详述了。实现了基本的聊天室功能。 常量类: publi...
    99+
    2024-04-02
  • Java Socket实现聊天室功能
    本文实例为大家分享了Java Socket实现聊天室的具体代码,供大家参考,具体内容如下 1 创建登录判断类UserLogin import java.util.HashSet; i...
    99+
    2024-04-02
  • 怎么用java socket实现局域网聊天
    这篇文章主要介绍“怎么用java socket实现局域网聊天”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用java socket实现局域网聊天”文章能帮助大家解决问题。代码...
    99+
    2023-06-30
  • 怎么用Java创建多线程局域网聊天室
    这篇文章主要讲解了“怎么用Java创建多线程局域网聊天室”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Java创建多线程局域网聊天室”吧!局域网聊天室在学习了一个学期的java以后,觉...
    99+
    2023-06-20
  • java socket实现局域网聊天
    使用socket实现局域网聊天,写这个主要是为了深入理解socket与信息流在网络中的传送过程加深理解。 代码很简单分为两个类,一个服务器类,一个客户端,运行时分别启动两个线程一个负...
    99+
    2024-04-02
  • Java基于NIO怎么实现聊天室功能
    Java基于NIO怎么实现聊天室功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Sever端package com.qst.one;import java...
    99+
    2023-06-21
  • Java创建多线程局域网聊天室实例
    局域网聊天室 在学习了一个学期的java以后,觉得java真是博大精深,彻底放弃了因为c++而轻视java的心态,搞了一个多线程的聊天室,熟悉了一下服务器和客户机的操作。 1.TCP...
    99+
    2024-04-02
  • Unity实现聊天室功能
    本文实例为大家分享了Unity实现聊天室功能的具体代码,供大家参考,具体内容如下 简单聊天室功能,客户端发送消息后,服务器接收到消息后分发到其它客户端上并显示聊天内容 聊天室服务器 ...
    99+
    2024-04-02
  • Java实现简单的聊天室功能
    本文实例为大家分享了Java实现简单聊天室功能的具体代码,供大家参考,具体内容如下 一、客户端的创建 1.我们可以用Socket来创建客户端 public class Client...
    99+
    2024-04-02
  • Java基于NIO实现聊天室功能
    本文实例为大家分享了Java基于NIO实现聊天室功能的具体代码,供大家参考,具体内容如下 Sever端 package com.qst.one; import java.io....
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作