网络编程

1, 什么是计算机网络
把分布在不同地理区域的计算机专门的外部设备用通信线路互联成一个规模大, 功能强的网络系统, 从而是众多的计算机可以方便的互相传递信息, 共享硬件, 软件, 数据信息等资源

2, 计算机网络的主要功能
a, 资源共享
b, 信息传输与集中处理
c, 均衡负荷与分布处理

3, 什么是网络通信协议
计算机网络中实现通信必须有一些约定即通信协议, 对速率, 传输代码, 代码结构, 传输控制步骤, 出错控制等制定标准

4, 什么是网络通信接口
为了使两个节点之间能进行对话, 必须在他们之间建立通信工具(即接口), 使彼此之间能进行信息交换
接口包括两部分:
硬件装置: 实现结点之间的信息传送
软件装置: 规定双方信心通信的约定协议

5, 通信协议的分层
OSI(Open System Interconnection开放式系统互联)是国际标准化组织(ISO---International Organization for Standardization)制定的OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架

硬件 软件
OSI参考模型 TCP/IP参考模型

应用层
表示层 应用层
会话层
传输层 传输层
网络层 网络层
数据链路层
物理层 物理 + 数据链路层

数据传输的过程

6, IP协议, IP地址
网络层的主要协议, 支持网间互连的数据包通信
给每一台联网的电脑提供了一个唯一的地址(标识)

7, TCP和UDP协议
TCP: 可靠的数据连接
TCP是专门用于在不可靠的Internet上提供可靠的, 端对端的字节流通信的协议, 它是一种面向连接的协议, TCP连接是字节流而非报文流(添加了标记, 封装后的数据)
可靠, 效率低

UDP: 不可靠的数据连接
UDP向应用程序提供了一种发送封装原始IP数据报的方法, 并且发送时无需建立连接, 容易丢包
不可靠, 效率高

丢包可能的原因:
1, 网络
2, 硬件

8, Socket(套接字)编程
两个java应用程序可通过一个双向的网络通信连接实现数据交换, 这个双向链路的一端称为一个Socket

Socket通常用来实现client - server连接

java.net包中定义的两个类Socket和ServerSocket, 分别来实现双向连接的client和server端

建立连接时所需要的寻址信息为远程计算机的IP地址和端口号(port number)
什么是端口号 ?
端口号占两个字节

有一些端口号已经被占用了, 如果需要自定义使用端口号, 找1024以上的

TCP的端口有65536个
UDP的端口也有65536个

实现网络编程, 最好先启动服务器端, 在启动客户端

import java.net.*;
import java.io.*;

public class TestServer {
    public static void main(String[] args) throws Exception {
        // 端口 65536(1 - 65536, 1024之前)
        ServerSocket ss = new ServerSocket(8888);
        System.out.println("正在等待客户端的连接 !");
        Socket s = ss.accept(); // 阻塞式方法

        InputStream in = s.getInputStream();
        InputStreamReader isr = new InputStreamReader(in);
        BufferedReader br = new BufferedReader(isr);

        String msg = br.readLine();
        System.out.println("客户端: " + msg);

        br.close();
        s.close();
        ss.close();
    }
}
import java.net.*;
import java.io.*;

public class TestClient {
    public static void main(String[] args) throws Exception {
        Socket s = new Socket("127.0.0.1", 8888);

        OutputStream out = s.getOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(out);
        BufferedWriter bw = new BufferedWriter(osw);

        bw.write("黄河黄河, 我是长江 !");

        bw.close();
        s.close();

    }
}
原文地址:https://www.cnblogs.com/F9801/p/9067300.html