# 1.創建任務對象
~~~
import java.io.*;
import java.net.Socket;
/**
* 任務對象
*/
public class ServerRunnableTarget extends Thread {
private Socket socket;
public ServerRunnableTarget(Socket socket){
this.socket=socket;
}
@Override
public void run() {
try {
//1. 從socket中獲取字節輸入流對象
//把字節輸入流包裝成緩存字節輸入流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg;
while ((msg=bufferedReader.readLine())!=null){
// 2.把服務器接收到的消息推送給所有在線的socket
sendMsgToAllClient(msg);
}
} catch (Exception e) {
// 下線
System.out.println("有人下線了");
// 刪除下線的
Server.allSocketOnLien.remove(socket);
}
}
/**
* 把服務器接收到的消息推送給所有在線的socket
* @param msg
*/
private void sendMsgToAllClient(String msg) throws IOException {
for (Socket socket1 : Server.allSocketOnLien) {
PrintStream stream = new PrintStream(socket1.getOutputStream());
stream.println(msg);
stream.flush();
}
}
}
~~~
# 2.創建服務端
~~~
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
/**
* 1.注冊端口
* 2.接收客戶端的消息連接,交給獨立的線程來處理
* 3.把當前連接的socket緩存到一個集和列表中
* 4.接收socket的消息,然后推送給當前所以在線的socket接收
*/
public class Server {
//
public static final List<Socket> allSocketOnLien =new ArrayList<Socket>();
public static void main(String[] args) {
System.out.println("服務端啟動");
try {
// ServerSocket 對象進行服務器端口注冊
ServerSocket serverSocket = new ServerSocket(9999);
while (true){
Socket socket = serverSocket.accept();
// 把在線socket存入一個在線集合中
allSocketOnLien.add(socket);
// 為當前socket分配一個獨立的線程來與之處理
new ServerRunnableTarget(socket).start();
}
}catch (Exception e){
e.fillInStackTrace();
}
}
}
~~~
# 3.客戶端
~~~
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
try {
// 創建socket鏈接請求
Socket socket = new Socket("127.0.0.1", 9999);
// 從socket中獲取字節輸出流對象
OutputStream socketOutputStream = socket.getOutputStream();
//把字節輸出流包裝成打印流
PrintStream printStream = new PrintStream(socketOutputStream);
// 接收信息
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 掃描器
Scanner scanner = new Scanner(System.in);
// 打印信息線程
Thread thread = new Thread(){
@Override
public void run() {
while (true){
try {
System.out.println(bufferedReader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
thread.start();
// 發送信息
while (true) {
System.out.println("請說:");
printStream.println(scanner.nextLine());
printStream.flush();
}
} catch (Exception e) {
e.fillInStackTrace();
}
}
}
~~~