Java学习心得之网络编程

来源:互联网 发布:淘宝上怎么买二手货 编辑:程序博客网 时间:2024/05/16 10:58

一、网络基础概念

       首先我们要了解网络编程不等于网站编程,网络编程现在一般称为TCP/IP编程。

       我们把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便的互相传递信息,共享硬件、软件、数据信息等资源。


二、网络通信协议及接口

网络通信协议:计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等指定标准。

网络通信接口:为了使两个节点之间能进行对话,必须在他们之间建立通信工具(即接口),使彼此之间能进行信息交换。接口包括硬件和软件两个部分。


三、通信协议分层思想

       由于节点之间联系很复杂,在制定协议时,把复杂成分分解成一些简单的成分,再将它们复合起来。最常用的复合方式是层次方式,即同层之间可以通信、上一层可以调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展。

       通信协议的分层规定:把用户应用程序作为最高层,把物理通信线路最为最底层,将其间的协议处理分为若干层,规定每层处理的任务,也规定每层的接口标准。



四、参考模型



五、TCP协议、UDP协议和IP协议

TCP:是专门设计用于在不可靠的英特网上提供可靠的、端到端的字节流通讯协议。它是一种面向连接的协议。TCP连接是字节流而非报文流。

UDP:向应用程序提供了一种发送封装的原始IP数据报的方法、并且发送时无需建立连接。是不可靠的。

IP:是网际层的主要协议,支持网间互联的数据报通讯。每个人的电脑都有一个独一无二的IP地址,这样互相通信时就不会传错信息了。


       TCPUDP位于同一层,都是建立在IP层的基础之上。由于两台电脑之间有不同的IP地址,因此两台电脑就可以区分开来,也就可以互相通话了。通话一般有两种通话方式:第一种是TCP,第二种是UDPTCP是可靠的连接,TCP就像打电话,需要先打通对方电话,等待对方有回应后才会跟对方继续说话,也就是一定要确认可以发信息以后才会把信息发出去。TCP上传任何东西都是可靠的,只要两台机器上建立起了连接,在本机上发送的数据就一定能传到对方的机器上,UDP就好比发电报,发出去就完事了,对方有没有接收到它都不管,所以UDP是不可靠的。TCP传送数据虽然可靠,但传送得比较慢,UDP传送数据不可靠,但是传送得快


六、Socket编程

一般网络编程都称为Socket编程,两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。Socket通常用来实现client-server连接,java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的client和server端。建立连接时所需的寻址信息为远程计算机的IP地址和端口号。端口号是用来区分一台机器上不同的应用程序的,端口号在计算机内部是占2个字节,一台机器上最多有65536个端口号。这里TCP和UDP端口是分开的,各占65536个。

TCP通信模型:



七、编程实例

服务端

import java.net.*;import java.io.*;public class TestServerSocket{        public static void main(String args[]) throws Exception{                ServerSocket ss = new ServerSocket(6666);                /*创建一个ServerSocket对象时往往会给它指定一个端口号                指定端口号的意思是这个new出来的ServerSocket对象要使用的                是哪一个端口号,通过哪一个端口号来监听客户端的连接                因此指定一个端口号的意义就是为了告诉计算机ServerSocket对象                在哪个地方监听客户端的连接*/                /*服务器端接收客户端连接的请求是不间断地接收的,所以服务器端的                编程一般都是死循环,永不休止地运行着。*/                while(true){                            Socket s = ss.accept();                            /*在服务器端调用accept()方法接受客户端的连接对象,accept()方法是                            一个阻塞式方法,一直在傻傻地等待着是否有客户端申请连接上来                            然后服务器端的Socket插座就和客户端的Socket插座建立了连接了*/                            /*客户端能否连接上服务器端,取决于服务器端是否接受客户端的连接请求                            如果接受了客户端的连接请求,那么在服务器端就安装上一个Socket插座                            通过这个插座与连接上的客户端就可以建立连接,互相通信了*/                            System.out.println("A Client Connected!");                            /*使用InputStream流接收从客户端发送过来的信息,使用DataInputStream数据流处理接收到的信息*/                DataInputStream dis = new DataInputStream(s.getInputStream());                            /*使用readUTF(方法将接收到的信息全部读取出来,存储到变量str里面                            readUTF()方法也是一个阻塞式方法,会傻傻地等待客户端发送信息过来,然后将接收到的信息读取出来                            如果客户端不写东西过来,它就一直在服务器端傻傻地等待着,直到客户端写东西过来为止                            堵塞式的方法效率往往是不高的,比如说一个客户端连接上来了,但是它迟迟不发送信息,                            那么服务器端的程序就阻塞住了,这样另外一个客户端就连接不上来了,因为另外一个客户端要想连接                            上服务器端,就必须得在服务器端调用accept()方法,可accept()方法必须得在下一次循环时才能够被                            调用,现在服务器端的程序运行到调用readUTF()这个方法时就阻塞住了,它要等待着已经连接上来的                            那个客户端发送信息过来后将信息读取出来,如果客户端一直不发信息到服务器端,那么readUTF()方法                            就一直无法读取到信息,那么服务器端的程序会阻塞在这里,无法进行下次循环,这样其他的客户端就                            无法连接到服务器端了*/                            String str = dis.readUTF();                            System.out.println(str);                    }            }    }

客户端

import java.net.*;import java.io.*;public class TestClientSocket{    public static void main(String args[]) throws Exception{        Socket s = new Socket("127.0.0.1",6666);        /*Client申请连接到Server端上*/        /*连接上服务器端以后,就可以向服务器端输出信息和接收从服务器端返回的信息        输出信息和接收返回信息都要使用流式的输入输出原理进行信息的处理*/        /*这里是使用输出流OutputStream向服务器端输出信息*/        OutputStream os = s.getOutputStream();        DataOutputStream dos = new DataOutputStream(os);        Thread.sleep(30000);/*客户端睡眠30秒后再向服务器端发送信息*/        dos.writeUTF("Hello Server!");    }}



原创粉丝点击