Java编写实现多人聊天室
本文实例为大家分享了Java实现多人聊天室的具体代码,供大家参考,具体内容如下
1.客户端
package tk.javazhangwei.net.tcp.chat.Demo03;
import java.io.BufferedReader;
import java.io.DatainputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入一个喜欢的名称:");
String name = bf.readLine();
if(name.equals("")) {
return;
}
Socket client = new Socket("localhost",1025);
//控制台输入信息
//控制台输入信息
new Thread(new Send(client,name)).start();//一条路径
new Thread(new Receive(client)).start();//一条路径
}
}
2.服务端(写了个内部类:负责接收与发送多进程)
package tk.javazhangwei.net.tcp.chat.Demo03;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server {
List<myChannel> all = new ArrayList<myChannel>();
public static void main(String[] args) throws IOException {
new Server().start();
}
public void start() throws IOException {
ServerSocket server = new ServerSocket(1025);
while (true) {
Socket socket = server.accept();
myChannel mc = new myChannel(socket);
Thread t = new Thread(mc);
all.add(mc);
t.start();
}
}
class myChannel implements Runnable{
private DataInputStream dis;
private DataOutputStream dos;
private boolean isRuning=true;
private String name;
public myChannel(Socket socket) throws IOException{
try {
dis = new DataInputStream(socket.getInputStream());
dos = new DataOutputStream(socket.getOutputStream());
this.name = dis.readUTF();
send("欢迎进入聊天室");
senOthers(this.name + "进入了聊天室");
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
isRuning=false;
dos.close();
dis.close();
}
}
private String receive() throws IOException {
String msg ="";
try {
msg =dis.readUTF();
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
isRuning=false;
dis.close();
}
return msg;
}
private void send(String msg) throws IOException {
if(msg==null&& msg.equals("")) {
return;
}
try {
dos.writeUTF(msg);
dos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
isRuning=false;
dos.close();
all.remove(this);
}
}
private void senOthers(String msg) throws IOException {
if (msg.startsWith("@")&&msg.indexOf(":")>-1) {// 表示为私聊
//获取name
String name = msg.substring(1, msg.indexOf(":"));
String content = msg.substring(msg.indexOf(":")+1);//获取冒号后的正文
for (myChannel others : all) {
if(others.name.equals(name)) {
others.send(this.name+"对您瞧瞧的说:"+content);
}
}
} else {
//遍历容器
for(myChannel others:all) {
if(others == this) {//如果是本身,就跳过
continue;
}
others.send(this.name+"对所有人说:"+msg);
}
}
}
@Override
public void run() {
while(isRuning) {
try {
senOthers(receive()) ;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
3.客户端的发送与接收多进程
package tk.javazhangwei.net.tcp.chat.Demo03;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class Send implements Runnable{
//控制台输入流
private BufferedReader console;
//管道输出流
private DataOutputStream dos;
private String name;
private boolean isRuning =true;//线程是否运行
public Send() {
console =new BufferedReader(new InputStreamReader(System.in));
}
public Send(Socket client,String name) throws IOException {
this();
try {
dos = new DataOutputStream(client.getOutputStream());
this.name = name;
send(name);
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
isRuning =false;
dos.close();
console.close();
}
}
private String getMsgFromConsole() {
try {
return console.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
@Override
public void run() {
while(isRuning) {
try {
send(getMsgFromConsole());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void send(String msg) throws IOException {
if (msg!=null && !msg.equals("")) {
try {
dos.writeUTF(msg);
dos.flush();// 强制刷新
} catch (IOException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
isRuning = false;
dos.close();
console.close();
}
}
}
}
package tk.javazhangwei.net.tcp.chat.Demo03;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
public class Receive implements Runnable{
//客户端的输入流
private DataInputStream dis;
private boolean isRuning = true;
public Receive() {
}
public Receive(Socket client) {
super();
try {
dis = new DataInputStream(client.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
isRuning =false;
try {
dis.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
public String receive() throws IOException {
String msg = "";
try {
msg =dis.readUTF();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
isRuning =false;
dis.close();
}
return msg;
}
@Override
public void run() {
while(isRuning) {
try {
System.out.println(receive());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
4.效果
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
相关文章