基于tcp的多线程聊天室的实现
基于tcp的多线程聊天室的实现
服务器
package Test;
//服务器
import ChatRoom01.Sreverjs;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
public class Server01 {
DataOutputStream dataOutputStream=null;
boolean issatart=false;
Socket socket=null;
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9998);
System.out.println("服务器已经启动");
ArrayList<Sreverjs> arrayList=new ArrayList<>();
Socket accept = null;
//等待连接
while (true){
accept = serverSocket.accept();
arrayList.add(new Sreverjs(accept,arrayList)); //传入一个Socket对象,并且传入一个集合,并且开启了服务器接收并转发的线程
System.out.println("一台客户端已经连接 ip:"+accept.getInetAddress()+"端口:"+accept.getPort());
System.out.println("当前服务器人数:"+arrayList.size());
// new Thread(new Sreverjs(accept,arrayList)).start();
}
}
}
服务器接收的线程
package ChatRoom01;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
//服务器接收的线程
public class Sreverjs implements Runnable{
String s=null;
Socket socket=null;
ArrayList<Sreverjs> arrayList;
public Sreverjs(Socket socket, ArrayList<Sreverjs> arrayLis) {
this.arrayList=arrayLis;
this.socket=socket;
new Thread(this).start(); //在构造对象的时候就开启线程。线程是启动自己,用于接收客户端传入来的数据,并且把他发送出去
}
public Sreverjs(Socket socket) {
this.socket=socket;
new Thread(this).start();
}
public Sreverjs( ArrayList<Sreverjs> arrayList ) {
this.arrayList=arrayList;
new Thread(this).start();
}
@Override
public void run() {
try {
DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
while (true){
DataOutputStream dataOutputStream=new DataOutputStream(socket.getOutputStream());
s = dataInputStream.readUTF();
System.out.println("ip:"+socket.getInetAddress()+"端口:"+socket.getPort()+" 说:"+s);
Iterator<Sreverjs> iterator = arrayList.iterator();
//遍历传入来的集合,集合里的每一个对象都是socket连接
while (iterator.hasNext()){
Sreverjs next = iterator.next();
next.send(s);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//发送方法,用于直接发送读取到的文字
public void send(String s) throws IOException {
DataOutputStream dataOutputStream=new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeUTF(s);
}
}
客户端
package Test;
import java.awt.*;
import java.io.*;
import java.net.ConnectException;
import java.net.Socket;
import java.util.Scanner;
//客户端
public class Client {
private static final String IP="127.0.0.1";
private static final int port=9998;
public Client() throws IOException {
try {
Socket socket=new Socket(IP,port);
Scanner scanner=new Scanner(System.in);
DataOutputStream dataOutputStream=new DataOutputStream(socket.getOutputStream());
new Thread(new Demo03(socket)).start(); //接收线程
new Thread(new Recive(dataOutputStream,scanner)).start(); //写出线程
}catch (IOException e){
System.out.println("服务器未上线");
}
}
public static void main(String[] args) throws IOException {
}
}
//客户端写出消息的线程
class Recive implements Runnable{
DataOutputStream dataOutputStream=null;
Scanner scanner=null;
public Recive(DataOutputStream dataOutputStream, Scanner scanner) {
this.dataOutputStream = dataOutputStream;
this.scanner = scanner;
}
@Override
public void run() {
while (true){
System.out.println("请输入消息");
try {
String s=scanner.nextLine();
dataOutputStream.writeUTF(s);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
客户端接收数据的线程
package Test;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.ArrayList;
//客户端接收的线程
public class Demo03 implements Runnable {
Socket socket=null;
public Demo03(Socket socket) {
this.socket=socket;
}
@Override
public void run() {
try {
while (true){
DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
String s = dataInputStream.readUTF();
System.out.println("ip:"+socket.getInetAddress()+"端口:"+socket.getPort()+" 说:"+s);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

浙公网安备 33010602011771号