现在的位置: 首页 > 综合 > 正文

java实现的多人聊天(控制台输入)

2018年04月04日 ⁄ 综合 ⁄ 共 3053字 ⁄ 字号 评论关闭

在学习android时,想做一个多人聊天室,不知如何动手

想先做一个纯java的简单多人聊天室,理理思路

通过Socket套接字进行数据传输

用到的知识点是:Socket,ServerSocket,  多线程

 

服务器程序:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URLDecoder;
import java.net.UnknownHostException;
import java.util.ArrayList;


//这个程序是被连接的程序,俗称服务器程序
//在程序界中,网络是指2个程序产生信息交互,那么构成网络
//所以网络必须要有2个程序以上,一端叫服务器,一端叫客户端,通常服务器和客户端的对应关系是1-N


public class SimpleServer {
	
	//用于保存当前连接的用户
	public static ArrayList<Socket> socketList=new ArrayList<Socket>();
	
	public static void main(String[] args)throws Exception {
		
		//创建一个serverSocket,用于监听客户端Socket的连接请求
		ServerSocket serverSocket = new ServerSocket(10002);//10002为此服务器的端口号
		System.out.println("服务启动");
		//采用循环不断接收来自客户端的请求
		while (true) {
			//每当接收到客户端的请求时,服务器端也对应产生一个Socket
			Socket socket = serverSocket.accept();
			System.out.println("服务连接");
			// 把连接的客户端加入到list列表中
			socketList.add(socket);
			//启动一个新的线程
			//任务线程,每个连接用都有一个属于自己专用的任务线程
			//这个线程内会处理信息的发送和响应
			new MyThread(socket,socketList).start();
		}
/*
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
		// 把输入的内容输出到client
		while (true) {
			String msg = br.readLine();
			pw.println("服务器说:" + msg);
		}*/
	}
}

class MyThread extends Thread {
	
	Socket client;
	ArrayList<Socket> clients;

	BufferedReader br;
	
	public MyThread(Socket client,ArrayList<Socket> clients)throws Exception {
		super();
		this.client = client;
		this.clients = clients;
		
		br = new BufferedReader(new InputStreamReader(this.client.getInputStream()));
	}
	
	//把接收到的消息发送给各客户端
	public void run() {
		try {
			String content=null;
			while(true){
				//从某个客户端读取信息
				if((content=br.readLine())!=null) {
					for(Socket socket:clients){
						if(client!=socket){
							//把读取到的消息发送给各个客户端
							PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
							pw.println(content);
						}
					}
					content = URLDecoder.decode(content, "UTF-8");
					System.out.println(content);
					
				}	
			}
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}




客户端程序:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.URLDecoder;
import java.net.URLEncoder;

public class Client {
	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		//创建连接到本机,端口为10002的socket
		Socket client = new Socket("192.168.3.26", 10002);
		
		new MyThread(client).start();
		InputStream is = client.getInputStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		
		while (true) {
			String msg = br.readLine();
			//对收到的信息进行解码
			msg=URLDecoder.decode(msg, "UTF-8");
			System.out.println(msg);
		}
	}
}
class MyThread extends Thread {

	Socket client;

	public MyThread(Socket client) {
		super();
		this.client = client;
	}
	public void run() {
		// 发出消息
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(
					System.in));
			PrintWriter pw = new PrintWriter(client.getOutputStream(), true);
			// 把输入的内容输出到socket
			while (true) {
				String msg = br.readLine();
				//对发出的消息进行编码
				msg = URLEncoder.encode("张三说:" + msg, "UTF-8");
				pw.println(msg);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

这仅仅是设计思路,有点简陋,只能从控制台发送接收消息

抱歉!评论已关闭.