• 学习JavaSE TCP/IP协议与搭建简易聊天室


    一、TCP/IP协议

    1、TCP/IP协议包括TCP、IP和UDP等
    2、域名通过dns服务器转换为IP地址
    3、局域网可以通过IP或者主机地址寻找到相应的主机
    4、TCP是可靠的连接,效率低,且连接是一对一,TCP;而UDP是不可靠连接,容易丢失数据,但是效率高,且连接是一对多。

    image

    二、端口号

    1、端口号唯一确定服务器中的某个应用
    2、一台服务器不允许存在两个相同端口号的应用
    3、IP:port唯一确定服务器应用程序
    4、https的默认端口为443,http为80,https是http的加密和解密的升级版

    三、Socket

    1、客户端应用程序与Port间使用Socket连接,打个比方,客户端应用程序比作家用电器,Port的IO流比作电流,那么Socket就是插座,家用电器只有将电线插到插座上才能通电
    2、服务端与Port间使用ServerSocket连接
    3、只要获得了Socket实例,就有了IO流

    四、InetAddress类

    public class TestTcp {
        public static void main(String[] args) {
            try {
                InetAddress localHost = InetAddress.getLocalHost();
                System.out.println(localHost.getHostName());//获取主机名
                System.out.println(localHost.getHostAddress());//获取主机地址
    
                localHost = InetAddress.getByName("baidu.com");
                System.out.println(localHost.getHostName());
                System.out.println(localHost.getHostAddress());
    
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
        }
    }
    

    五、简易聊天室

    本聊天室包括一个服务端和n个客户端,客户端向服务端发送消息,服务端再将该消息群发给除了它们本身的其它客户端。
    想要发消息,必须要拥有IO流,想要IO流就必须拥有Socket,另外有谁的Socket就可以向谁发消息。
    image
    聊天室代码如下:

    
    
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    
    
    public class TalkTool {
    }
    
    //服务端
    class ServerT{
        public static void main(String[] args) {
            try {
    
                ServerSocket serverSocket = new ServerSocket(9014);//建立服务端套接字与端口关联
                System.out.println("服务端启动成功,等待客户端连接");
                List<Socket> socketList = new ArrayList<>();
                while (true) {
                    //主线程只负责客户端连接
                    Socket socket = serverSocket.accept();//等待客户端连接(阻塞状态)
                    System.out.println("有客户端连入");
                    socketList.add(socket);
                    new Thread(new ForwardT(socket,socketList)).start();
    
                }
    
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
        }
    }
    
    //客户端
    class ClientT{
        public static void main(String[] args) {
    
            try {
                Socket socket = new Socket("192.168.226.1",9014);//建立连接,IP地址根据实际情况设置
                System.out.println("客户端与服务端建立了连接");
                OutputStream outputStream = socket.getOutputStream();
                PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(outputStream),true);
                Scanner scanner = new Scanner(System.in);
                //独立线程负责接收消息
                new Thread(new ReceveT(socket)).start();
                while (true) {
    
                    printWriter.println(scanner.next());
    
    
                }
    
    
    
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
        }
    }
    
    //服务端转发线程
    class ForwardT implements Runnable{
        private Socket socket;
        private List<Socket> socketList;
        public ForwardT(Socket socket,List<Socket>socketList){
            this.socket=socket;
            this.socketList=socketList;
    
        }
        @Override
        public void run() {
    
            try {
                while (true) {
                    InputStream inputStream = socket.getInputStream();
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                    String msg = bufferedReader.readLine();
                    System.out.println(msg);
    
    
    
                    for (Socket sk:socketList
                         ) {
                        if (sk!=socket){//把自己排除掉
                        //发送给其它客户端,必须要有其它客户端的Socket
                            OutputStream outputStream = sk.getOutputStream();
                            PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(outputStream),true);
    
                            printWriter.println(socket+"说:"+msg);
                        }
                    }
    
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    //客户端接收线程
    class ReceveT implements Runnable{
        private Socket socket;
    
        public ReceveT(Socket socket){
            this.socket=socket;
    
        }
        @Override
        public void run() {
    
            try {
                while (true) {
                    InputStream inputStream = socket.getInputStream();
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                    System.out.println("服务端返回"+bufferedReader.readLine());
    
    
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    
  • 相关阅读:
    Python 自动化测试实战训练营,由浅入深,从小白到测试高手!
    接口测试 Mock 实战(二) | 结合 jq 完成批量化的手工 Mock
    从文科生转行测试,再到大厂测试开发工程师,我是如何做到的?
    严正声明|严厉打击盗版侵权、非法销售「霍格沃兹测试学院」课程的违法行为
    「金羽毛」有奖征文 | 记录测试开发技术进阶之路的点滴
    测试工程师职业发展漫谈
    Workshop 深圳站|实战+源码架构剖析带你揭开Appium的神秘面纱
    那些难改的 Bug,最后都怎样了?
    BAT大厂都在用的Docker。学会这三招,面试、工作轻松hold住
    2021 开年学习送福利,助力测试进阶提升!
  • 原文地址:https://www.cnblogs.com/HashMap-Fantasy/p/8681824.html
Copyright © 2020-2023  润新知