ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java网络编程(一)

2020-11-28 18:58:55  阅读:161  来源: 互联网

标签:DatagramSocket Java buf 编程 网络 new 数据包 ds dp


网络通讯要素:

  • IP地址

    - 网络中设备的标识
    - 不易记忆,可用主机名
    - 本地回环地址:127.0.0.1     
    
  • 端口号

    - 用于标识进程的逻辑地址,不同进程的标识
    - 有效端口:0 ~ 65535,其中0 ~ 1024为系统使用或保留端口
    
  • 传输协议

    - 通讯的规则
    - 常见协议:TCP,UDP
               TCP:建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次
                    握手完成连接,是可靠协议。必须建立连接,效率会稍低。
               UDP:将数据及源和目的封装成数据包中,不需要建立连接。每个数据报的大小
                    限制在64k内。不需要建立连接,速度快。因为没有连接,所以是不可靠
                    协议。
    

Java提供网络开发的辅助有四大类:InetAddress、URL、Sockets、Datagram

  • InetAddress 面向的是IP层,用于标识网络上的硬件资源。
  • URL 面向的是应用层,通过URL,Java程序可以直接送出或读入网络上的数据。
  • Sockets 和 Datagram 面向的是传输层。Sockets使用的是TCP,这是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道进行通信。Datagram则使用UDP,是令一种网络传输方式,它把数据的目的地记录在数据包中,然后直接放在网络上。

Java提供的网络开发辅助类都包含在java.net包中,其主要的类和可能产生的异常如下:

  • 面向IP层的类:InetAddress.
  • 面向应用层的类:URL、URLConnection。
  • TCP相关的类:Socket、ServerSocket。
  • UDP相关的类:DatagramPacket、DatagramSocket、MulticastSocket。
  • 可能产生的异常:BindException、ConnetException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownException、UnknownServiceException

InetAddress类的简单使用:

InetAddress类的使用方式,以及功能在API文档内都能查到,这里也就不在赘述,直接使用了。

使用InetAddress的静态方法获取指定服务器的IP地址和主机名。

import java.net.*;


public class IPdemo {
    public static void main(String[] args){
       try{
           
           InetAddress IP= InetAddress.getByName("www.tup.tsinghua.edu.cn");
           System.out.println("InetAddress对应的IP地址为 : " + IP.getHostAddress());
           System.out.println("主机名为 : " + IP.getHostName());
       }
       catch(Exception e)
       {
           e.printStackTrace();
       }
    }
    
}

创建一个UDP的发送端和接受端

import java.net.*;
/**
 *
 * 通过udp传输方式,将一段文字数据发送出去
 * 
 * 定义udp的接收端
 * 思路:
 * 1、建立updsocket服务。通常
 * 2、提供数据,并将数据封装到数据包中
 * 3、通过socket服务的发送功能,将数据包发送出去
 * 4、关闭资源
 */
public class UDPsend {
    
    public static void main(String[] args) throws Exception{
        
        //创建udp服务,通过DatagramSocket对象
        DatagramSocket ds = new DatagramSocket();
        
        //确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)
        byte[] buf = "udp ge men lai le".getBytes();//发送给对方的内容
        DatagramPacket dp = 
                new DatagramPacket(buf, buf.length, InetAddress.getByName("125.46.88.113"), 10000);//这里是目标IP地址和发送的端口号
        
        //通过socket服务,将已有的数据包发送给出去,通过send方法。
        ds.send(dp);
        
        //关闭资源
        ds.close();
    }
    
}

import java.net.*;
/**
 *
 * 需求:定义一个应用程序,用于接收udp协议传输的数据并处理
 * 
 * 思路:
 * 1、定义udpsocket服务。通常会监听一个端口。其实就是给这个接受网络应用程序定义数字标识。
 *       方便于明确哪些数据过来该应用程序可以处理
 * 2、定义一个数据包,因为要存储接收到的字节数据
 * 因为数据包对象中有更过功能可以提取字节数据中的不同数据信息
 * 3、通过socket服务的receive方法将接收到的数据库存入已定义好的数据包中
 * 4、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
 * 5、关闭资源
 */
public class UDPrece {

    public static void main(String[] args) throws Exception{
       //创建udp socket,建立断点。
       DatagramSocket ds = new DatagramSocket(10000);//这里的10000是端口号,和发送方的一致
       
       //定义数据包,用于存储数据。
       byte[] buf = new byte[1024];
       DatagramPacket dp = new DatagramPacket(buf, buf.length);
       
       //通过服务的receive方法将收到的数据存入数据包中
       ds.receive(dp);
       
       //通过数据包的方法获取其中的数据
       String ip = dp.getAddress().getHostAddress();
       String data = new String(dp.getData(),0,dp.getLength());
       
       int port = dp.getPort();
       
        System.out.println(ip + ": : " + data + " : : " + port);
        
        ds.close();
       
    }
    
}

上面的代码已经初具聊天的功能,接下来使用之前学过的多线程实现在同一个窗口简易聊天的功能(主要还是学习思想)。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
/**
 *编写一个聊天程序。
 * 有收数据的部分,和发数据的部分,这两个部分同时执行。那就需要用到多线程技术。
 * 一个线程控制收,一个线程控制发。
 * 
 * 因为
 * 
 */
class Send implements Runnable
{
    private DatagramSocket ds;  
    Send(DatagramSocket ds)
    {
        this.ds = ds;
    }
    
    public void run()
    {
        try
        {
            BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
            
            String line = null;
            
            while((line = bufr.readLine()) != null)
            {
                if("886".equals(line))
                    break;
                
                byte[] buf = line.getBytes();
                DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("10.101.76.80"),10002);
                
                ds.send(dp);
            }
        }
        catch(Exception e)
        {
            throw new RuntimeException("发送端发送失败");
        }
    }
}

class Rece implements Runnable
{
    private DatagramSocket ds;  
    Rece(DatagramSocket ds)
    {
        this.ds = ds;
    }
    public void run()
    {
        try
        {
            while(true)
            {
                byte[] buf = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf, buf.length);
                
                ds.receive(dp);
                
                String ip = dp.getAddress().getHostAddress();
                
                String data = new String(dp.getData(), 0, dp.getLength());
                
                System.out.println(ip + " : " + data);
            }
        }
        catch(Exception e)
        {
            throw new RuntimeException("接收端接收失败");
        }
    }
}

public class Chat {

    public static void main(String[] args) throws Exception{
        
        DatagramSocket sendSocke = new DatagramSocket();
        DatagramSocket receSocke = new DatagramSocket(10002);
        
        new Thread(new Send(sendSocke)).start();
        new Thread(new Rece(receSocke)).start();
    }
    
}

标签:DatagramSocket,Java,buf,编程,网络,new,数据包,ds,dp
来源: https://blog.csdn.net/weixin_44096353/article/details/110264233

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有