Java TCP详解

Posted 剪水行舟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java TCP详解相关的知识,希望对你有一定的参考价值。


title: TCP
date: 2021-06-07 22:42:01
tags: NET
categories: Java
description:
top_img:
comments:
cover:


TCP

InetAddress

作用:封装计算机的IP地址和DNS(没有端口信息)。

特点:这个类没有构造方法。如果要得到对象,只能通过静态方法:getLocalHost()、getByName()、 getAllByName()、 getAddress()、getHostName()。

		//创建inetAddress对象
        InetAddress localHost = InetAddress.getLocalHost();

        //根据域名获得netAddress对象
        InetAddress byName = InetAddress.getByName("www.163.com");
        System.out.println(byName.getHostAddress());

        //port
        InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 8080);
        System.out.println(inetSocketAddress.getHostName());

        //url
        URL url = new URL("http://www.baidu.com:80/index.html?name=aaaa&age=18#a");
        //协议
        System.out.println("协议:"+url.getProtocol());
        //域名|ip
        System.out.println("域名|ip:"+url.getHost());
        //资源
        System.out.println("资源:"+url.getFile());
        System.out.println("资源:"+url.getPath());
        //端口
        System.out.println("端口:"+url.getPort());
        //参数
        System.out.println("参数:"+url.getQuery());
        //锚点
        System.out.println("锚点:"+url.getRef());

基础介绍

  1. 创建服务器ServerSocket,在创建时,定义ServerSocket的监听端口(在这个端口接收客户端发来的消息)。

    1. ServerSocket调用accept()方法,使之处于阻塞状态。

    2. 创建客户端Socket,并设置服务器的IP及端口。

    3. 客户端发出连接请求,建立连接。

  2. 分别取得服务器和客户端Socket的InputStream和OutputStream。

  3. 利用Socket和ServerSocket进行数据传输。

  4. 关闭流及Socket。

TCP实例

TCP Server

 		//指定端口 使用ServerSocket创建服务器
        ServerSocket serverSocket = new ServerSocket(9999);
        //阻塞式等待连接accept
        Socket client = serverSocket.accept();
        System.out.println("一个客户端建立了了连接");
        //输入输出流操作
        DataInputStream dataInputStream = new DataInputStream(client.getInputStream());
        String s = dataInputStream.readUTF();
        System.out.println(s);
        //释放资源
        dataInputStream.close();
        client.close();
        serverSocket.close();

TCP Client

 		// 建立连接 创建客户端 使用Socket 指定服务器地址和端口
        Socket client = new Socket("localhost",9999);
        //输入输出流操作
        DataOutputStream dataOutputStream = new DataOutputStream(client.getOutputStream());
        dataOutputStream.writeUTF("哈哈哈哈哈哈哈");
        dataOutputStream.flush();
        //释放资源
        dataOutputStream.close();
        client.close();

TCP Two Way Server

 		//指定端口 使用ServerSocket创建服务器
        ServerSocket serverSocket = new ServerSocket(9999);
        //阻塞式等待连接accept
        Socket client = serverSocket.accept();
        System.out.println("一个客户端建立了了连接");
        //输入输出流操作
        DataOutputStream dataOutputStream = new DataOutputStream(client.getOutputStream());
        DataInputStream dataInputStream = new DataInputStream(client.getInputStream());
        String s = dataInputStream.readUTF();
        String[] data = s.split("&");
        for (String info:data){
            String[] userInfo = info.split("=");
            System.out.println(userInfo[0]+"---"+userInfo[1]);
        }
        dataOutputStream.writeUTF("hahahahahh");
        //释放资源
        dataInputStream.close();
        dataOutputStream.close();
        client.close();
        serverSocket.close();
    }

TCP Two Way Client

 		// 建立连接 创建客户端 使用Socket 指定服务器地址和端口
        BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入用户名:");
        String uname = console.readLine();
        System.out.println("亲输入密码:");
        String upwd = console.readLine();

        Socket client = new Socket("localhost",9999);
        //输入输出流操作
        DataOutputStream dataOutputStream = new DataOutputStream(client.getOutputStream());
        DataInputStream dataIntputStream = new DataInputStream(client.getInputStream());
        dataOutputStream.writeUTF("uname="+uname+"&upwd="+upwd);
        dataOutputStream.flush();
        String s = dataIntputStream.readUTF();
        System.out.println(s);

        //释放资源
        dataIntputStream.close();
        dataOutputStream.close();
        client.close();
    }

TCP Multil Server

public static void main(String[] args) throws IOException {
        System.out.println("----------Server----------");
        //指定端口 使用ServerSocket创建服务器
        ServerSocket serverSocket = new ServerSocket(9999);
        boolean isRun = true;
        //阻塞式等待连接accept
        while (isRun){
            Socket client = serverSocket.accept();
            new Thread(new Channel(client)).start();
            System.out.println("一个客户端建立了了连接");
        }
        serverSocket.close();
    }

    public static class Channel implements Runnable{
        private Socket client;
        private  DataInputStream dataInputStream;
        public Channel(Socket client) throws IOException {
            this.client = client;
            dataInputStream = new DataInputStream(client.getInputStream());
        }

        @Override
        public void run() {
            //输入输出流操作
            try {
                String data = dataInputStream.readUTF();
                System.out.println("一个线程的数据:"+data);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //释放资源
            try {
                dataInputStream.close();
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

TCP Multil Client

		// 建立连接 创建客户端 使用Socket 指定服务器地址和端口
        Socket client = new Socket("localhost",9999);
        //输入输出流操作
        DataOutputStream dataOutputStream = new DataOutputStream(client.getOutputStream());
        dataOutputStream.writeUTF("哈哈哈哈哈哈哈");
        dataOutputStream.flush();
        //释放资源
        dataOutputStream.close();
        client.close();

以上是关于Java TCP详解的主要内容,如果未能解决你的问题,请参考以下文章

TCP协议的超时详解

Java TCP详解

Java线程池详解

Java线程池详解

Java 线程池详解

Java线程池详解