028-86261949

当前位置:首页 > 技术交流 > 网络编程基础

网络编程基础

2019/07/10 10:52 分类: 技术交流 浏览:1

1、网络编程基础

简单来看,网络编程的目标就是计算机之间相互通讯数据。Java SDK提供了一系列API来完成这些工作,例如Socket。对于程序员来说,这些API被存放在java.net这个包里面,因此只要导入这个包就可以进行网络编程。(下面是java各个包的用途)

               java/ javax(java增强包)

               java.lang (java的核心包--基本包 ,不需要导包)

               java.util(java的工具包 --集合框架ArrayList LinkedList)

               java.io(java IO包 读写文件)

               java.net(网络编程)

               java.awt/javax.swing(java的图形化界面)

 

2、TCP/IP协议

现在的Internet或Intranet大部分都是使用TCP/IP协议进行网络通信的,实际上TCP/IP协议是一组以TCP与IP协议为基础的相关协议的集合。

• 注意:该协议并不完全符合OSI的七层参考模型,而是采用的4层结构。

• IP协议是TCP/IP协议族的核心,也是互连网络层中最重要的协议

。其接收由更低层发来的数据包,并将该数据包发送到更高层,即TCP或UDP层;此外IP层也可以将从TCP或UDP层接收来的数据包传送到更低层。IP是面向无连接的数据报传送,所以IP协议将文传送到目的主机后,无论传送正确与否都不进行检验、不会送确认以及不保证分组的正确顺序。• TCP协议位于传输层,其提供面向有连接的数据包传送服务,保证数据包能够被正确传送与接收,包括内容的校验与包的顺序,损坏的包可以被重传。要注意的是,由于提供的是有保证的数据传送服务,因此传送效率要比没有保证的服务低,一般适合工作在广域网中,对网络状况非常好的局域网不是很合算。当然,是否采用TCP也取决于具体的应用需求。

 

3、端口和套接字

• 端口被规定为一个在0~65535之间的整数。Http服务一般使用80端口,Ftp使用的是21端口,那么客户必须通过80端口才能连接到服务器的Http服务,而通过21端口,才能连接到服务器的Ftp服务器上。

• 在所有的端口中1~1023之间已经被系统所占用了,因此在定义自己的端口时,不能使用这一段的端口号,而应该使用1024~65535之间的任意端口号,以免发生端口冲突。

• 网络程序中的套接字用来将应用程序与端口连接起来,套接字是一个软件实现,也是一个假想的装置。在Java中,将套接字抽象化为类,所以程序只需创建Socket类的对象,就可以使用套接字。那么Java是如何实现数据传递的呢?答案是使用Socket的流对象进行数据传输,Sokcet类中有输入和输出流。使用Socket进行的通信都称为Socket通信。将编写的Socket类,用在Socket通信程序中,这就称为Socket网络程序设计。

 

4、Socket套接字

• Socket套接字是基于TCP/IP协议的编程接口,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过Socket套接字向网络发出请求或者应答网络请求。

• Socket有两种主要的操作方式,包括面向连接的和无连接的。面向连接的socket操作就像人们打电话,必须先拨号码,建立一个连接,然后再对话。数据包在到达接收端时的顺序与它们出发时的顺序时一样,就像一个人在电话中对另一个人说话一样,每一个字到达另一端的时候与它出发时的顺序一样。

• 无连接的socket操作就像是邮递员送信,邮递员只负责把信送出,至于何时发出,最后能不能到达收信人手中不能保证,无连接

 

5、Socket类

• Socket类表示套接字。使用Socket时,需要指定待连接服务器的IP地址及端口号。客户机创建了Socket对象后,将马上向指定的IP地址及端口发起请求且尝试连接。于是,服务器套接字就会创建新的套接字对象,使其与客户端套接字连接起来。一旦服务器套接字与客户端套接字成功连接后,就可以获取套接字的输入输出流,彼此进行数据交换。Socket类一共有9个构造器,表列出了其中常用的两个。

• Socket类中同样具有一些方法。其中getPort方法和getLocalPort方法分别是获取连接的远程端口和使用的本地端口。getInputStream方法和getOutputStream方法分别是获取Socket对象的输入流和输出流,这两个方法是经常被使用到的。

• 注意:close方法虽然是很简单的,表示关闭Socket对象。但是该方法在程序中是必须有的,这是一个非常好的网络编程习惯。

 

6、网络编程C/S架构实例

• C/S架构的网络编程程序是由服务器端和客户端所组成的,在开发时一定要先开发服务器端的程序,再来开发客户端的程序。

• 08 int count=0;//声明用来计数的int局部变量

• 09 try

• 10 {

• 11 //创建绑定到9876端口的ServerSocket对象

• 12 ServerSocket server=new ServerSocket(9876);

• 13 System.out.println("服务器对9876端口正在进行监听");

• 14 //服务器循环接收客户端的请求,为不同的客户端提供服务

• 15 while(true)

• 16 {

• 17 //接收客户端的连接请求,若有连接请求返回连接对应的Socket对

• 18 Socket sc=server.accept();

• 19 //获取当前连接的输入流,并使用处理流进行封装

• 20 DataInputStream din=new DataInputStream(sc.getInput Stream());1-17

 

• 21 //获取当前连接的输出流,并使用处理流进行封装

• 22 DataOutputStream dout=new

DataOutputStream(sc.getOutput Stream());

• 23 //打印客户端的信息

• 24 System.out.println("这是第"+(++count)+"个客户访问");

• 25 System.out.println("客户端IP地址:"+sc.getInetAddress());

• 26 System.out.println("本地端口号:"+sc.getLocalPort());

• 27 System.out.println("客户端信息:"+din.readUTF());

• 28 //向客户端发送回应信息

• 29 dout.writeUTF("服务器的时间为:"+(new Date())+"。");

• 30 //关闭流

• 31 din.close();

• 32 dout.close();

• 33 //关闭此Socket连接

• 34 sc.close();1-18

 

• 在该程序的第12行首先使用ServerSocket类创建了一个对象来对

9876端口进行监听。当有客户端程序访问该程序时,就执行while

循环,从而让服务器获取客户端的信息,并从服务器端向客户端

发送当前时间信息。

• 开发完服务器端程序后,就需要继续来开发运行在客户端的程序

。在客户端的程序需要使用Socket类来进行操作。1-19

• 09 //创建连接到服务器的Socket对象

• 10 Socket sc=new Socket("192.168.1.119",9876);

• 11 //获取当前连接的输入流,并使用处理流进行封装

• 12 DataInputStream din=new DataInputStream(sc.getInputStream());

• 13 //获取当前连接的输出流,并使用处理流进行封装

• 14 DataOutputStream dout=new DataOutputStream(sc.getOutput

Stream());

• 15 //向服务器发送消息

• 16 dout.writeUTF("Hello");

• 17 //读取服务器的返回消息并打印

• 18 System.out.println(din.readUTF());

• 19 //关闭流

• 20 din.close();

• 21 dout.close();

• 22 //关闭此Socket连接

• 23 sc.close();1-20

 

• 在该客户端程序中首先使用流来获取服务器端向客户端发送的信息,该信息是指服务器端的时间。从运行结果中也可以看到这一点。客户端访问服务器端程序后,服务器端运行结果也会发生变化,出现图20-3的运行结果。从运行结果中可以看出显示客户端的IP地址,本地端口号和客户端向服务器端发送的信息。

• 注意:在进行网络编程时,有一点是需要特别注意的。服务器端程序运行后,运行结果是不可以关闭的,这样客户端才会访问到该服务器端程序。

• 如果一个服务器端只能被一个客户端程序访问,这显然是不合理的。

• 当有多个客户方法该服务器程序时将同时显示所有用户的信息。这里采用的是使用一个客户端程序进行多次访问,从而出现两次

#标签:编程,TCP/IP协议,Socket