java网络编程之群聊功能(java实现群聊功能)

网友投稿 459 2022-07-29


本文实例为大家分享了java网络编程之群聊功能的具体代码,供大家参考,具体内容如下

1、服务端

package networkCoding;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.concurrent.CopyOnWriteArrayList;

/**

*

* 1, 指定端口,使用serverSocket创建服务器

* 2, 阻塞式等待连接accept

* 3, 操作:输入输出流操作

* 4, 释放资源

*

* 5,加入容器实现群聊

*

* **/

public class WeiHuShanChatRoomServer {

private static CopyOnWriteArrayList all= new CopyOnWriteArrayList();

public static void main(String[] args) throws IOException {

System.out.println("-----server");

// 1, 指定端口,使用serverSocket创建服务器

ServerSocket server= new ServerSocket(9999);

// 2, 阻塞式等待连接accept

while(true) {

Socket client=server.accept();

Chat chat= new Chat(client);

// 交给容器管理

all.add(chat);

new Thread(chat) .start();

}

}

static class Chat implements Runnable{

private DataOutputStream dos;

private DataInputStream dis;

private Socket client;

private boolean isRuning;

private String name;

public Chat(Socket client) {

this.client=client;

this.isRuning=true;

try {

this.dis = new DataInputStream(client.getInputStream());

this.dos=new DataOutputStream(client.getOutputStream());

this.name=receive();

this.send(this.name+",威虎山欢迎你的到来");

this.sendOthers(this.name+"来到了威虎山",true);

} catch (IOException e) {

// 出错释放资源

System.out.println("===1==");

this.release();

}

}

private String receive() {

String data="";

try {

data= dis.readUTF();

} catch (IOException e) {

System.out.println("===2==");

//this.release();

}

return data;

}

// 群聊

private void send(String data) {

try {

dos.writeUTF(data);

dos.flush();

} catch (IOException e) {

System.out.println("===3==");

this.release();

}

}

private void sendOthers(String data,boolean isSys) {

boolean isPrivate = data.startsWith("@");

if(isPrivate) {

int index= data.indexOf(":");

String targetName=data.substring(1,index);

String msg=data.substring(index+1);

for (Chat chat : all) {

if(chat.name.equals(targetName)) {

System.out.println("******"+chat.name+targetName);

chat.send(this.name+"悄悄对你说:"+msg);

}

}

}else {

for (Chat chat : all) {

if(chat==this) {

continue;

}else {

if(isSys) {

chat.send(data);

}else {

chat.send(this.name+"对大家说:"+data);

}

}

}

}

}

private void release() {

this.isRuning=false;

Utils.close(dis,dos,client);

all.remove(this);

sendOthers(this.name+"离开了威虎山", true);

}

@Override

public void run() {

while(isRuning) {

String data = receive();

if(!data.equals("")) {

sendOthers(data,false);

}else {

send("不能发送空消息");

}

}

}

}

}

2、客户端

package networkCoding;

import java.io.BufferedOutputStream;

import java.io.BufferedReader;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.Socket;

import java.net.UnknownHostException;

/**

*

* 1, 建立连接,使用socket 创建客户端 + 服务端的地址端口号;

* 2, 操作:输入输出流操作

* 3, 释放资源

*

* **/

public class WeiHuShanChatRoomClient {

public static void main(String[] args) throws UnknownHostException, IOException {

BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));

System.out.println("请输入姓名");

String bfString = bf.readLine();

//1, 建立连接,使用socket 创建客户端 + 服务端的地址端口号;

Socket client = new Socket("localhost",9999);

// 2, 操作:输入输出流操作

new Thread(qcDqUFRDnew Send(client,bfString)).start();

new Thread(new Receive(client)).start();

}

}

(1)发送封装类

package networkCoding;

import java.io.BufferedReader;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOExchttp://eption;

import java.io.InputStreamReader;

import java.net.Socket;

public class Send implements Runnable{

private BufferedReader bf;

private DataOutputStream dos;

private Socket client;

private boolean isRuning;

private String name;

public Send(Socket client,String name) {

this.client=client;

this.isRuning=true;

this.name=name;

this.bf= new BufferedReader(new InputStreamReader(System.in));

try {

this.dos=new DataOutputStream(client.getOutputStream());

this.send(name);

} catch (IOException e) {

// 出错释放资源

System.out.println("===4==");

this.release();

this.isRuning=false;

}

}

private void release() {

this.isRuning=false;

Utils.close(dos,client);

}

private void send(String data) {

try {

dos.writeUTF(data);

dos.flush();

} catch (IOException e) {

System.out.println("===5==");

this.release();

}

}

private String getString() {

String dataString ="";

try {

dataString = this.bf.readLine();

} catch (IOException e) {

System.out.println("===6==");

this.release();

}

return dataString;

}

@Override

public void run() {

// TODO Auto-generated method stub

while(isRuning) {

String data = getString();

if(!data.eqqcDqUFRDuals("")) {

send(data);

}else {

//send("不能发送空消息");

}

}

}

}

(2)接收封装类

package networkCoding;

import java.io.BufferedReader;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.Socket;

public class Receive implements Runnable {

private DataInputStream dis;

private Socket client;

private boolean isRuning;

public Receive(Socket client) {

this.client=client;

this.isRuning=true;

try {

this.dis = new DataInputStream(client.getInputStream());

} catch (IOException e) {

// 出错释放资源

System.out.println("===6==");

this.release();

this.isRuning=false;

}

}

private String receive() {

String data="";

try {

data= dis.readUTF();

} catch (IOException e) {

System.out.println("===7==");

this.release();

}

return data;

}

private void release() {

this.isRuning=false;

Utils.close(dis,client);

}

@Override

public void run() {

while(isRuning) {

String data = receive();

if(!data.equals("")) {

System.out.println(data);

}else {

}

}

}

}

3、工具类

package networkCoding;

import java.io.Closeable;

import java.io.IOException;

public class Utils {

public static void main(String[] args) {

}

public static void close(Closeable...target) {

for (Closeable obj : target) {

try {

if(null!=obj) {

obj.close();

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}


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

上一篇:Java实现鼠标随机移动效果的示例代码(java让鼠标自动移动)
下一篇:基于Luhn算法的银行卡校验规则(luhn算法推测银行卡)
相关文章