简单多人聊天

用多线程实现简单多人聊天(非界面)

前言

要想实现多人聊天效果,首先,你得先掌握(至少要晓得有这玩样儿):多线程、Io流中读流(inputstream) 写流(outputstream)网络包.net

多线程浅谈

多线程可以让我们的程序部分可以产生同时运行的效果,各玩各的。
提高效率是其次,主要是能让多段代码同时执行。总之,使用多线程可以最大限度的利用CPU资源。
多线程的一个特性:随机性(谁抢到谁执行,至于执行多长,CPU说了算)
====================================================
在Java中,多线程的实现有两种方式:
 
1.继承java.lang.Thread类(  关键词:Thread、run()、start())

子类:-------------------------------------------------

public class Person extends Thread{
	    @overriad
	    public void run(){
		System.out.println("这是个线程");
	    }
	}

测试类:------------------------------------------------

   Person ps=new Person(); //初始化线程
	   ps.start();             //启动线程并调用run方法
2.实现java.lang.Runnable接口
====================================================

子类:-------------------------------------------------

public class Ticket implement Runnable{
private int tick=100;
@override
public void run(){
   
}
}

测试类:------------------------------------------------

public class TickDemo{
    public static void main(String[] args){
   
    //实例化线程
    Thread t=new Thread(t);  //创建线程
    t1.start();  //执行线程启动run()
    }
}

======================================

实现思路

运用网络读写包,客户端发送消息,通过服务器转发给其他客户端,其他客户端接收服务器消息就可以简单实现多人聊天

步骤

1:启动服务器
2:启动客户端
3:服务器用集合来接收客户
4:客户端发送信息
5:服务器接收客户端消息
6:服务器发送给其他客户端
7:其他客户端接收服务器消息

源码

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

/**
 * 服务器
 * @author Administrator
 *
 */
public class MyServer {
	public static void main(String[] args) throws Exception {
		//启动服务器
		
		ServerSocket ss=new ServerSocket(7788);
		System.out.println("服务器已启动,等待用户连接");
		//实例化一个集合进行接收
		Vector<Socket> vc=new Vector<Socket>();
		while (true) {
			//一个一个的客户端
			Socket sk=ss.accept();
			//增加到集合
			vc.add(sk);
			//连接到服务器线程 读取客户的信息 将信息转给其它客户端(除了自己)
			new ServerThread(sk,vc).start();
			
		}
	}
}

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Vector;
import java.util.function.IntPredicate;

/**
 * 服务器线程
 * @author Administrator
 *
 */
public class ServerThread extends Thread  {
	//接收客户端信息(读)
	//转发客户端信息(除了自己)(写)
	Socket sk=null;
	Vector<Socket> vc=null;
	public ServerThread(Socket sk,Vector<Socket> vc) {
		// TODO Auto-generated constructor stub
		this.sk=sk;
		this.vc=vc;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			//读流
			 try {
				InputStream is= sk.getInputStream();
				InputStreamReader isr=new InputStreamReader(is);
				BufferedReader br=new BufferedReader(isr);
				String str=br.readLine();
				//转发读取到的信息
				for (Socket s : vc) {
					if (s!=null) {//保证有其他客户端在线
						if (s!=sk) {//排除自己
							OutputStream os=s.getOutputStream();
							OutputStreamWriter osw=new OutputStreamWriter(os);
							BufferedWriter bw =new BufferedWriter(osw);
						
							bw.write(str);
							bw.newLine();
							bw.flush();
						}
					}
				}if ("bye".equals(str)) {
					sk.close();//发送消息
					br.close();//读取消息
					vc.remove(sk);//下线
				}
			 } catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
/**
 * 接收
 * @author Administrator
 *
 */
public class ClientRead extends Thread{
	private Socket sk=null;
	public ClientRead(Socket sk) {
		// TODO Auto-generated constructor stub
		this.sk=sk;
	}
	@Override
	public void run() {
		while (true) {
			try {
				InputStream is=sk.getInputStream();
				InputStreamReader isr=new InputStreamReader(is);
				BufferedReader br=new BufferedReader(isr);
				String str=br.readLine();
				System.out.println("收到消息:"+str);
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
		}
	}
}

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
/**
 * 转发
 * @author Administrator
 *
 */
public class ClientWriter extends Thread {
	private Socket sk=null;
	
	public ClientWriter(Socket sk) {
		// TODO Auto-generated constructor stub
		this.sk=sk;
	}
	Scanner mys=new Scanner(System.in);
	@Override
	public void run() {
		
		while (true) {
			try {
				OutputStream os=sk.getOutputStream();
				OutputStreamWriter osw=new OutputStreamWriter(os);
				BufferedWriter bw=new BufferedWriter(osw);
				System.out.println("请输入你要发的消息:");
				String str=mys.next();
				if (str!=null) {
					bw.write(str);
					bw.newLine();
					bw.flush();
				} 
				
				
				if ("bye".equals(str)) {
					sk.close();
					bw.close();
					
					break;
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
}
import java.net.InetAddress;
import java.net.Socket;
/**
 *客户端
 * @author Administrator
 *
 */
public class MyClient {
	public static void main(String[] args)throws Exception {
		//连接到服务器
		Socket sk=new Socket(InetAddress.getByName("127.0.0.1"),7788); 
		System.out.println("已上线");
		//读取信息,转发信息
		new ClientRead(sk).start();
		//回复消息
		new ClientWriter(sk).start();
	}
}

关于界面版的(swing)

其实要做出swing界面版的简单多人聊天只需要增加一些swing组件(无非弄出一个几个界面,加上文本域,几个按钮,当然,这只是简略版…)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想余生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值