网络编程现在是非常普遍的编程技术了,网络编程无非就是两台或者多台设备(通常是计算机)之间的相互通信,相互之间的数据传输。网络编程的实质其实就是程序和程序之间的相互通信,相互传递数据。在网络通信中,第一次主动发起通信请求的成为客户端(Client),第一次通信中等待连接的称为服务器端(Server),在网络通信的过程中,Client端和Server端没有本质的区别。
那么,怎样才能通过客户端找到服务器从而进行网络通信呢?答案就是通过ip来找到服务器,我们都知道,服务器上运行着多个程序,也就是多个进程,那么这是就要通过端口号来唯一的确定某台服务器上的某个运行的程序了,格式为“ip:port”,因此,当你在浏览器(客户端)中输入ip:port后,就会发送请求,服务器响应后返回结果给浏览器,你就可以看到内容了。但是,ip:port很难记忆,这是就出现了域名的概念,如:当你输入www.baidu.com的时候,就会跳转到百度的服务器,你会看到百度的首页,但实际上还是通过ip:port来访问服务器的,你可以输入103.235.46.39:80看一下,会和你输入www.baidu.com的结果一样。那么,是怎样将一个域名解析成指定的ip:port呢,这时就会存在一个DNS服务器(域名解析服务器),用来动态的讲域名解析到指定的服务器上某一个运行的程序,以实现客户端和服务器之间的互联。
在网络通信的过程中,最常见的通信模型就是“请求-相应”模型,也就是说,客户端发一个请求,服务器端接收到请求处理后响应给客户端的过程。那么现在问题来了,客户端怎样发送一个请求,服务器成功接收处理后,响应给客户端呢,这时,就需要网络协议了。协议,顾名思义就是客户端和服务器之间的约定,按照约定的请求数据格式和响应数据格式来实现网络通信,显然,这种约定应该遵循“简单,方便,实用”的原则,这样才能保证客户端和服务器端通信的成功率。其实,协议就可以随意编写的,只要按照编写的协议格式能够生成唯一的编码,按照该编码可以唯一的解析出发送数据的内容就可以了。正因为各个网络程序之间协议格式的不同,所以客户端程序都是专用的、特殊的结构。
实际的网络编程中,基本就是发送(send)和接收(accept)两个操作。大多数支持网络编程技术的编程语言,都有特定的api,内部封装了这两个操作的接口,编程的时候直接调用就可以了。其实,网络编程中最难的就是网络协议的设计,这是网络编程中最核心的内容,有兴趣的可以研究下RFC原理。