Java实现多人聊天室

网友投稿 343 2023-01-23

Java实现多人聊天室

本文实例为大家分享了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 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=nCtrjqqew 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 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();

}

}

先将服务器启动然后启动客户端:测试结果如下

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringMVC的工程搭建步骤实现
下一篇:豆瓣电影api接口失效(豆瓣 api错误)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~