1.首先建立服务端:ServiceSocket.java
**
* @ClassName: ServiceSocket
* @Description: 建立服务端
* @Author:
* @Date: 2019/6/10
*/
public class ServiceSocket {
public static List<Socket> socketList = new ArrayList<Socket>();
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(6666);//新建一个服务器套接字,并绑定指定端口
System.out.println("聊天室开启");
while(true){
Socket accept = serverSocket.accept();//监听绑定的端口
System.out.println("上线通知:用户"+accept.getInetAddress()+ "端口:"+accept.getPort()+"上线了");
socketList.add(accept);
//新建线程
new Thread(new ServiceSocketThread(accept)).start();
}
}
}
2.建立服务器端线程,用于监听绑定的端口:ServiceSocketThread.java
/**
* @ClassName: ServiceSocketThread
* @Description:
* @Author:
* @Date: 2019/6/10
*/
public class ServiceSocketThread implements Runnable {
public Socket socket;
public ServiceSocketThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true){
String str = br.readLine();//读取客户端输入的内容
List<Socket> socketList = ServiceSocket.socketList;
//循环遍历多个客户端,并将消息分别写入到控制台
for (Socket socket1 : socketList) {
PrintWriter pw = new PrintWriter(socket1.getOutputStream());
pw.println(socket1.getInetAddress()+"说:"+str);
pw.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.分别建立两个客户端
SocketClient1.java
/**
* @ClassName: SocketClient1
* @Description: 客户端1 启动两个线程,分别用于监听服务端和客户端
* @Author:
* @Date: 2019/6/10
*/
public class SocketClient1 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("192.168.43.113",6666);
System.out.println(socket.getInetAddress()+"连接成功!");
new Thread(new SocketClientThread1(socket)).start();
new Thread(new SocketClientThreah2(socket)).start();
}
}
SocketClient2.java
/**
* @ClassName: SocketClient1
* @Description: 客户端2 启动两个线程,分别用于监听服务端和客户端
* @Author:
* @Date: 2019/6/10
*/
public class SocketClient2 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost",6666);
System.out.println(socket.getInetAddress()+"连接成功!");
new Thread(new SocketClientThread1(socket)).start();
new Thread(new SocketClientThreah2(socket)).start();
}
}
4.建立用于监听客户端的线程:SocketClientThread1.java
/**
* @ClassName: SocketClientThread1
* @Description: 监听客户端线程
* @Author:
* @Date: 2019/6/10
*/
public class SocketClientThread1 implements Runnable {
public Socket socket;
public SocketClientThread1(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//读取控制台输入的内容
PrintWriter pw = new PrintWriter(socket.getOutputStream());
while (true){
String readLine = br.readLine();
pw.println(readLine);//将控制台输入的内容写入到服务端
pw.flush();//刷新缓存
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
5.建立服务器端线程,此线程监听的是传递到服务端的内容:SocketClientThreah2.java
/**
* @ClassName: SocketClientThreah2
* @Description: 监听服务器线程
* @Author:
* @Date: 2019/6/10
*/
public class SocketClientThreah2 implements Runnable {
public Socket socket;
public SocketClientThreah2(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true){
String s = br.readLine();//读取服务器端内容
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
6.分别启动服务端(ServiceSocket)和两个客户端(SocketClient1和SocketClient2)
首先启动服务端(ServiceSocket.java)启动后控制台输出以下内容:
聊天室开启
然后启动客户端1(SocketClient1.java),此时服务端和客户端1的控制台分别输出以下内容:
服务端:
上线通知:用户/127.0.0.1 端口:57257上线了
客户端1:
localhost/127.0.0.1连接成功!
最后启动客户端2(SocketClient2.java),此时服务端和客户端1的控制台分别输出以下内容:
服务端:
聊天室开启
上线通知:用户/127.0.0.1 端口:57257上线了
上线通知:用户/127.0.0.1 端口:57286上线了
客户端2 :
localhost/127.0.0.1连接成功!
分别在客户端1和客户端2输入内容:
localhost/127.0.0.1连接成功!
客户端1
/127.0.0.1说:客户端1
/127.0.0.1说:客户顿2
localhost/127.0.0.1连接成功!
/127.0.0.1说:客户端1
客户顿2
/127.0.0.1说:客户顿2