zoukankan      html  css  js  c++  java
  • 网络编程

    网络通信三要素

    网络通信协议(OSI七层协议、TCP/IP四层协议):

    1. 物理链路层:
    2. 网络层:ICMP/IGMP/IP/ARP/RARP
    3. 传输层:TCP/UDP()
    4. 应用层:HTTP/SMTP/FTP/DNS

    java.net包提供了两种常见的网络协议的支持:TCP/UDP

    网络编程三要素:协议、IP地址、端口号

    IP地址:

    1. IPv4:32位,4组,每组1个字节,2011年已经分配完毕
    2. IPv6:128位,8组,每组16个字节,ABCD:EF01:2345:6789:ABCD:EF01:2345:6789

    端口号:

    1. 取值0-66535,其中0-1023已被知名网络服务占用,普通应用程序使用1024以上的端口号。

    TCP通信

    在Java中,提供了两个类用于实现TCP通信:

    1. 客户端:java.net.Socket 类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
    2. 服务端:java.net.ServerSocket 类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。

    客服端和服务器交换通过IO流,服务器必须明确两件事:

    1. 通过accept()获取客户端对象;
    2. 服务器本身没有IO流,但是可以使用客服端的IO流和客户端交互。

    简单的TCP通信

    客户端编程:

    1. 【创建对象】创建客户端对象Socket(ip, port),本机IP和端口号;
    2. 【获取输出流】使用SocketgetOutputStream()获取输出流OutputStream的对象;
    3. 【发送数据】使用OutputStreamwrite()给数据给服务器;
    4. 【获取输入流】使用SocketgetInputStream()获取输入流InputStream的对象;
    5. 【读数据】使用InputStreamread()获取服务器的数据;
    6. 【释放资源】释放资源socket.close();

    服务器编程:

    1. 【创建对象】创建服务器对象ServerSocket(端口号)
    2. 【获取客户端】使用ServerSocketaccept()获取客户端对象Socket
    3. 【获取输入流】使用SocketgetInputStream()获取输入流InputStream的对象;
    4. 【获取数据】使用InputStreamread()获取客服端发送的数据;
    5. 【获取输出流】使用SocketgetOutputStream()获取输出流OutputStream的对象;
    6. 【返回数据】使用OutputStreamwrite()给客户端发送数据;
    7. 【释放资源】释放资源socket.close()server.close()

    先写服务器代码,然后开启服务器:

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TCPServer {
        public static void main(String[] args) throws IOException {
            // 1. 创建对象
            ServerSocket server = new ServerSocket(8888);
            // 2. 获取客户端
            Socket socket = server.accept();
            // 3. 获取输入流
            InputStream input = socket.getInputStream();
            byte[] bytes = new byte[1024];
            // 4. 获取数据
            int len = input.read(bytes);
            System.out.println(new String(bytes, 0, len));
            // 5. 获取输出流
            OutputStream output = socket.getOutputStream();
            // 6. 返回数据
            output.write("我是服务器".getBytes());
            // 7. 释放资源
            socket.close();
            server.close();
        }
    }
    

    客户端代码,开启客服端:

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class TCPClient {
        public static void main(String[] args) throws IOException {
            // 1. 创建对象
            Socket socket = new Socket("127.0.0.1", 8888);
            // 2. 获取输出流
            OutputStream output = socket.getOutputStream();
            // 3. 发送数据
            output.write("你是谁".getBytes());
            // 4. 获取输入流
            InputStream input = socket.getInputStream();
            byte[] bytes = new byte[1024];
            // 5. 读数据
            int len = input.read(bytes);
            System.out.println(new String(bytes, 0, len));
            // 6. 释放资源
            socket.close();
        }
    }
    
  • 相关阅读:
    C#实现ASE加密解密
    c# 深复制
    Jenkins + Git +IIS 部署
    c#模拟Http请求
    TCP/IP学习
    c# 字符串中包含 "" 时提示:无法识别的转义序列
    部署.net core项目到IIS后HTTP 错误 500.19
    .net core读取配置文件appsetting.json
    asp.net提示“未能加载文件或程序集“XXXXXXXX.dll”或它的某一个依赖项。找不到指定的模块。”
    WCF错误404.17 请求的内容似乎是脚本,因而无法由静态文件处理程序来处理
  • 原文地址:https://www.cnblogs.com/mingriyingying/p/13581018.html
Copyright © 2011-2022 走看看