黑马程序员--网络编程

http://edu.csdn.net/heima android培训 http://edu.csdn.net/heima ; java培训期待与您交流!

1、网络参考模型
OSI
参考模型七层模型
TCP/IP
参考模型四层模型
2
、网络通讯要素:ip地址,端口号,传输协议。
IP
地址:InteAddress,网络中设备的标识。
IP
地址是可以绑定到任意Mac地址上的网络标识。
本地回环地址:127.0.0.1本地主机名:localhost

端口号:用于标识应用程序的数字,是逻辑端口。
 
数字范围:0~65535  0~1024建议不要用,因为分配给了系统。


传输协议:UDPTCP
UDP
特点:

 
将数据及源和目的封装成数据包中,不需要建立连接。相当于送快递。
 
每个数据包的大小限制在64k内。
 
因为不需要连接,所以速度快,是不可靠协议。
TCP
特点:
 
要建立连接,形成传输通道。在连接中进行数据传输。
 
通过三次握手来完成连接,是可靠协议。
 
效率稍低。

Socket端点:

java中将通信的协议内容都封装到了Socket中。
Socket
是进行网络通信的前提,网络通信其实就是Socket间的通信。
通信的两端都要有Socket。数据在两个Socket间通过IO传输。
3
InetAddress类:描述IP地址。该类没有构造函数,提供静态方法获取对象。
常用方法:
获取InetAddress对象:
 
     getLocalHost();返回本地主机ip地址对象。
 
     getByName(String host);给定IP地址或主机名,获取InetAddress对象。
获取IP和主机名:
 
     getHostAddress();返回 IP地址字符串(以文本表现形式)。
 
     getHostName();获取此 IP地址的主机名。 

域名解析:

在浏览器中输入www.sina.com.cn,会先访问本地的hosts文件,如果找不到对应地址,再找DNS服务器,找到地址,再返回本地,再访问新浪主机。


4
UDP的发送和接收过程:

DatagramSocket类:用于发送和接收数据包的套接字。(套接字:就是Socket
常用方法:
 
     send(DatagramPacket p);发送数据包。
 
     receive(DatagramPacket p);用于接收数据报包。
DataframPacket
类:此类表示数据报包。
构造方法:

DatagramPacket(byte[] buf, int length, InetAddress address, int port)
 
发送包明确了具体数据,数据长度,ip地址,端口号。
DatagramPacket(byte[] buf, int length);
用来接收长度为 length的数据包。
常用方法:
 
     getPort();获取数据包中封装的端口号。
 
     getAddress();获取数据包中的ip地址。
 
     getData();反回数据缓存区,获取数据内容。
UDP
数据发送过程:
 
     1、建立DatagramSocket发送端。
 
     2、确定要发送的数据,用DatagramPacket封装成数据包。
 
     3、使用发送端的send()方法将数据包发送。
 
      java调用了系统底层的资源来完成发送。

代码演示:

需求:通过udp协议发送一段数据给指主机。

publicclass SendDemo {

 

    publicstaticvoid main(String[] args)throws SocketException, IOException {

       System.out.println("发送端开启......");

       //1、建立socket服务。

       DatagramSocket ds = new DatagramSocket();

       //2、确定发送的数据。

       String str = "hi,你好";

       byte[] buf = str.getBytes();

       //3、创建数据包对象,将数据封装到指定数据包中。

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

       //4、使用udpsocket服务的send方法,将数据包发出。

       ds.send(dp);

       //关闭资源。

       ds.close();  

    }

}


UDP
数据接收过程:
 
     1、建立DatagramSocket接收端。
 
     2、创建数据包,用于存储接收到的数据,并用数据包对象方法对数据包进行解析。
 
     3、使用socket对象的receive方法将接收到的数据都存储到数据包对象中。

4、既然数据已经存储到数据包中,直接用数据包的方法对这些数据进行解析。dp.getAddress().

5、关闭资源。

需求:接收到发过来的数据,并将数据中的ip地址和端口号以及数据内容都打印到显示器上。

 

publicclass ReceDemo {

    publicstaticvoid main(String[] args)throws IOException {

       System.out.println("接收端连接........");

       //1、创建udp服务端口,并绑定一个指定端口,给应用程序标识。

       DatagramSocket ds = new DatagramSocket(10000);

       //2、创建数据包,用于存储接收到的数据,并用数据包中的方法对数据包进行解析。

       byte[] buf =newbyte[1024];

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

       //3、使用soket对象的receive方法将受到的数据都存储到数据包对象中。

       ds.receive(dp); //阻塞式方法。

       //4、使用数据包中的方法对数据进行解析。

       //获取IP

       String ip = dp.getAddress().getHostAddress();

       //获取port

       int port = dp.getPort();

       //获取数据内容。

       byte[] data = dp.getData();//返回的是缓冲区。

       String text = new String(data,0,dp.getLength());//将缓冲区中的数据转成字符串。

       System.out.println(ip+":"+port+"::"+text);

       //5、关闭资源。

       ds.close();

    }

}

需求:写一个群聊程序,收发同时运行。

需要一个线程负责收数据,一个线程负责发数据。定义两个线程任务。

publicclass UDPChatTest {

    publicstaticvoid main(String[] args)throws SocketException {

       //1,创建接收端和发送端。

       DatagramSocket send = new DatagramSocket(1919);

       DatagramSocket rece = new DatagramSocket(10001);

      

       new Thread(new Send(send)).start();

       new Thread(new Rece(rece)).start();

    }

 

}

 

//定义发送任务。

class Sendimplements Runnable{

    private DatagramSocketds ;

    public Send(DatagramSocket ds) {

       super();

       this.ds = ds;

    }

    publicvoid run(){

       try{

           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.255"),10001);

              ds.send(dp);

              if("over".equals(line))

                  break;

           }

           ds.close();

       }

       catch(IOException e){      

       }  

    }

}

//定义接收任务。

class Receimplements Runnable{

   

    private DatagramSocketds ;

   

    public Rece(DatagramSocket ds) {

       super();

       this.ds = ds;

    }

    publicvoid run(){  

       try {

           byte[] buf =newbyte[1024];

          

           while(true){

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

             

              ds.receive(dp);

             

              String ip = dp.getAddress().getHostAddress();

              String text = new String(dp.getData(),0,dp.getLength());

               

              System.out.println(ip+":"+text);

              if("over".equals(text)){

                  System.out.println(ip+".....离开聊天室");

              }

           }     

       } catch (Exception e) {

           //TODO: handle exception

       }

    }

}

 

 


TCP
的连接方式:
通过流来建立连接通道,实现客户端和服务端的连接,TCP的连接需要通过三次握手。
Socket
类:实现客户端套接字。如果不在构造时明确窗口,可以使用方法明确。
构造方法:

Socket(InetAddress address, int port);
创建一个流套接字并将其连接到指定 IP 地址的指定端口
主要方法:
getInputStream();
返回此套接字的输入流。
getOutputStream();
返回此套接字的输出流。
getInetAddress();
返回套接字连接的地址。
getPort();
返回此套接字连接到的远程端口
close();
关闭流。

ServerSocket:实现服务端套接字。
构造方法:
ServerSocket(int port);
创建绑定到特定端口的服务器套接字,并监听一个窗口。
方法:
accept();
获取客户端的套接字。
close();
关闭流。

 

TCP连接代码演示:

需求:定义一个tcp的客户端,发送一段数据给服务器端。

publicclass ClientDemo {

    publicstaticvoid main(String[] args)throws UnknownHostException, IOException {

       System.out.println("客户端启动.......");

       //1,创建tcp客户端对象。必须要有socket服务。客户端通常一建立,就需要去进行连接。

       //因为这是面向连接的协议。所以必须明确要连接那个主机,以及端口。

       Socket s = new Socket("192.168.1.100",10002);

       //2,连接一旦建立,就形成了数据传输的通道,其实该通道就是IO流。而这个IO流是有socket建立的。

       //所以称之为socket io流。该流中也有输入流和输出流。

       //想要通过socket io流获取输出流。

       OutputStream out = s.getOutputStream();

       //3,使用输出流对象将数据写入。

        out.write("hitcp哥们又来了!~".getBytes());

       //4,关闭资源。

       s.close();

    }

}

 

需求:创建一个服务端用来接收数据。

publicclass ServerDemo {

    publicstaticvoid main(String[] args)throws IOException {

       System.out.println("服务端启动.......");

       //1,创建tcp服务端对象。并监听一个端口。

       ServerSocket ss = new ServerSocket(10002);

       //2,获取客户端对象和指定的客户端进行通信。该方法是 accept();

       Socket s = ss.accept();

       //获取一次客户端ip地址。

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

       System.out.println(ip+"....connected");

       //3,有了socket,就可以获取其中的流,必须要读取客户端的数据,需要获取读取流。

       InputStream in = s.getInputStream();

       byte[] buf =newbyte[1024];

       int len = in.read(buf);

       String  text = new String(buf,0,len);

       System.out.println(text);

       //关闭资源:

       s.close();//关闭客户端。

       ss.close();//关闭服务端。 

    }

}


http://edu.csdn.net/heima android培训 http://edu.csdn.net/heima ; java培训期待与您交流!详细请查看http://edu.csdn.net/heima

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想飞的鱼20

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值