利用Java中的IO流,多线程及网络编程技术自制一个简易的多人聊天室

    在java基础课程中,IO流,多线程以及网络编程都属于java高级部分的内容,这部分内容虽然不算复杂,不难以理解,但是在学习和应用中往往要求我们将它们一起理解、运用,因此常常会让我们感到不知从何处下手,那么,我们可以通过一个简易的多人聊天室的项目,来综合运用这部分知识点,帮助我们更好地掌握和理解这部分知识

package com.softeem.TalkRoom.server;
/**
 * 服务器,用于接受客户端传来的消息并将其转发给所有的其他客户端
 */

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server extends Thread {
	//创建一个存放链接用户的集合
	static ArrayList list = new ArrayList<>();
	private Socket s;
	
	public Server(Socket s){
		this.s = s;
	}
	
	public void run(){
		//接受一个客户端发来的消息并转发给所有客户端
		new ChatServer(s).start();
	}
	
	public static void main(String[] args) throws IOException {
		//占据一个服务器端口
		ServerSocket ss = new ServerSocket(1919);
		System.out.println("服务器启动...");
		//开始监听
		while (true){
			Socket s = ss.accept();
			list.add(s);
			System.out.println("客户端连接成功:"+Tools.getIp(s.getInetAddress()));
			//新建一个基于该用户的线程
			new Server(s).start();
		}
		
	}
}
package com.softeem.TalkRoom.server;
/**
 * 接收流,负责输入输出
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;

public class ChatServer extends Thread {
	
	private Socket s;
	
	public ChatServer(Socket s) {
		this.s = s;
	}
	
	public void run(){
		//接收来自客户端的输入流
		try {
			BufferedReader br = Tools.getBufferedReader(s.getInputStream());
			String msg = "";
			//当流还未关闭时,一直接收消息并转发
			while ((msg = br.readLine()) != null){
				//发送到所有list内的对象
				for(Socket socket : Server.list){
					//发送消息
					Tools.sendMsg(socket,msg);
				}
			}
		} catch (SocketException e){
			System.err.println("客户端退出:"+Tools.getIp(s.getInetAddress()));
			Server.list.remove(s);
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
}
package com.softeem.TalkRoom.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;


public class Tools {
	public static String getIp(InetAddress i){
		return i.getHostAddress();
	}

	public static BufferedReader getBufferedReader(InputStream is) {
		
		return new BufferedReader(new InputStreamReader(is));
	}

	public static void sendMsg(Socket socket, String msg) throws IOException {
		//发送到socket流
		PrintWriter pw = new PrintWriter(socket.getOutputStream());
		pw.println(msg);
		pw.flush();
		
	}
	
	/**
	 * 消息格式化:ip+时间+消息
	 */
	public static String msgFormat(Socket s,String msg){
		SimpleDateFormat sdf = new SimpleDateFormat("【HH:mm:ss】");
		
		return s.getInetAddress().getHostAddress()+sdf.format(new Date())+":"+msg;
	}
}
package com.softeem.TalkRoom.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import com.softeem.TalkRoom.server.Tools;

public class Cilent {
	public static void main(String[] args) throws UnknownHostException, IOException {
		//连接服务器端口
		Socket s = new Socket ("192.168.4.164",1919);
		//创建一个接收消息线程
		new MsgReciver(s).start();
		
		//发送消息
		BufferedReader br = Tools.getBufferedReader(System.in);
		String msg = "";
		while ((msg = br.readLine()) != null){
			Tools.sendMsg(s, Tools.msgFormat(s, msg));
		}
	}
}
package com.softeem.TalkRoom.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.net.Socket;

import com.softeem.TalkRoom.server.Tools;

public class MsgReciver extends Thread {
	
	private Socket s;

	public MsgReciver(Socket s) {
		this.s = s;
	}
	
	public void run(){
		try {
			BufferedReader br = Tools.getBufferedReader(s.getInputStream());
			String msg = "";
			//当流未停止时,一直接受消息
			while ((msg = br.readLine()) != null){
				System.out.println(msg);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

通过这么一个项目,我们可以知道,Java中的IO流,多线程,网络编程等高级应用是基于java初级知识的,但是它们综合性强,要求我们要将这部分知识串起来才能更好的掌握。

你可能感兴趣的:(利用Java中的IO流,多线程及网络编程技术自制一个简易的多人聊天室)