实战:即时通信"/>
TCP实战:即时通信
1、即时通信是什么含义,要实现怎么样的设计?
- 即时通信,是指一个客户端的消息发出去,其他客户端可以接收到
- 即时通信需要进行端口转发的设计思想
- 服务端需要把在线的Socket管道存储起来
- 一旦收到一个消息要推送给其他管道
服务端
package com.csdn.demo07_tcp5_sms;import java.io.*; import java.ServerSocket; import java.Socket; import java.util.ArrayList; import java.util.List;/*** 目标:实现 服务端 可以同时处理 多个客户端 的消息*/ public class ServerDemo2 {//定义一个静态的List集合存储当前全部在线的socket管道public static List<Socket> allOnlineSockets = new ArrayList<>();public static void main(String[] args) {try {System.out.println("===服务端启动成功===");//1、注册端口ServerSocket serverSocket = new ServerSocket(7777);//a.定义一个死循环由主线程负责不断的接收客户端的Socket管道连接while (true) {//2、每接收到一个客户端的Socket管道,交给一个独立的子线程负责读取消息Socket socket = serverSocket.accept();//上线逻辑System.out.println(socket.getRemoteSocketAddress() + "上线了,来了老弟!!");allOnlineSockets.add(socket);//上线完成//3、开始创建独立线程处理socketnew ServerReaderThread(socket).start();}} catch (IOException e) {throw new RuntimeException(e);}} }class ServerReaderThread extends Thread {private Socket socket;public ServerReaderThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {//3、从socket通信管道中得到一个字节输入流InputStream is = socket.getInputStream();//4、把字节输入流包装成缓冲字符输入流进行消息的接收BufferedReader br = new BufferedReader(new InputStreamReader(is));//5、按照行读取消息String msg;while ((msg = br.readLine()) != null) {System.out.println(socket.getRemoteSocketAddress() + "发来了:" + msg);//把这个消息进行端口转发给全部客户端socket管道sendMsgToAll(msg);}} catch (IOException e) {System.out.println(socket.getRemoteSocketAddress() + "下线了,下次再来哦,老弟!!");ServerDemo2.allOnlineSockets.remove(socket);}}private void sendMsgToAll(String msg) throws IOException {for (Socket socket : ServerDemo2.allOnlineSockets) {PrintStream ps = new PrintStream(socket.getOutputStream());ps.println(msg);ps.flush();}} }
客户端
package com.csdn.demo07_tcp5_sms;import java.io.*; import java.Socket; import java.util.Scanner;/*** 目标:完成 Socket 客户端开发,实现 多发 和 多收*/ public class ClientDemo1 {public static void main(String[] args) {try{System.out.println("===客户端启动===");//1、创建Socket通信管道请求有服务端的连接Socket socket = new Socket("127.0.0.1", 7777);//创建一个独立的线程专门负责这个客户端的读消息(服务端随时可能转发消息过来!)new ClientReaderThread(socket).start();//2、从socket通信管道中得到一个字节输出流 负责发送数据OutputStream os = socket.getOutputStream();//3、把低级的字节流包装成打印流PrintStream ps = new PrintStream(os);Scanner sc = new Scanner(System.in);while (true) {System.out.println("请说:");String msg = sc.nextLine();//4、发送消息ps.println(msg);ps.flush();}} catch (IOException e) {throw new RuntimeException(e);}} }class ClientReaderThread extends Thread {private Socket socket;public ClientReaderThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {//3、字节输入流InputStream is = socket.getInputStream();//4、把低级的字节输入流包装成高级的缓冲字符输入流BufferedReader br = new BufferedReader(new InputStreamReader(is));//5、按照行读取String line;while ((line = br.readLine()) != null) {System.out.println("收到消息" + line);}} catch (IOException e) {System.out.println("服务器把你踢出去了~~~");}} }
更多推荐
TCP实战:即时通信
发布评论