java socket聊天室

一个java版本的控制台版的聊天室,记录一下。以便后续使用

服务端

package com.tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
 * 1.创建服务器端口
 * 2.接收客户端连接
 * 3.发送数据
 * @author jacktan
 *
 */
public class Server
{
	public List<MyCall> all = new ArrayList<>();
	
	public static void main(String[] args) throws IOException
	{
		new Server().start();
	}
	
	public void start() throws IOException {
		//1.创建服务器端口,指定端口
		ServerSocket serverSocket = new ServerSocket(8888);
		//2.接收客户端连接,阻塞
		while ( true ) {
			Socket socket = serverSocket.accept();
			MyCall my = new MyCall(socket);
			//将客户端添加到容器中
			all.add(my);
			new Thread(my).start();
		}
	}
	
	private class MyCall implements Runnable {
		private BufferedReader br = null;
		private BufferedWriter bw = null;
		private boolean isRunning = true;
		private String name;
		public MyCall(Socket socket)
		{
			try
			{
				bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
				br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				this.name = br.readLine();
				this.send(this.name+"欢迎您进入聊天室");
				this.sendOther(this.name+"进入聊天室");
			} catch (IOException e)
			{
				isRunning = false;
			}
		}
		
		/**
		 * 读取消息
		 * @return
		 */
		public String receive() {
			String lineText = "";
			try
			{
				lineText = br.readLine();
			} catch (IOException e)
			{
				isRunning = false;
				CloseUtils.closeAll(br);
				all.remove(this);
				
			}
			return lineText;
		}
		
		/**
		 * 发送数据
		 * @param msg
		 */
		public void send(String msg) {
			if ( msg == null || "".equals(msg) ) {
				return;
			}
			//私聊只需要改这里的代码就可以了
			try
			{
				bw.write(msg);
				bw.newLine();
				bw.flush();
			} catch (IOException e)
			{
				isRunning = false;
				CloseUtils.closeAll(bw);
				all.remove(this);
			}
		}
		
		/**
		 * 发送给其他人
		 */
		public void sendOther(String msg) {
			//发送消息给所有人,不包含自己
			for ( MyCall m : all ) {
				if ( m != this ) {			
					m.send(msg);
				}
			}
		}

		@Override
		public void run()
		{
			while ( isRunning ) {
				sendOther(receive());
			}
		}
	}
}

 客户端:

package com.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * 1.创建连接
 * 2.接收数据
 * @author jacktan
 *
 */
public class Client
{
	public static void main(String[] args) throws UnknownHostException, IOException
	{
		System.out.println("请输入您的名称:");
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String name = br.readLine();
		
		Socket client = new Socket("localhost",8888);
		new Thread(new Send(client,name)).start();
		new Thread(new Receive(client)).start();
	}
}

 发送数据:

package com.tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

/**
 * 发送数据的线程
 * 
 * @author jacktan
 * 
 */
public class Send implements Runnable
{
	// 1.获取控制台输入流
	private BufferedReader console;
	// 2.获取输出流
	private BufferedWriter bw;
	// 3.当前线程标识
	private boolean isRunning = true;
	// 4.客户名称
	private String name; 
	
	public Send()
	{
		console = new BufferedReader(new InputStreamReader(System.in));
	}

	public Send(Socket socket,String name)
	{
		this();
		this.name = name;
		try
		{
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			//客户端一进入就给服务器发送一条消息
			send(this.name);
		} catch (IOException e)
		{
			// 不让线程再运行
			isRunning = false;
			CloseUtils.closeAll(console,bw);
		}
	}
	
	
	//从控制台接收数据
	private String getMsgFromConsole() {
		try
		{
			return console.readLine();
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			//e.printStackTrace();
		}
		return "";
	}
	
	//发送数据
	public void send(String msg) {
		if ( msg != null && !msg.equals("") ) {
			try
			{
				bw.write(msg);
				//换行并强制刷新
				bw.newLine();
				bw.flush();
			} catch (IOException e)
			{
				//发送失败退出
				isRunning = false;
				CloseUtils.closeAll(console,bw);
			}
		}
	}

	@Override
	public void run()
	{
		while (isRunning)
		{
			send(getMsgFromConsole());
		}
	}

}

 接收数据:

package com.tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

import javax.sound.sampled.ReverbType;

/**
 * 接收数据的线程
 * @author jacktan
 *
 */
public class Receive implements Runnable
{
	//1.获取输入流
	private BufferedReader br = null;
	//2设置标识符
	private boolean isRunning = true;
	public Receive(Socket socket)
	{
		try
		{
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		} catch (IOException e)
		{
			isRunning = false;
			CloseUtils.closeAll(br);
		}
	}
	
	/**
	 * 接收数据
	 */
	public String receive() {
		String lineText = "";
		try
		{
			lineText = br.readLine();
		} catch (IOException e)
		{
			isRunning = false;
			CloseUtils.closeAll(br);
		}
		return lineText;
	}
	
	@Override
	public void run()
	{
		while ( isRunning ) {
			System.out.println(receive());
		}
	}
	
}

 关闭资料功能类

package com.tcp;

import java.io.Closeable;
import java.io.IOException;

public class CloseUtils
{
	/**
	 * 关闭所有流
	 * 
	 * @param io
	 */
	public static void closeAll(Closeable... io)
	{
		for (Closeable temp : io)
		{
			if (temp != null)
			{
				try
				{
					temp.close();
				} catch (IOException e)
				{
					// TODO Auto-generated catch block
				}
			}
		}
	}
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值