前言
要想实现多人聊天效果,首先,你得先掌握(至少要晓得有这玩样儿):多线程、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组件(无非弄出一个几个界面,加上文本域,几个按钮,当然,这只是简略版…)