Java TCP/IP 与 UDP 的创建与使用

IP

  IP是每台电脑在互联网上的唯一标识符。一个IPV4的地址是由四段0—255的数字组成:192.168.0.100。
  InetAddress类表示一个IP地址。

getLocalHost() 获取本地主机
getByName(String host) 依据主机名获取主机
getHostName() 获取主机名称
getHostAddress() 获取主机字符串形式的IP

public static void main(String[] args) throws UnknownHostException {
	//获取本地IP地址
	InetAddress localHost = InetAddress.getLocalHost();
	
	//获取IP字符串或者主机名称字符串
	String hostName = localHost.getHostName();
	System.out.println(hostName);
	
	String hostAddress = localHost.getHostAddress();
	System.out.println(hostAddress);
	
	//获取其他主机IP地址
	InetAddress byName = InetAddress.getByName("www.baidu.cn");
	System.out.println(byName);
	
	InetAddress byName2 = InetAddress.getByName("192.168.1.1");
	System.out.println(byName2);
}

Socket

  Socket就是为网络编程提供的一种机制,又叫套接字编程。
  Socket需要理解以下几点内容:
    1.通信的两端都有Socket;
    2.网络通信其实就是Socket间的通信;
    3.数据在两个Socket间通过IO传输;
    4.Socket编程一般使用TCP与UDP两种协议。

UDP

     UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
    由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输,例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
    但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。

public static void main(String[] args) throws IOException {
    //UDP
    //建立发送端
    DatagramSocket ds =  new DatagramSocket();

    while (true){
        //创建数据
        //实例输入类
        Scanner cn = new Scanner(System.in);
        //IO阻塞
        String s = cn.nextLine();
        //建立数据包 
        //字节数组
        byte[] arr = s.getBytes();
        int length = arr.length;
        //获取目标主机
        InetAddress address = InetAddress.getLocalHost();
        int port = 12345;
        //包装数据
        DatagramPacket dp = new DatagramPacket(arr,length,address,port);
        //打开并且发送数据包
        ds.send(dp);
        //关闭socket
        //ds.close()
    }
}
public static void main(String[] args) throws IOException {
    //建立接收端
    DatagramSocket ds = new DatagramSocket(12345);
    while (true){
        //建立数据包
        byte[] arr = new byte[1024];
        DatagramPacket dp = new DatagramPacket(arr,arr.length);
        //接收数据  IO 阻塞机制
        ds.receive(dp);
        //解析数据
        System.out.println(dp.getAddress());
        System.out.println(dp.getPort());
        byte[] res = dp.getData();
        //数据的长度
        int length = dp.getLength();
        String s = new String(res, 0, length);
        System.out.println("接收到数据:" + s);
        //关闭socket
        //ds.close()
    }
}

TCP

    TCP协议通过三次握手协议将客户端与服务器端连接,两端使用各自的Socket对象。Socket对象中包含了IO流,供数据传输。即:TCP协议在客户端与服务器端通过Socket组成了IO通道,数据在IO通道中传输,客户端传输的数据成队列方式写出,服务器端接收,同样服务器端传输的数据成队列方式写出,客户端接收。
    Socket客户端和ServerSocket服务器端:
        1、建立客户端和服务器端;
        2、建立连接后,通过Socket中的IO流(Socket流)进行数据的传输;
        (如果是服务器端,则需要添加一步操作:通过Socket服务获取Socket,再获取其中的IO流)
        3、关闭socket。
    注意点:
        1、服务器端开启后等待客户端访问,可以不关闭;
        2、一个服务端可以对应多个客户端;
        3、不同客户端间通信可以通过服务器端中转信息。

  服务器向客户端发送数据:

public static void main(String[] args) throws IOException {
    //创建服务端
    ServerSocket server=new ServerSocket(12345);//参数为端口号
    //通过服务端获取其Socket
    //阻塞机制
    Socket s = server.accept();
    //得到传输socket的IO流
    //读数据接受数据是InputStream 发送数据是OutputStream
    OutputStream ow = s.getOutputStream();
    String str1 = "服务器向客户端发送数据1";
    ow.write(str1.getBytes());
    String str2 = "服务器向客户端发送数据2";
    ow.write(str2.getBytes());

    //告知客户端数据发送结束了
    s.shutdownOutput();
    //关闭socket
    s.close();
    //关闭服务端
    server.close();
}
public static void main(String[] args) throws IOException {
     //建立连接服务器的socket
     Socket s = new Socket("192.168.1.103", 12345);//参数为IP,端口号
     InputStream io = s.getInputStream();
     byte[] arr = new byte[1024];
     int len;
     while((len=io.read(arr))!=-1){
         String sNew= new String(arr,0,len);
         System.out.println("接收到来自服务端的数据"+sNew);
     }

     s.close();
}

  客户端向服务器端发送数据:

public static void main(String[] args) throws IOException {
    //创建服务端
    ServerSocket server=new ServerSocket(12345);//参数为端口号
    //通过服务端获取其Socket
    //阻塞机制
    Socket s = server.accept();
    //得到传输socket的IO流
    //读数据接收数据是InputStream 发送数据是OutputStream
    InputStream io = s.getInputStream();
    byte[] arr = new byte[1024];
    int len;
    while((len=io.read(arr))!=-1){
        String sNew= new String(arr,0,len);
        System.out.println("接受到来自客户端的数据"+sNew);
    }
    //关闭socket
    s.close();
    //关闭服务端
    server.close();
}
public static void main(String[] args) throws IOException {
     //建立连接服务器的socket
     Socket s = new Socket("192.168.1.103", 12345);//参数为IP,端口号
     OutputStream os = s.getOutputStream();
     String s1 = "客户端向服务器发送了数据1";
     os.write(s1.getBytes());
     OutputStream os= s.getOutputStream();
     String s2 = "客户端向服务器发送了数据2";
     os.write(s2.getBytes());
     //关闭socket
     s.close();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值