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

Posted 大前端圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java实现的多人聊天(控制台输入)相关的知识,希望对你有一定的参考价值。

在学习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();
		
	


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

以上是关于java实现的多人聊天(控制台输入)的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot——SpringBoot集成WebSocket实现简单的多人聊天室

SpringBoot——SpringBoot集成WebSocket实现简单的多人聊天室

Java网络编程系列之基于BIO的多人聊天室设计与实现

基于Java NIO的多人在线聊天工具源码实现(登录,单聊,群聊)

java 通过TCPUDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端

java是如何实现聊天功能的?