Java网络编程总结

客户端创建一个端口号为8888的Socket套接字,Socket s = new Socket("localhost", 8888);// 服务器地址 端口

通过端口连接到服务器,服务器端创建ServerSocket对象,监听端口号也为8888,通过阻塞方式来监听端口号为8888的Socket对象。

客户端、服务端分别获取Socket的inputstream和outputstream对象,进行二者之间的数据读写操作,以下我做个demo:

客户端:

public class Client1 {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket s = new Socket("localhost", 8888);// 服务器地址 端口
		System.out.println("开启客户端,端口号为:8888");
		try {
			Thread.sleep(1000);//线程休眠10秒
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		OutputStream ops = s.getOutputStream();
		DataOutputStream dos = new DataOutputStream(ops);
		dos.writeUTF("hello,world\n\n");
		dos.flush();
		dos.close();
		s.close();
	}
}

服务端:

public class Server1 {
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(8888);
		System.out.println("服务器启动了,正在监听8888端口");
		while(true){
			Socket s = ss.accept(); // 注意阻塞式的方法  没有客户端就一直停在这不动
			System.out.println(s.getInetAddress()+"链接上来了");
//getInetAddress描述主机地址
			//读取客户发过来的数据
			DataInputStream dis = new DataInputStream(s.getInputStream());
			System.out.println(dis.readUTF());
			dis.close();
			s.close();
		}
	}
}

小结:

Socket用来创建两台主机之间的连接;
ServerSocket用来侦听来自客户端的请求;
Socket通常称作“套接字”,通常通过“套接字”向网络发出请求或者应答网络请求;

Socket和ServerSocket关系:

 

 

为了促进计算机网络的发展,国际标准化组织ISO于1977年成立了一个委员会,在现有网络的基础上,提出了不基于具体机型、操作系统或公司的网络体系结构,称为开放系统互连参考模型,即OSI/RM (Open System Interconnection Reference Model)。OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层

这七层的含义,我去网上找了资源,现在贴在这里:

  • 物理层

物理层处于OSI的最底层,是整个开放系统的基础。物理层涉及通信信道上传输的原始比特流(bits),它的功能主要是为数据端设备提供传送数据的通路以及传输数据。

  • 数据链路层

数据链路层的主要任务是实现计算机网络中相邻节点之间的可靠传输,把原始的、有差错的物理传输线路加上数据链路协议以后,构成逻辑上可靠的数据链路。需要完成的功能有链路管理、成帧、差错控制以及流量控制等。其中成帧是对物理层的原始比特流进行界定,数据链路层也能够对帧的丢失进行处理。

  • 网络层

网络层涉及源主机节点到目的主机节点之间可靠的网络传输,它需要完成的功能主要包括路由选择、网络寻址、流量控制、拥塞控制、网络互连等。

  • 传输层

传输层起着承上启下的作用,涉及源端节点到目的端节点之间可靠的信息传输。传输层需要解决跨越网络连接的建立和释放,对底层不可靠的网络,建立连接时需要三次握手,释放连接时需要四次挥手

  • 会话层和表示层

会话层的主要功能是负责应用程序之间建立、维持和中断会话,同时也提供对设备和结点之间的会话控制,协调系统和服务之间的交流,并通过提供单工、半双工和全双工3种不同的通信方式,使系统和服务之间有序地进行通信。

表示层关心所传输数据信息的格式定义,其主要功能是把应用层提供的信息变换为能够共同理解的形式,提供字符代码、数据格式、控制信息格式、加密等的统一表示。

  • 应用层

应用层为OSI的最高层,是直接为应用进程提供服务的。其作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务。

TCP/IP参考模型

TCP/IP协议是一个开放的网络协议簇,它的名字主要取自最重要的网络层IP协议和传输层TCP协议。TCP/IP协议定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。TCP/IP参考模型采用4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求,这4个层次分别是:网络接口层、互联网层(IP层)、传输层(TCP层)、应用层。


常见网络协议

下面主要介绍传输层的TCP、UDP协议和应用层的HTTP协议:

简介:TCP(Transmission Control Protocol ,传输控制协议)是面向连接的传输层协议。TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。TCP协议采用字节流传输数据。

  • TCP报文段格式

TCP报文段包括协议首部和数据两部分,协议首部的固定部分有20个字节,首部的固定部分后面是选项部分。

TCP报文段

下面是报文段首部各个字段的含义。

  1. 源端口号以及目的端口号,各占2个字节,端口是传输层和应用层的服务接口,用于寻找发送端和接收端的进程,一般来讲,通过端口号和IP地址,可以唯一确定一个TCP连接,在网络编程中,通常被称为一个socket接口。
  2. 序号,占4字节,用来标识从TCP发送端向TCP接收端发送的数据字节流。
  3. 确认序号,占4字节,包含发送确认的一端所期望收到的下一个序号,因此,确认序号应该是上次已经成功收到数据字节序号加1.
  4. 数据偏移,占4位,用于指出TCP首部长度,若不存在选项,则这个值为20字节,数据偏移的最大值为60字节。
  5. 保留字段占6位,暂时可忽略,值全为0
  6. 标志位
    URG(紧急) : 为1时表明紧急指针字段有效
    ACK(确认):为1时表明确认号字段有效
    PSH(推送):为1时接收方应尽快将这个报文段交给应用层
    RST(复位):为1时表明TCP连接出现故障必须重建连接
    SYN(同步):在连接建立时用来同步序号
    FIN (终止): 为1时表明发送端数据发送完毕要求释放连接
  7. 接收窗口占2个字节,用于流量控制和拥塞控制,表示当前接收缓冲区的大小。在计算机网络中,通常是用接收方的接收能力的大小来控制发送方的数据发送量。TCP连接的一端根据缓冲区大小确定自己的接收窗口值,告诉对方,使对方可以确定发送数据的字节数。
  8. 校验和占2个字节,范围包括首部和数据两部分。
  9. 选项是可选的,默认情况是不选。

TCP的三次握手与四次挥手

TCP是面向连接的协议,因此每个TCP连接都有3个阶段:连接建立、数据传送和连接释放。连接建立经历三个步骤,通常称为“三次握手”。

TCP三次握手过程如下:

TCP三次握手.jpg

ACK (Acknowledgement)即是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。

  1. 第一次握手
    客户机发送连接请求报文段到服务器,并进入SYN_SENT状态,等待服务器确认。(SYN = 1,seq=x)
  2. 第二次握手
    服务器收到连接请求报文,如果同意建立连接,向客户机发回确认报文段,并为该TCP连接分配TCP缓存和变量。(SYN=1,ACK=1,seq=y,ack=x+1)。
  3. 第三次握手
    客户机收到服务器的确认报文段后,向服务器给出确认报文段,并且也要给该连接分配缓存和变量。此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。(ACK=1,seq=x+1,ack=y+1)。

TCP四次挥手过程如下:

 

四次挥手.png

FIN(ISH)为TCP报头的码位字段,该位置为1的含义为发送方字节流结束,用于关闭连接。

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

  1. TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
  2. 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
  3. 服务器关闭客户端的连接,发送一个FIN给客户端。
  4. 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

UDP协议

 

  • 简介

UDP,用户数据报协议,英文全称是User Datagram Protocol,它是TCP/IP协议簇中无连接的运输层协议。

  • UDP协议格式

UDP格式

从图中可以看到,UDP协议十分简单,它由两部分组成:首部和数据。其中,首部仅有8个字节,包括源端口和目的端口,长度(UDP用于数据报的长度)、校验和。

udp协议小demo:

public class TestUDP1 {
	public static void main(String[] args) throws IOException {
		byte[] bs = new byte[1024];
		//创建一个用于接收最多bs.length长度信息的,datagrampacket
		DatagramPacket dp = new DatagramPacket(bs, bs.length);
		
		//创建一个socket,用于监听8888端口,只要有数据发过来就接收
		DatagramSocket ds = new DatagramSocket(8888);
		System.out.println("接收器启动,并监听8888端口");
		
		boolean flag = true ;
		//这是一个耗时的操作  ->放到一个线程中
		while(flag){
			ds.receive(dp);//阻塞式方法 一直停在这里,直到有数据过来	
			//serversocket.accept()    datagrampacket.recive()
			System.out.println("接到数据了...");
			//bs中存了真实的数据,通过dp.getLength()获取真实长度
			String s = new String(bs,0,bs.length);
			System.out.println(s);
		}
	}
}
public class TestUDP2 {
	public static void main(String[] args) throws IOException {
		String s = "hello world~";
		//创建数据包对象,用于包装s字符串
		DatagramPacket dp = new DatagramPacket(s.getBytes(), s.length(),new InetSocketAddress("localhost",8888));
		//创建一个socket 来发送dp 要指定本机用于发送的端口
		int port = getFreePort();
		DatagramSocket ds = new DatagramSocket(port); //端口可能被占用
		//TODO:取出本机空闲的端口
		ds.send(dp);
		ds.close();
	}
	
	public static int getFreePort() throws SocketException{
		for(int i =10000;i<65536;i++){
			DatagramSocket ds = new DatagramSocket(i	);
			ds.close();
			return i ;
		}
		return -1;
	}
}

HTTP稍后做总结!!!!!!!!!!!!!!!!!!!

常见问题

到这里,关于计算机网络部分的总结内容就结束了,下面是几个常见的问题,汇总在这里。

  1. OSI参考模型的分为哪几层,每层的功能?
    OSI,开放系统互连参考模型,它的7个层次自顶到下依次为应用层,表示层,会话层,传输层,网络层,数据链路层和物理层。各层的功能见文章开始。

  2. TCP协议和UDP协议的区别?
    TCP协议是传输控制协议,UDP协议是用户数据报协议,两者都是传输层的协议,主要区别在于前者是可靠的,面向连接的协议,后者是不可靠的,无连接的协议。其它的区别还有,TCP协议传输速度慢,UDP常用于一次性传输比较少量数据的网络应用。

  3. TCP三次握手为什么不能是两次?
    主要是防止两次握手情况下已经失效的连接请求报文段突然又传送到服务端而产生错误。例如,客户机A向服务器B发送TCP连接请求,第一个连接请求报文在网络的某个节点长时间滞留,A超时后认为报文丢失,于是再重传一次连接请求,B收到后建立连接。数据传输完毕后双方断开连接,而这时之前滞留的连接请求到达了服务端B,而B认为A又发来连接请求。如果两次握手建立连接,A并无连接请求,造成B的资源浪费。

  4. HTTP请求的GET方法和POST方法的区别?
    GET和POST是HTTP请求的两种方法,主要区别在于GET方法是请求读取由URL所标志的信息,POST是给服务器添加信息。点击查看更多

  5. 在浏览器中输入网址到显示出页面的整个过程?
    (1) 输出包含域名的网址 (2) 浏览器向DNS请求解析域名对应的IP地址 (3) 域名系统DNS解析出域名对应的IP地址 (4) 浏览器与该服务器建立TCP连接 (5) 浏览器发送HTTP请求 (6) 服务器通过HTTP响应把页面文件发送给浏览器 (7) TCP连接释放 (8) 浏览器解释文件,并显示。

 

 

 

 





部分来源
作者:尘语凡心
链接:http://www.jianshu.com/p/ae5e1cee5b04
來源:简书

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值