第一章 网络编程入门

1.1 OSI参考模型

1. 物理层
         传输介质,如双绞线和同轴电缆。
2. 数据链路层
         负责在两个相邻节点无差错传输以帧为单位的数据。该层负责建立、维持和释放数据链路的连接,如交换机。
3. 网络层
         该层负责选择合适的网间路由和交换节点。如路由器。
4. 传输层
         该层任务是根据根据通信子网的特性最佳的利用网络资源,为两个端到端的会话层提供建立、维护和取消传输连接的功能。
5. 会话层
         管理进程之间的会话过程。
6. 表示层
         对上层数据进行转换。
7. 应用层
         确定进程间通信的实际用途。

1.2 TCP/IP参考模型

  

TCP:传输控制协议,是一种面向连接的、可靠的协议。

UDP:不可靠的、无连接协议。

1. 应用层

基于TCP的应用层协议有以下几种:

FTP:文件传输协议

TELNET: 虚拟终端协议,允许从主机A登入到远程主机B,使得A充当B的虚拟终端。

HTTP:超文本传输协议

HTTPS:安全超文本传输协议

POP3:邮局协议-版本3

IMAP4:Internet消息访问协议-版本4,允许用户通过浏览器和操纵远程服务器上的邮件和邮件夹。

基于UDP的应用层协议有以下:

SNMP:简单网络管理协议

DNS:域名系统协议

2. 传输层
3. 网络互联层
4. 主机-网络层

1.3 IP协议

IP地址由两部分组成:IP网址和IP主机地址。

IP主机地址表示网络中的主机的地址。网络掩码用来确定IP地址中哪部分是网址,哪部分是主机地址。

比如IP:192.166.3.4    掩码:255.255.255.0

掩码对应的二进制:11111111.11111111.11111111.00000000

掩码与IP地址进行二进制与操作得到的便是IP地址

1.子网划分

如果网址为:192.166.0.0,则可以有2^16-2(65534)个主机,可以分出三个子网:192.166.1.0 192.166.2.0 192.166.3.0  这三个子网的掩码都是255.255.255.0

注:192.166.0.0为网络地址,192.166.111.111是广播地址,不能作为主机地址。

2.发送数据包的过程

IP是面向包的协议,数据被分成多个数据包,分别传输。IP网络上的主机只能向本地网上的其他主机发送数据包。

主机有两个不同性质的地址:物理地址和IP地址。物理地址由主机的网卡标识。物理地址才是主机的真实地址。

主机A向同一个网络上的主机B发包时,会通过地址解析协议(ARP)获得对方的物理地址,然后把包发给对方。

    

个人理解:以一台本地路由器为例,主机A发送包给主机B时,如果访问地址不是局域网内地址,则通过默认路由经过wan口转发出去,经过运营商的路由继续搜索。

3.域名

域名最右边的部分为顶层域名,最左边的为机器名称。

一般形式为:主机机器名.单位名.网络名.顶层域名

4.URL(统一资源定位器)

如:http://www.javathinker.org/bbs/index.jsp

“http”指超文本传输协议,“www.javathinker.org”是服务器的域名,“bbs”是网页所在路径,“index.jsp”是对应得网页文件。

1.4 TCP协议与端口

TCP协议使两台主机的进程顺利通信,不必担心丢包或包顺序混乱。TCP跟踪包顺序,但包顺序搞乱时按正确顺序重组包。如果包丢失,则TCP会请求源主机重发包。

IP协议根据主机的IP地址将数据发送到对应主机。TCP采用端口来区分进程。端口不是物理设备,而是逻辑地址。

端口号的范围是0-65535。0-1023的端口号一般固定分配给一些服务。例如21分配给FTP,25分配给SMTP,80分配给HTTP。

注意:在一个主机中TCP和UDP的端口取值范围是各自独立的,允许存在相同的TCP端口和UDP端口。

1.5 RFC简介

TCP/IP协议是以RFC文档形式发布的。RFC是描述互联网相关技术规范的文档。

1.6 Java编写C/S程序

本文Java程序都建立在TCP/IP协议基础上,致力于实现应用层。传输层向应用层提供了套接字Socket接口。它封装了下层的数据传输细节,应用层的程序通过Socket来建立与远程主机的连接和数据传输。

  

Java中有三种套接字类:java.net,Socket,java.net.ServerSocket,java.net.DatagramSocket。

前两种建立在TCP协议上,后一个建立在UDP协议上。

1.创建EchoServer

//将当前进程注册为服务器进程

ServerSocket server = new ServerSocket(8000);//指定8000端口

//监听

Socket socket = server.accept()//等待用户连接请求

Socket类提供getInputStream()方法和getOutputStream()方法返回输入和输出流对象。

代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {
	private int port=8000;
	private ServerSocket serverSocket;

	public EchoServer() throws IOException{
		serverSocket = new ServerSocket(port);
		System.out.println("服务器启动");
	}

	public String echo(String msg){
		return "echo:"+msg;
	}

	private PrintWriter getWriter(Socket socket) throws IOException{
		OutputStream socketOut = socket.getOutputStream();
		return new PrintWriter(socketOut,true);//设为true,表示自动刷新
	}

	private BufferedReader getReader(Socket socket) throws IOException{
		InputStream socketIn = socket.getInputStream();
		return new BufferedReader(new InputStreamReader(socketIn));
	}

	public void service(){
		while(true){
			Socket socket=null;
			try{
				socket=serverSocket.accept();
				//socket.getPort()返回的是客户端套接字占用的本地端口
				System.out.println("New connetion accepted "+socket.getInetAddress()+":"+socket.getPort());
				BufferedReader br = getReader(socket);
				PrintWriter pw = getWriter(socket);

				String msg =null;
				while((msg=br.readLine())!=null){
					System.out.println(msg);
					pw.println(echo(msg));
					if(msg.equals("bye")){
						break;
					}
				}
			}catch(IOException e){
				e.printStackTrace();
			}finally{
				try{
					if(socket!=null) socket.close();
				}catch(IOException e){
					e.printStackTrace();
				}
			}
		}

	}
	public static void main(String args[])throws IOException{
		new EchoServer().service();
	}
}

  

2.创建EchoClient

String host="localhost";

String port="8000";

Socket socket=new Socket(host,port);

host表示EchoServer进程所在的主机的名字,port表示EchoServer进程监听的端口号。

代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class EchoClient{
	private String host="localhost";
	private int port=8000;
	private Socket socket;

	public EchoClient() throws UnknownHostException, IOException{
		socket = new Socket(host,port);

	}

	private PrintWriter getWriter(Socket socket) throws IOException{
		OutputStream socketOut = socket.getOutputStream();
		return new PrintWriter(socketOut,true);//设为true,表示自动刷新
	}

	private BufferedReader getReader(Socket socket) throws IOException{
		InputStream socketIn = socket.getInputStream();
		return new BufferedReader(new InputStreamReader(socketIn));
	}

	public void talk(){
		try{
			BufferedReader br =getReader(socket);
			PrintWriter pw =getWriter(socket);
			BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
			String msg=null;
			while((msg=localReader.readLine())!=null){
				pw.println(msg);
				System.out.println(br.readLine());
				if(msg.equals("bye")){
					break;
				}

			}
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			try{
				socket.close();
			}catch(IOException e){
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) throws UnknownHostException, IOException {
		new EchoClient().talk();

	}

}

  

时间: 2024-08-29 17:22:17

第一章 网络编程入门的相关文章

Java学习笔记—第十二章 Java网络编程入门

第十二章  Java网络编程入门 Java提供的三大类网络功能: (1)URL和URLConnection:三大类中最高级的一种,通过URL网络资源表达方式,可以很容易确定网络上数据的位置.利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端. (2)Socket:又称"套接字",用于描述IP地址和端口(在Internet中,网络中的每台主机都有一个唯一的IP地址,而每台主机又通过提供多个不同端口来提供多种服务).在客户/服务器网络中,当客

第13章 网络编程

1 /***************** 2 ***第13章 网络编程 3 *******知识点: 4 **************1.基本概念 5 ******************1.1 网络OSI模型 6 ******************1.2 IP地址 7 ******************1.3 端口地址 8 ******************1.4 通讯协议 9 **************2.Java网络相关类 10 ******************2.1 URLDe

UNIX网络编程入门——I/O复用

UNIX网络编程入门--TCP客户/服务器程序详解 UNIX网络编程入门--TCP客户/服务器程序存在问题及解决 在介绍I/O复用之前,我们先来看一个情况:运行我们前面两篇文章里面的服务器和客户端程序,当客户端在等待用户输入一行字符时,服务器崩溃或者关机了.此时虽然服务器TCP会正确地发送FIN给客户端TCP,但客户端阻塞于fget函数,等待从标准输入读入,无法及时地知道服务器已经终止,要等到它得到标准输入发送给服务器时才会返回错误. 要解决这个问题,就需要一种能力,能够同时观察多个I/O条件是

[转帖]脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?

脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么? http://www.52im.net/thread-1732-1-1.html 1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式的网络编程知识学习 ^_^. 套接字socket是大多数程序员都非常熟悉的概念,它是计算机网络编程的基础,TCP/UDP收发消息都靠它.我们熟悉的web服务器底层依赖它,我们用到的MySQL关系数据库.Redis内存数据库底层依赖它.我们用微信和别

[转帖]脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手 http://www.52im.net/thread-1729-1-1.html 1.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道"三次"和"四次",但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方式,来对这个知识点进行"脑残式"讲解(哈哈),期望读者们可以更加简单.直观地理解TCP网络通信交互的本

第一章 SAS软件入门

目录 第一章 SAS软件入门 1.1 语言特点 1.2 数据集 1.3 DATA步和PROC步 1.4 DATA步的内置循环 1.5 SAS窗口环境 1.6 阅读SAS日志 1.7 逻辑库 1.8 VIEWTABLE窗口 1.9 数据集属性 1.10 系统选项 第一章 SAS软件入门 1.1 语言特点 SAS程序 SAS程序就是一系列「有序 」的SAS语句,编程过程中需要遵循一些规则: 后续语句都围绕第一句展开 每一条SAS语句都以分号结尾 SAS程序布局 SAS是一种非常灵活的语言,甚至可以说

Delphi知识点与技术概述【第一章Delphi编程】

Delphi的基本特性:语言,运行时库(RTL),核心类库 语言特性: Delphi 即是一门语言同时又是一个开发工具.它是经典Pascal语言的面向对象的扩展. 内容提要 *类与对象 Delphi中每个可视放置在窗体中的组件是类的类型对象,该类可在系统库中获得.类和对象之间的关系和变量和类型之间的关系相同. *封装:provate public "黑盒子",不需要知道里面有什么,只需要知道怎么样和黑盒子接口. 基本的3个访问标示符private.protected.public.它只

javascript数据结构和算法 第一章(Javascript编程环境和模型) 一

这一章介绍了我们在这本书中使用的描述各种数据结构和算法的Javascript的编程环境和编程架构. Javascript 环境 Javascript 在很长一段时间都是被作为web浏览器内置脚本编程语言来使用. 然而,在过去几年里,javascript编程环境得到了极大的发展,他们可以使javascript在桌面或者服务端运行. 在我们这本书中,我们使用其中的一个javascript环境:javascript shell:是Mozilla公司的javascript环境,被称为SpiderMonk

Java学习笔记—第十三章 数据库编程入门

第十三章 数据库编程入门 了解JDBC Java中对数据库的访问主要是通过JDBC进行的.JDBC是Java数据库连接技术(Java Database Connectivity)的简称,是用于执行SQL语句的API,可以为多种关系数据库提供统一访问.由一组用Java语言编写的类和接口组成.(SQL是Structure Query Language的缩写,意义为结构化查询语言,是一种标准的关系数据库访问语言.) JDBC的工作机制 使用JDBC完成对数据库的访问主要包括以下五个层次:Java应用程