网络编程

来源:互联网 发布:淘宝帐号个人昵称大全 编辑:程序博客网 时间:2024/06/06 03:49

Java中网络编程知识点总结:

1、网络参考模型:

OSI参考模型(开发系统互联)七层机构分别为物理层,数据链路层,网络层,传输层,会话层,表示层,应用层,下面是对这七层的一个简单的认识:

物理层:主要是定义物理设备标准,主要是传输的比特流(简单的理解就是将数字信号先转化为电信号传输,到达传输地址后再讲电信号转化为数字信号)。

数据链路层:主要是将物理层传递过来的数据进行MAC地址(网卡地址,每台设备都是唯一的不重复的可以通过ipconfig/all查看)的封装和解析。这一层工作的设备主要是交换机,通过交换机来传输数据的。

网络层:主要是将数据链路层的数据在进行IP地址的封装于解析的过程。

传输层:定义了传输的协议和端口,常用的协议有UDP,TCP。

会话层:通过传输层建立了连接,然后建立会话。

表示层:主要是对接受的数据进行解析。

应用层:主要是一些终端的应用(在以后的web开发中都是基于应用层来开发的)。

TCP/IP参考模型:

主要是价格物理层和数据链路层合并为主机至网络层,网际层,传输层,会话层和表示层和应用层合并为应用层的四层机构。


2、网络通信的三大要素:

1)IP地址 (在Java中将IP地址封装成为一个类InetAddress)。 2)端口 3)传输协议

这里理解下端口的含义:端口其实就是各个应用程序的一个表示,比如一台机器发起一个通信,通过不同的端口就可以到达不同的应用程序中。同样的道理如果想禁用某一个程序的话就通过禁用端口就可以达到目的。

3、UDP协议网络通信的使用实例:

发送端代码:

class UDPSend{    public static void main(String []args){        //使用udp协议发送数据的步骤主要有如下几部       //1.创建一个发送端的套接字。       //2.使用DatagramPacket将发送的数据封装在这里面,这里面可以通过这个类的API来在接收端得到发送的信息。      //3.使用发送端的套接字将数据包中的内容发布出去。      //4.关闭套接字。具体的代码如下    //1,udpsocket服务。使用DatagramSocket对象。DatagramSocket ds = new DatagramSocket(8080);//这里的端口不指定的时候是随机的,当同一个客户端发送的时候端口都有可能是不一样的。    //2.这里的数据要放入到数据包中进行包装,而这个类接受的参数是字节类型的,所以要将字符串转化为字节数组。        String str = "HelloWorld";        byte []byt = str.getBytes();        DatagramPacket dp = new DatagramPacket(byt,byt.length,InetAddress.getByName("192.168.1.117"),10000);//@这里主要是指定服务器接收端的IP和端口       //3.发送数据。       ds.send(dp);       //4.关闭套接字       ds.close();    }}

接收端代码:

class UDPReceive{    public static void main(String []args){        //使用udp协议发送数据的步骤主要有如下几部       //1.创建一个接收送端的套接字。这里和发送端不一样的地方就是要指定一个端口,不然系统是默认随意的,是不会接收到数据的。       //2.创建数据包,用于存储接收到的数据。方便用数据包对象的方法解析这些数据.      //3.使用socket服务的receive方法将接收的数据存储到数据包中。      //4.通过数据表接续发送端发送的数据。      //5.关闭服务器端的套接字。        //1,udpsocket服务。使用DatagramSocket对象。DatagramSocket ds = new DatagramSocket(10000);//这里的端口必须要和发送端的@出的端口一样。        //2,创建数据包。        byte[] buf = new byte[1024];        DatagramPacket dp = new DatagramPacket(buf,buf.length);        //3,使用接收方法将数据存储到数据包中。       ds.receive()//阻塞式的。       //4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。       String ip = dp.getAddress().getHostAddress();       String text = new String(dp.getData(),0,dp.getLength());//这里只是显示出数据包中有的数据。       System.out.println(ip+":"+port+":"+text);<span style="white-space:pre"></span>       //5,关闭资源。       ds.close();    }}
上面的用法,只是一个简单的测UDP可以通信的小的实例,

发送端是根据用户键盘输入的,然后在服务器端显示的

public class UDPSendDemo2 {public static void main(String[] args) throws IOException {DatagramSocket ds = new DatagramSocket();//这里可以不写端口,系统会默认的给定端口的//String str = "HelloWorld!!";BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));String line = null;while((line=bufr.readLine())!=null){byte[] buf = line.getBytes();DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.117"),10000);ds.send(dp);}//4,关闭资源。ds.close();}}

然后就可以在服务器端不断的接收发送过来的数据了。

TCP通信实例代码:

在实际的开发中TCP用的更多,具体的实例如下

客户端代码:步骤1)建立客户端的套接字 2)套接字建立的是套接字流,可以使用客户端建立的套接字对象来获取输入和输出流对象(getInputStream()和getOutPutStream()方法来获取相应的流)3)向服务器发送数据,发送数据通过套接字流的输出流来发送 4)关闭套接字的连接。

public class TcpClientDemo{     public static void main(String[]args){        //建立客户端的套接字对象        SocKet sc = new Socket("192.168.1.117",8080);//这里要指定具体的服务器地址和端口        //通过创建的套接字对象来获取相应的输出流        OutputStream os = sc.getOutputStream();       //通过输出流来向服务器端写入数据       os.writer("HelloWorld Tcp".getBytes());       //关闭套接字       sc.close();    }}
服务器端代码:1)建立服务器端套接字 2)根据服务器端的套接字获取相应的客户端的套接字对象(这样服务器端才能将指定请求的数据返回给所请求的客户端)3)根据获取的客户端套接字对象,获取相应的输入流,来读取客户端发送的信息 4)关闭套接字连接(这里必须关闭客户端的套接字对象,服务器端的可以不用关闭,因为在实际中一般服务器端都不是为一个客户单端来服务的,如果断掉的话其他的客户端也就连不上了)

public class TcpServerDemo{    public static void main(String []args){          //创建服务端的套接字对象          ServerSocket  ss = new ServerSocket(8080)//这里必须的要指定具体的端口,否则接收不到客户端发过来的信息。          //根据服务器端的套接字对象来获取请求的对应的客户端的套接字对象          Socket s = ss.accept();          //根据获取的客户端的套接字对象来得到输入流,读取客户端发送过来的数据          InputStream in = s.getInputStream();          byte [] b = new byte[1024];          int len = in.read(b);//返回的实际的读取的字节数          String str = new String(b,0,len);          System.out.println(str);          //关闭客户端的套接字对象(必须要关)          s.close();    }}

如果要使用服务器给客户端回复内容,可以通过获取的客户端的套接字对象的输出流来向客户端写入内容:

       ServerSocket ss = new ServerSocket(8080);//2,获取连接过来的客户端对象。Socket s = ss.accept();//3,通过socket对象获取输入流,要读取客户端发来的数据InputStream in = s.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);String text = new String(buf,0,len);System.out.println(ip+":"+text);//使用客户端socket对象的输出流给客户端返回数据OutputStream out = s.getOutputStream();out.write("收到".getBytes());                s.close();


0 0
原创粉丝点击