您的位置:首页 > 理论基础 > 计算机网络

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

2013-12-01 11:23 204 查看
---------------------- <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模型
            应用层
            传输层
            网际层
            主机至网络层
TCP和UDP
        UDP
        将数据及源和目的封装成数据包中,不需要建立连接,每个数据报的大小在限制在64k内,因无连接,是不可靠协议,不需要建立连接,速度快
        TCP
        建立连接,形成传输数据的通道。在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接,效率会稍低
        三次握手:
        第一次:我问你在么?
        第二次:你回答在。
        第三次:我反馈哦我知道你在。
Socket(UDP传输)
      Socket就是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输,玩Socket主要就是记住流程,代码查文档就行。
UDP传输:DatagramSocket与DatagramPacket
       
发送端:
        建立DatagramSocket服务;提供数据,并将数据封装到字节数组中; 创建DatagramPacket数据包,并把数据封装到包中,同时指定IP和接收端口, 通过Socket服务,利用send方法将数据包发送出去;关闭DatagramSocket和DatagramPacket服务。
       
接收端:
        建立DatagramSocket服务,并监听一个端口;定义一个字节数组和一个数据包,同时将数组封装进数据包;通过DatagramPacket的receive方法,将接收的数据存入定义好的数据包;通过DatagramPacke关闭t的方法,获取发送数据包中的信息; 关闭DatagramSocket和DatagramPacket服务。
        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传输
        Socket和ServerSocket
        建立客户端和服务器端,建立连接后,通过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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: