Java网络编程

1.网络编程基础知识:

   网络编程是直接或间接通过网络协议与其他计算机进行通讯。
   网络编程中有两个问题:如何精准找到网络上要通讯的主机;在找到主机后如何进行数据传输。

   在TCP/IP协议中,IP层主要负责网络主机的定位,数据传输的路由,由IP地址唯一确定网络上的一台主机;
   而TCP层则提供面向应用的可靠或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层如何处理数据。

2.传输协议:TCP/UDP

 尽管TCP/IP协议中名称只有TCP这个协议名,但是在TCP/IP的传输层同时存在TCP和UDP这两个协议。  
 在建立连接后,可以进行大数据量的传输。通过TCP协议传输时,发送方和接收方的成对的两个
 socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个Socket(通常是Server Socket) 
 等待连接时,另一个Socket可以要求连接,一旦这两个Socket连接起来,它们就可以进行双向数据传输, 
 双方都可以进行数据的发送和接收操作。这种通讯和我们日常生活中打电话通讯十分类似。

UDP(User Datagram Protocol):是一种面向无连接的传输协议,这种通讯和我们日常生活中邮寄信件非常类似, 
将数据、数据源以及目的地封装成数据包中进行传输,由于不需要建立连接,所以传输效率会稍微高点, 
但是无法保证数据包会一定到达目的地、数据的可靠性、以及时间上的次序,是一种不可靠的协议。 
使用UDP传输数据时是有大小限制的,每个数据包的大小限制在64k内。

3.java网络编程

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

3.1. IP地址:IP地址是网络中设备的标识,用来定位网络主机,在java中IP地址被封装成InetAddress对象。

static InetAddress[] getAllByName(String host);        在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
static InetAddress getByAddress(byte[] addr);         在给定原始 IP 地址的情况下,返回 InetAddress 对象。
static InetAddress getByAddress(String host ,byte[] addr);  根据提供的主机名和 IP 地址创建 InetAddress
static InetAddress getByName(String host);         在给定原始 IP 地址的情况下,返回 InetAddress 对象。
static InetAddress getLocalHost();   返回本地主机

String getHostAddress();    返回 IP 地址字符串(以文本表现形式)
String getHostName();       获取此 IP 地址的主机名
byte[] getAddress();        返回此 InetAddress 对象的原始 IP 地址

3.2. 使用UDP建立Socket服务进行传输数据

 1)使用到的对象:
      DatagramSocket: 用来发送和接收数据报包的套接字
      DatagramPacket: 数据报包 

      使用UDP协议发送数据:
        步骤:a.建立UDPSocket服务;
              b.提供数据,并将数据封装到数据报中;
              c.通过Socket服务的发送功能,将数据报发送出去;
              d.关闭资源;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;

    public class UdpSendDemo{

        public static void main(String[] args) throws Exception {
            //1.创建UDP服务,端口号有系统指定
            DatagramSocket ds = new DatagramSocket();
            //2.确定数据,并封装成数据报,将数据发送到本机,用端口号10000处理
            byte[] buf = "使用UDP发送数据".getBytes();
            DatagramPacket dp = new DatagramPacket(buf, buf.length ,InetAddress.getLocalHost() , 10000);
            //3.使用socket服务将数据报发送出去
            ds.send(dp);
            //4.关闭资源
            ds.close();
        }
    }


使用UDP协议接收数据
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpReceiveDemo {

    public static void main(String[] args)throws Exception {
        //1.创建UDP服务,监听端口号10000
        DatagramSocket ds = new DatagramSocket(10000);
        //2.创建接收数据的数据报
        byte[] buf = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        //3.通过socket服务接收数据存入定义好的数据报中,receive()方法是阻塞式的
        ds.receive(dp);
        //4.通过数据报获取数据
        System.out.println("IP: " + dp.getAddress().getHostAddress() + "  端口号  "  
               + dp.getPort() + "  内容: " + new String(dp.getData()).trim());  
        //5.关闭资源
        ds.close();
    }

}

3.3使用TCP传输数据:

1).使用到的对象:
    Socket:         实现客户端套接字
    ServerSocket:   实现客户端套接字

//客户端代码    
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class TcpClientDemo {

    public static void main(String[] args)throws Exception {
        //1.创建Socket服务,并指定要连接的地址和端口
        Socket socket = new Socket(InetAddress.getLocalHost() , 10000);
        //2.获取输入流,写入数据,发送到服务端
        OutputStream os = socket.getOutputStream();
        os.write("Socket客户端使用Tcp发送数据".getBytes());
        //3.获取输出流,读取服务端发送过来的数据
        InputStream is = socket.getInputStream();
        byte[] buf = new byte[1024];
        int len = is.read(buf);
        System.out.println(new String(buf ,0 , len));
        //4.关闭资源
        socket.close();

    }

}

//服务端代码
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServerDemo {

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

        //1.建立服务端socket
        ServerSocket ss = new ServerSocket(10000);
        //2.接收客户端Socket, 该方法是阻塞式的
        Socket s = ss.accept();
        //3.读取客户端发送的数据
        InputStream is = s.getInputStream();
        byte[] buf = new byte[1024];
        int len = is.read(buf);
        System.out.println(new String(buf,0 , len));
        //4.给客户端发送数据
        OutputStream os = s.getOutputStream();
        os.write("服务端发送数据到客户端".getBytes());
        //5.关闭服务
        s.close();
        ss.close();
    }
}

4.基于URL高层次的Java网络编程
URL代表统一资源定位符,它表示Internet上某一资源的地址。

使用URL连接网络上的资源
    URL url = new URL("http://www.baidu.com");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET"); // 设置请求方式为get方式
    conn.setReadTimeout(5000);  //设置读取时间为5s
    conn.setConnectTimeout(5000); //设置连接超时时间
    conn.connect();   // 开始连接
    if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){ // 根据返回码判断是否连接成功
        byte[] buf = new byte[1024];
        int len = 0;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        InputStream in = conn.getInputStream();
        while((len= in.read(buf)) != -1){
            bos.write(buf , 0 , len);
        }
        System.out.println(bos.toString());
        bos.close();
    }
    conn.disconnect();   //断开连接

参考博客:http://www.cnblogs.com/linjiqin/archive/2011/06/10/2077237.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值