1. 概述:计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台议计算机都可以直接通信,因此所有计算机都需要遵循同一种网络协议。为了把计算机网络接入互联网,就必须使用TCP/IP协议。

TCP/IP协议泛指互联网协议,其中最重要的两个协议是 TCP协议和 IP协议。只有使用 TCP/IP协议的计算机才能够联入互联网,使用其他网络协议(例如NetBIOS、AppleTalk协议等)。

IP地址:在互联网中,一个 IP地址用于准一标识一个网络接口(NetworkInterface )。一台联入互联网的计算机肯定有一个 IP地址,但也可能有多个IP地址。

IP地址分为 IPv4和 IPv6两种。IPv4采用32位地址,类似101.202.99.12,而 IPv6采用 128位地址,类似2001:0DA8:1OOA:0OO0:0OO0:1020:F2F3:1428。 IPv4地址总共有232个(大约42亿),而 IPv6地址则总共有21z8个(大约340万亿亿亿亿),IPv4 的地址目前已耗尽,而 IPv6的地址是根本用不完的。

IP地址又分为公网IP地址和内网IP地址。公网IP地址可以直接被访问,内网IP地址只能在内网访问。内网 IP地址类似于:

192 . 168 .x.次

10 .X.X.X

(注:有一个特殊的P地址,称之为本机地址,它总是127.0.0.1。)

2. 网络模型:由于计算机网络从底层的传输到高层的软件设计十分复杂,要合理地设计计算机网络模型,必须采用分层模型,每一层负责处理自己的操作。 OSI(open SystemInterconect)网络模型是 Iso组织定义的一个计算机互联的标准模型,注意它只是一个定义,目的是为了简化网络各层的操作,提供标准接口便于实现和维护。这个模型从上到下依次是:

应用层:提供应用程序之间的通信;

表示层:处理数据格式,加解密等等;

会话层:负责建立和维护会话;

传输层:负责提供端到端的可靠传输;

网络层:负责根据目标地址选择路由来传输数据;

数据链路层和物理层:负责把数据进行分片并且真正通过物理网络传输,例如:无线网、光纤等。

3. 常用协议:IP协议是一个分组交换协议,它不保证可靠传输。而 TCP协议是传输控制协议,它是面向连接的协议,支持可靠传输和双向通信。TCP协议是建立在IP协议之上的,简单地说,IP协议只负责发数据包,不保证顺序和正确性,而TCP协协负责控制数据包传输,它在传输数据之前需要先建立连接,建立连接后才能传输数据,传输完后还需要断开连接。TCP协议之所以能保证数据的可靠传输,是通过接収确认、超时重传这些机制实现的。并且, TCP协议允许双向通信, 即通信双方可以同时发送和接收数据。

TCP协议也是应用最广泛的协议,许多高级协议都是建立在TCP协议之上的,例如HTTP、SMTP等。

UDP协议(User Datagram Protocol)是一种数据报文协议,它是无连接协议,不保证可靠传输。因为UDP协议在通信前不需要建立连接,因此它的传输效率比 TCP高,而且 UDP协议比 TCP协议要简单得多。选择 UDP协议时,传输的数据通常是能容忍丢失的,例如,一些语音视频通信的应用会选择 UDP协议。

4. 什么是Socket?

Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据传输到网络。

5. 服务器端:要使用Socket编程,首先要编写服务器端程序。Java标准库提供了ServerSocket来实现对指定IP和端口的监听。ServerSocket的典型实现代码如下:

public class Server {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(6666); // 监听指定端口System.out.println("server is running...");while (true) {Socket sock = ss.accept();// 使用Socket流进行网络通信// ...System.out.println("connected from " + sock.getRemoteSocketAddress());}}
}

服务器端通过下面代码,在指定端口6666监听。这里我们我们没有指定IP地址,表示在计算机的所有网络接口上进行监听。

ServerSocket ss = new ServerSocket(6666);

如果ServerSocket监听成功,我们写一个死循环来处理客户端的连接

  while (true) {Socket sock = ss.accept();System.out.println("connected from " + sock.getRemoteSocketAddress());}

(注意:代码as.accept()表示每当有新的客户端连接进来后,就返回一个Socket实例,这个Socket实例就是用来和刚连接的客户端进行通信的)

如果没有客户端连接进来,accept()方法会阻塞并一直等待。如果有多个客户端同时连接进来,ServerSocket会把连接进来的客户端扔到队列里,一个一个处理。

6. 客户端:相比服务器端,客户端程序就简单很多

public class Client {public static void main(String[] args) throws IOException {// 连接指定服务器和端口Socket sock = new Socket("localhost", 6666); // 使用Socket流进行网络通信// ...// 关闭sock.close();System.out.println("disconnected.");}
}

客户端通过下述代码,连接到服务器端,注意上述代码的服务器地址是"localhost",表示本机地址。端口号是6666。如果连接成功,将返回一个Socket实例,用于后续通信。

Socket sock = new Socket("localhost", 6666);

7. Socket流:当Socket连接成功后,无论是服务器端,还是客户端,我们都使用Socket实例进行网络通信,因为TCP是一种基于流的协议,因此,Java标准库使用InputStream和OutputStream来封装Socket的数据流,这样使用Socket的流就和普通流类似:

// 用于读取网络数据:
InputStream in = sock.getInputStream();// 用于写入网络数据:
OutputStream out = sock.getOutputStream();

写入网络数据时,必须要调用flush()方法,如果不调用flush(),我们可能会发现,客户端和服务器端都收不到数据,这是因为我们以流的形式写入数据的时候,并不是一写就立刻发送到网络,而是先写入内存缓冲区,直到缓冲区满了以后,才会一次性真正发送到网络,这样设计的目的是为了提高传输效率。如果缓冲区的数据较少,而我们又想强制把这些数据发送到网络,就必须调用flush()强制把缓冲区数据发送出去。

8. 总结:使用Java进行TCP编程时,需要使用Socket模型

服务器端用ServerSocket监听指定端接口;

客户端使用Socket(InetAdrdress,port)连接服务器;

服务器端用accept()接收并返回Socket实例;

双方通过Socket打开InputStream/OutputStream读写数据;

flush()方法用于强制输出到网络;

服务器通常使用多线程同时处理多个客户端连接,利用线程池可大幅提升效率。

网络编程—TCP编程相关推荐

  1. C语言笔记(27)网络编程-TCP编程

    CS模式 有个服务器, 有个客户端, 会经过一些函数 linux下,所有的操作都是对文件进行操作,而对文件的操作是利用文件描述符(file descriptor)来实现的.每个文件进程控制块中都有一份 ...

  2. socket网络编程——TCP编程流程及端口号占用问题

    1.TCP编程流程 1.1TCP服务器端客户端及方法介绍 TCP 提供的是面向连接的.可靠的.字节流服务.TCP 的服务器端和客户端编程流程如下: socket()方法是用来创建一个套接字,有了套接字 ...

  3. Linux 网络编程——TCP编程

    概述 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP 具有以下特点: 1)电话系统服务模式的抽象 2) ...

  4. python之网络编程 --- TCP编程

    Python的第三方库非常强大,简单易用,简直不要太爽. 首先看一下TCP编程 TCP的服务模型包括面向连接的服务和可靠数据传输服务,首先要进行三次握手,建立全双工连接,连接双方的进程可以在此连接上同 ...

  5. 网络编程——TCP编程

    一.概述 计算机网络是指两台或更多计算机组成的网络,在同一网络中,任意两台计算机都可以直接通信,因为所有计算机都需要遵循同一协议. 互联网是网络的网络,即把很多计算机网络连接起来,形成一个全球统的网络 ...

  6. GO语言使用之网络编程(TCP编程)

    一.基本介绍 Golang的主要设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分. 1. 网络编程有两种: TCP socket编程,是网络编程的主流.之 ...

  7. Socket编程 | TCP编程基本流程和API详解-1

    1. 基本概念 TCP (即传输控制协议) 是一种面向连接的传输层协议,它能提供高可靠性通信 (即数据无误.数据无丢失.数据无失序.数据无重复到达的通信). 2. 通信流程解析 TCP 通信的流程与打 ...

  8. 菜鸟学习笔记:Java提升篇10(网络2——UDP编程、TCPSocket通信、聊天室案例)

    菜鸟学习笔记:Java提升篇10(网络2--UDP编程.TCPSocket通信) UDP编程 TCP编程(Socket通信) 单个客户端的连接 多个客户端的连接(聊天室案例) UDP编程 在上一篇中讲 ...

  9. java socket ip_JAVA 网络编程 TCP/IP、Socket 和协议设计

    [JAVA 网络编程 TCP/IP.Socket 和协议设计] TCP/IP 协议简介 IP 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成 ...

最新文章

  1. Maven知识点简要
  2. idea编辑springboot,如何打成war包
  3. 前端学习(2565):watch监听
  4. Mysql中int(M)的含义
  5. 180页PPT,讲解人工智能技术与产业发展
  6. 提高编程技巧的十大方法
  7. 计算机编程思想 —— 缓存
  8. maskrcnn ImportError: cannot import name ‘_C‘
  9. JAVA之day3对象
  10. unique函数_包含虚函数的类应该有虚析构函数或保护析构函数?
  11. Layer单选框非空校验注意
  12. 基于JSP的旅游信息管理系统(含论文)
  13. 常用软件分类运维或个人收藏软件必备,及文件夹打包下载
  14. 拿不到offer退全款 | 廖雪峰的“Web 全栈架构师”开班了!
  15. 1-十八烷基-3-三乙氧基丙基硅烷咪唑溴盐离子液体([ODTIm]Br)修饰Fe3O4磁性纳米颗粒
  16. 树莓派GPIO针脚在python中BCM与BOARD模式
  17. google浏览器打开出现“喔唷,崩溃啦”解决办法
  18. 从0开始学Git——Git的常用配置
  19. RMAN的备份与恢复
  20. OpenAnolis开源社区的萌芽与发展

热门文章

  1. 一个完整的网上追捕的原程序
  2. input 测试工具 3 getevent
  3. Ribbon风格菜单栏
  4. 基于java幸福婚庆策划网管理系统
  5. 【报告分享】 嘀嗒出行:2014-2020中国顺风车行业发展蓝皮书(附下载)
  6. surface计算机显示桌面,带你玩转Surface!你应该记住的快捷键大全
  7. unity2d角色跟随鼠标移动
  8. 大数据学习的必要性,让你走向时代前沿!
  9. vscode快捷键重置及快捷键恢复
  10. 有意思了,小程序可以一键生成App了