黑马程序员 网络编程1

------------------android培训 java培训期待与您交流!-------------------


网络编程1

 

网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。 

  目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。 


两类传输协议:TCP;UDP

1、 Udp(聊天)

将数据即源和目的封装在数据包中,不需要建立连接

每个数据包的大小现在在64k内

无需连接,是不可靠协议

不需要建立,是可靠协议。

2、 Tcp(下载)

建立连接,形成传输数据的通道

在连接中进行大数据量的传输

       通过三次“握手”完成连接,是可靠协议

必须建立连接,效率会稍低

 

Socket是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。

 

通过udp传输方式,将一段文字数据发送到本地主机

 

//发送端代码:
package spr.internet;
import java.io.IOException;
import java.net.*;
public class UdpSend {
public static void main(String[] args) {
    DatagramSocket ds = null;
    try {  
       //1/创建udp服务,通过DatagramSocket对象。
       ds = new DatagramSocket();
    } catch (SocketException e) {
       // TODO Auto-generatedcatch block
       e.printStackTrace();
    }
    //2、确定数据,并封装成数据包。
    byte[] buf ="你好!我是春哥".getBytes();
    DatagramPacket dp = null;
    try {
       dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("localhost"), 8080);
    } catch (UnknownHostException e) {
       // TODO Auto-generatedcatch block
       e.printStackTrace();
    }
    try {
       //3、通过socket服务,将已有数据包发送出去。通过send方法。
       ds.send(dp);
    } catch (IOException e) {
       // TODO Auto-generatedcatch block
       e.printStackTrace();
    }
    //4、关闭资源
    ds.close();  
}
}

 

//接收端代码:
package spr.internet;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
 
public class UdpReceive{
    public static void main(String[] args){
       DatagramSocket ds = null;
       try {
           //1、创建udpsocket建立端点,监听一个端口
           ds = new DatagramSocket(8080);
       } catch (SocketException e) {
           // TODO Auto-generatedcatch block
           e.printStackTrace();
       }
       //2、定义数据包用于存储数据
       byte[] buf =newbyte[1024*1024];
       DatagramPacket dp= new DatagramPacket(buf, buf.length);
       //3、通过服务的receive方法将接收到的数据存入数据包中
       try {
           ds.receive(dp);
       } catch (IOException e) {
           // TODO Auto-generatedcatch block
           e.printStackTrace();
       }
       //4、通过数据包的方法获取其中数据。
       String ip = dp.getAddress().getHostAddress();
       String data = new String(dp.getData(),0,dp.getLength());
       int port = dp.getPort();
       System.out.println(ip+" :"+data+" : "+port);
       //5、关闭资源
       ds.close();  
    }
}
 

//运行结果:

127.0.0.1 : 你好!我是春哥 : 323

通过这样我们就可以写一个单向通信程序,加上线程即可实现双向通信

代码如下:

//发送端
package spr.internet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
public class UdpSend {
public static void main(String[] args) {
    DatagramSocket ds = null;
    try { 
       //1/创建udp服务,通过DatagramSocket对象。
       ds = new DatagramSocket();
    } catch (SocketException e) {
       // TODO Auto-generatedcatch block
       e.printStackTrace();
    }
    BufferedReader bufr =
       new BufferedReader(new InputStreamReader(System.in));
    String line = null;
    try {
       while((line=bufr.readLine())!=null){
           if("886".equals(line))
              break;  
       //2、确定数据,并封装成数据包。
       byte[] buf = line.getBytes();
       DatagramPacket dp = null;
       try {
           dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("localhost"), 8080);
       } catch (UnknownHostException e) {
           // TODO Auto-generatedcatch block
           e.printStackTrace();
       }
       try {     
           //3、通过socket服务,将已有数据包发送出去。通过send方法。
           ds.send(dp);
       } catch (IOException e) {
           // TODO Auto-generatedcatch block
           e.printStackTrace();
       }
       }
    } catch (IOException e) {
       // TODO Auto-generatedcatch block
       e.printStackTrace();
    }
    //4、关闭资源
    ds.close();    
}
}


接收端:

package spr.internet;
 
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpReceive{
    public static void main(String[] args){   
       DatagramSocket ds = null;
       try {
           //1、创建udpsocket建立端点,监听一个端口
           ds = new DatagramSocket(8080);
       } catch (SocketException e) {
           // TODO Auto-generatedcatch block
           e.printStackTrace();
       }
       while(true){
       //2、定义数据包用于存储数据
       byte[] buf =newbyte[1024*1024];
       DatagramPacket dp= new DatagramPacket(buf, buf.length);
       //3、通过服务的receive方法将接收到的数据存入数据包中
       try {
           ds.receive(dp);
       } catch (IOException e) {
           // TODO Auto-generatedcatch block
           e.printStackTrace();
       }
       //4、通过数据包的方法获取其中数据。
       String ip = dp.getAddress().getHostAddress();
       String data = new String(dp.getData(),0,dp.getLength());
       int port = dp.getPort();
       System.out.println(ip+" :"+data+" : "+port);
       }
    }   
}
 

运行结果:

127.0.0.1 : 你好,我是春哥 : 3235

h哈哈127.0.0.1 : fgdfgd : 3237

127.0.0.1 : yfuyfikiuloijl :3239


TCP传输

Socket和ServerSocket

建立客服端和服务器端

建立连接后,通过Socket的IO流进行数据的传输

关闭资源

同样,客服端于服务端是两个独立的应用程序。

URL专用于接收主机地址,端口,目录,协议等信息。其中的openConnection是应用层方法,内部封装了Socket对象。可以建立服务器,返回URLConnction对象,URLConnction对象的getInputstream方法能获取服务器资源,但不会含响应头信息,其中打算openStream方法直接开流。



 ------------------android培训 java培训期待与您交流!-------------------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值