本文實例為大家分享了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<Chat> all= new CopyOnWriteArrayList<Chat>();
?
?? ?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(new 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.IOException;
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.equals("")) {
?? ??? ??? ??? ?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();
?? ??? ??? ?}
?? ??? ?}
?? ?}
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持html5模板網。
【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!