码迷,mamicode.com
首页 > 其他好文 > 详细

网络编程初步

时间:2014-11-13 22:34:00      阅读:482      评论:0      收藏:0      [点我收藏+]

标签:android   style   blog   http   io   color   ar   os   使用   

***********************************************声明******************************************************

      原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。

      由于各种原因,可能存在诸多不足,欢迎斧正!

*********************************************************************************************************         

     现在想想,自打进入大学开始,已经接触编程差不多3年光景了,之前的所有或大或小的程序都是在本地运行,没有涉及网络编程知识。但现在马上就要步入职场使用Java开发了,感觉自己Java+网络编程都不熟,所以决定自己在这段时间学学Java中的多线程、网络编程、数据库编程等等。同时将自己的一些想法写出来分享给大家,希望一起学习交流。

1、TCP/IP协议族

     在计算机网络课程中知道OSI(英文全称:Open System Interconnection,译作:开放式系统互联参考模型)将网络通信归结为七层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层,具体功能大致归结如下:

            bubuko.com,布布扣  

                                                                           OSI中7层协议   

        首先明确一下协议的概念:协议是一些约定的由软件或硬件构成的通信规则。在TCP/IP协议族中,将会话层、表示层、应用层合称为应用层,于是7层协议简化成TCP/IP协议族中的5层:应用层、传输层、网络层、数据链路层、物理层。每层都是都各自协议栈功能的抽象,在网络通信过程中,通信的多台计算机的每层只和其他计算机的对等层进行信息传输。

                         bubuko.com,布布扣

                                                          TCP/IP五层协议

第一层:物理层
     规定通信设备的机械的、电气的、功能的和过程的特性,用以建立、维护和拆除物理链路连接,数据的单位称为比特(bit)。
第二层:数据链路层
     在物理层提供比特流服务的基础上,建立相邻结点之间的数据链路,通过差错控制提供数据帧在信道上无差错的传输,并进行各电路上的动作系列。数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。在这一层,数据的单位称为帧(frame)。数据链路层协议的代表包括:SDLC、HDLC、PPP、STP、帧中继等。
第三层:网络层
     网络层的任务就是选择合适的网间路由和交换结点,确保数据及时传送。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,含有信息源站点和目的站点地址的网络地址。网络层还可以实现拥塞控制、网际互连等功能,数据的单位称为数据包(packet)。网络层协议的代表包括:IP、IPX、RIP、OSPF等。
第四层:传输层
     数据单元也称作数据包TCP的数据单元称为段而UDP协议的数据单元称为“数据报(datagrams)”。必须跟踪数据单元碎片、乱序到达的 数据包和其它在传输过程中可能发生的危险,提供端到端的透明的、可靠的数据传输服务。所为透明的传输是指在通信过程中 传输层对上层屏蔽了通信传输系统的具体细节。传输层协议的代表包括:TCP、UDP、SPX等。
第五层:应用层
     应用层为操作系统或网络应用程序提供访问网络服务的接口。应用层协议的代表包括:Telnet、FTP、HTTP、SNMP等。

          bubuko.com,布布扣

1)、同一层中的各网络节点都有相同的层次结构,具有同样的功能。
2)、同一节点内相邻层之间通过接口进行通信。
3)、每一层使用下一层提供的服务,并且向其上层提供服务。
4)、不同节点的同等层按照协议实现对等层之间的通信。              


2、Socket套接字编程

     Socket通常称作"套接字",Socket=IP地址+端口号,构成网络通信的句柄。网络通信的本质不是不同计算机之间的通信而是不同计算机上应用程序的通信。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。在很多操作系统平台包括主流的Windows、Linux、Android等上,都可以通过使用套接字Socket来达到远程进程间通信目的的。Socket是TCP/IP协议族中网络通信的抽象与封装,提供一组编程接口,封装复杂的TCP/IP协议族各层协议,对用户来说,功能实现不必刻意关心,但需要掌握编程接口,从而高效的开发应用程序。

     Java中Socket定义为客户端/服务器的网络通信的类,有两个关键的实例方法:getInputStream方法和getOutputStream方法。getInputStream方法可以得到一个输入流;GetOutputStream方法得到一个输出流。Socket封装了建立连接、数据传送、释放链接等的实现细节(当然,这些相对TCP协议而言的,UDP协议是无连接的,所以自然不存在建立连接、释放链接的过程)。

1)、服务器

     ServerSocket:Java中建立Socket服务器的类,用应用程序的端口号作为参数来创建服务器对象。

ServerSocket serSockServer = new ServerSocket(9999) ;
      这条语句创建了一个使用9999号端口的服务器对象。当客户端程序建立端口号为9999的相应Socket连接时,服务器对象server便响应这个连接,并且server.accept()方法创建一个Socket对象。服务器端便利用这个Socket对象与客户进行通讯。  
 Socket socClient = serSockServer.accept() 
        然后定义输入流和输出流
  BufferedReader in = new BufferedReader(new InputStreamReader(socClient.getInputStream()));  
  PrintWriter out = new PrintWriter(socClient.getOutputStream(),true); 
        随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。
    在所有通讯结束以后应该关闭这两个数据流,关闭的顺序是先关闭输出流,再关闭输入流,即使用:

 out.close();  
 in.close(); 
1)、客户端
    相比服务器端,客户端要相对简单,客户端只需用服务器所在机器的ip以及服务器的端口号作为参数创建一个Socket对象。

 Socket socClient = new Socket("158.160.22.42",9999);  
 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
 PrintWriter  = new PrintWriter(socket.getOutputStream(),true); 

     以上客户端程序创建了一个Socket对象,这个对象连接到主机IP地址为158.160.22.42的端口号为9999的服务器对象上,并且建立了输入流和输出流,进行通信。


3、源代码

        现在刚学习Java网络Socket套接字编程,所以就将自己的第一份网络编程代码贴上,这段代码出自《Java从入门到精通》,在此贴出,以示纪念第一份Java+网络编程代码。在之后,还将继续学习Java Socket编程,并计划开发几个简单的应用程序,其中打算把前面的Java版五子棋程序升级成适配不同平台的客户端/服务器程序,希望大家予以监督。不过涉及后台数据库操作,Java数据库开发暂时还没有自学,所以争取一段时间后贴上代码,与大家一起学习交流!

/** 
 *    HelloServer.java 
 *    Copyright 2014.11.13 XuJin 
 **/

package NetStudy;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class HelloServer {

	public static void main(String[] agrs) throws IOException {
		
		ServerSocket serSockServer = null;
		PrintWriter priWri = null;
		
		try {
			serSockServer = new ServerSocket(9999);
		} catch (IOException e) {
			System.err.println("不能监听9999端口");
			System.exit(1);
		}
		
		Socket socClient = null;
		
		try {
			socClient = serSockServer.accept();
		} catch (IOException e) {
			System.err.println("接受失败");
			System.exit(1);
		}
		
		priWri = new PrintWriter(socClient.getOutputStream(), true);
		priWri.println("Hello world!");

		socClient.close();
		serSockServer.close();
	}
}
/** 
 *    HelloClient.java 
 *    Copyright 2014.11.13 XuJin 
 **/

package NetStudy;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.rmi.UnknownHostException;

public class HelloClient {

	public static void main(String[] agrs) throws IOException {
		
		Socket socClient = null;
		BufferedReader bufReader = null;

		try {
			socClient = new Socket("localhost", 9999);
			bufReader = new BufferedReader(new InputStreamReader(
					socClient.getInputStream()));
		} catch (UnknownHostException e) {
			System.err.println("连接服务器失败!");
			System.exit(1);
		} catch (IOException e) {
			System.err.println("IO操作失败!");
			System.exit(1);
		}

		System.out.println(bufReader.readLine());
		
		bufReader.close();
		socClient.close();
	}
}


    由于时间有限,在写博文的过程中参考过一些文献,在此表示感谢;同时鉴于水平原因,你难免有不足之处,欢迎斧正!









网络编程初步

标签:android   style   blog   http   io   color   ar   os   使用   

原文地址:http://blog.csdn.net/xiaofengcanyuexj/article/details/41084821

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!