黑马程序员_java网络编程<十>

本文深入解析网络编程的基础概念,包括OSI和TCP/IP模型,重点介绍网络通讯要素、通信协议(如TCP和UDP)及其在网络模型中的作用。详细阐述了Socket在UDP和TCP传输中的应用,包括其构造方法、方法摘要以及UDP和TCP传输流程的实现案例。
摘要由CSDN通过智能技术生成

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


网络编程

    网络模型

        OSI参考模型

        TCP/IP参考模型

网络通讯要素

        IP地址 网络号码+主机地址

端口号;


定义通信规则。这个规则称为通信协议,国际组织定义了通用协议TCP/IP


网络模型:

       TCP/IP模型

            应用层

            传输层

            网际层

            主机至网络层

TCPUDP

        UDP

        将数据及源和目的封装成数据包中,不需要建立连接,每个数据报的大小在限制在64k内,因无连接,是不可靠协议,不需要建立连接,速度快

        TCP

        建立连接,形成传输数据的通道。在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接,效率会稍低

        三次握手:

        第一次:我问你在么?

        第二次:你回答在。

        第三次:我反馈哦我知道你在。

Socket(UDP传输)

      Socket就是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输,玩Socket主要就是记住流程,代码查文档就行。

UDP传输:DatagramSocketDatagramPacket

        发送端:

        建立DatagramSocket服务;提供数据,并将数据封装到字节数组中; 创建DatagramPacket数据包,并把数据封装到包中,同时指定IP和接收端口, 通过Socket服务,利用send方法将数据包发送出去;关闭DatagramSocketDatagramPacket服务。

        接收端:

        建立DatagramSocket服务,并监听一个端口;定义一个字节数组和一个数据包,同时将数组封装进数据包;通过DatagramPacketreceive方法,将接收的数据存入定义好的数据包;通过DatagramPacke关闭t的方法,获取发送数据包中的信息; 关闭DatagramSocketDatagramPacket服务。

        DatagramSocket

        构造方法:

        DatagramSocket();构造数据报套接字并将其绑定到本地主机上任何可用的端口。

        DatagramSocket(int port) ;创建数据报套接字并将其绑定到本地主机上的指定端口。

        DatagramSocket(int port, InetAddress addr); 创建数据报套接字,将其绑定到指定的本地地址。

        方法摘要:

        void  close();关闭此数据报套接字。

        InetAddress  getInetAddress();返回地址。

        InetAddress  getLocalAddress();获取本地地址。

        int  getPort();返回端口。

        void  receive(DatagramPacket p);接收数据报包。

        void  send(DatagramPacket p);发送数据报包。

        DatagramPacket

        构造方法:

        DatagramPacket(byte[] buf, int length) ;构造DatagramPacket,用来接收长度为 length 的数据包。

        DatagramPacket(byte[] buf, int length, InetAddress address, int port);构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

方法:

        InetAddress  getAddress();返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。

        byte[]  getData();返回数据缓冲区。

        int  getLength();返回将要发送或接收到的数据的长度。

        int getPort();返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。   

        例:

        发送端:

        class UDPSend  {

            public static void main(String[] args) throws Exception{

                DatagramSocketd  s = new DatagramSocket();

                byte[]  buf = "这是UDP发送端".getBytes();

                DatagramPacket  dp = new DatagramPacket( buf,buf.length,InetAddress.getByName("192.168.1.253"),10000);

                ds.send(dp);

                ds.close();

            }

        }

       接收端

        class UDPRece{

            public  static void main(String[] args) throws Exception{

                DatagramSocket ds = new DatagramSocket(10000);

                byte[] buf = new byte[1024];

                DatagramPacket dp = new DatagramPacket(buf,buf.length);

                ds.receive(dp);//将发送端发送的数据包接收到接收端的数据包中

                String ip = dp.getAddress().getHosyAddress();//获取发送端的ip

                String data = new String(dp.getData(),0,dp.getLength());//获取数据

                int port = dp.getPort();//获取发送端的端口号

                sop(ip+":"+data+":"+port);

                ds.close();

            }

        }

        例:UDP键盘录入数据,并发送给接收端

        发送端:

        class UDPSend {

            public static void main(String[] args) throws Exception {

                DatagramSocket ds = new DatagramSocket();

    BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

                Stringline = null;

                while((line= bufr.readLine())!=null) {

                    if("886".equals(line))

                        break;

                    byte[] buf = line.getBytes();

                    DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.253"),10000);

                    ds.send(dp);

                }

                ds.close();

            }     

        }

        接收端:

        class UDPRece {

            public static void main(String[] args) throws Exception {

                DatagramSocket ds = new DatagramSocket(10000);

                while(true) {

                    byte[]buf = new byte[1024];

                    DatagramPacket dp = new DatagramPacket(buf,buf.length);

                    ds.receive(dp);//将发送端发送的数据包接收到接收端的数据包中

                    String ip = dp.getAddress().getHosyAddress();//获取发送端的ip

                    String data = new String(dp.getData(),0,dp.getLength());//获取数据

                    int port = dp.getPort();//获取发送端的端口号

                    sop(ip+":"+data+":"+port);

                    ds.close();

                }

            } 

        }


TCP传输

        SocketServerSocket

        建立客户端和服务器端,建立连接后,通过Socket中的IO流进行数据的传输,关闭socket,同样,客户端与服务器端是两个独立的应用程序。

Socket

       构造方法:

        Socket() ;创建未连接套接字

        Socket(InetAddress address, int port); 创建流套接字并指定 IP 地址,端口号。

        Socket(String host, int port) ;创建流套接字并指定主机上的指定端口号。

        方法:

        void close();关闭此套接字。

        InetAddress getInetAddress();返回连接的地址。

InputStream getInputStream() ;返回输入流。

        OutputStream getOutputStream();返回输出流。

        int getPort();返回远程端口。

        void shutdownInput()此套接字的输入流置于“流的末尾”。

        void shutdownOutput()禁用此套接字的输出流。

        String toString() 将此套接字转换为 String。

ServerSocket

        构造方法:

        ServerSocket()创建非绑定服务器套接字。

        ServerSocket(int port)创建绑定到特定端口的服务器套接字。

        方法:

        Socket accept()侦听并接受到此套接字的连接。

        void close()关闭此套接字。

        InetAddress getInetAddress()返回此服务器套接字的本地地址。


TCP传输流程

        客户端:

        建立Socket服务,并制定要连接的主机和端口;

        获取Socket流中的输出流OutputStream,将数据写入流中,通过网络发送给服务端;

        获取Socket流中的输出流InputStream,获取服务端的反馈信息;

        关闭资源。

        服务端:

        建立ServerSocket服务,并监听一个端口;

        通过ServerSocket服务的accept方法,获取Socket服务对象;

        使用客户端对象的读取流获取客户端发送过来的数据;

        通过客户端对象的写入流反馈信息给客户端;

        关闭资源;

        示例:

        客户端:

        class TCPClient {

            public static void main(String[] args){

                Socket s = new Socket("192.168.1.253",10000);

                OutputStream os = s.getOutputStream();

                out.write("这是TCP发送的数据".getBytes());

                s.close();

            }

        }

        服务端:

        class TCPServer {

            public static void main(String[] args){

                ServerSocket ss = new ServerSocket(10000);

       Socket s= ss.accept();

                String ip = s.getInetAddress().getHostAddress();

                sop(ip);

                InputStream is = s.getInputStream();

                byte[] buf = new byte[1024];

                int len = is.read(buf);

                sop(new String(buf,0,len));

                s.close();

                ss.close();

            }

        }

        TCP:客户端给服务端发送数据,服务端接收到后反馈信息给客户端

        客户端:

        class TCPClient  {

            public static void main(String[] args) {

                Sockets = new Socket("192.168.1.253",10000);

                OutputStream os = s.getOutputStream();

                out.write("这是TCP发送的数据".getBytes());

                InputStream is = s.getInputStream();

                byte[] buf = new byte[1024];

                int len = is.read(buf);

                sop(new String(buf,0,len));

                s.close();

        }

        }

        服务端:

        class TCPServer  {

            public static void main(String[] args)  {

                ServerSocket  ss = new ServerSocket(10000);

                Socket s = ss.accept();

                String ip = s.getInetAddress().getHostAddress();

                sop(ip);

                InputStream is = s.getInputStream();

                byte[] buf = new byte[1024];

                int len = is.read(buf);

                sop(new String(buf,0,len));

                OutputStream os = s.getOutputStream();

                out.write("这是TCP发送的数据".getBytes());

                s.close();

                ss.close();

            }

        }

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值