JAVA网络编程(二)(TCP&UDP实现通信)

  • Post author:
  • Post category:java



InetAddress类



InetAddress常用方法


方法名


说明

public static InetAddress getLocalHost()

返回本地主机。

public static InetAddress getByName(String host)

根据ip和主机名获取InetAddress

public String getHostAddress()

获取ip地址

public String getHostName()

获取主机名


代码实现

import java.net.InetAddress;
import java.net.UnknownHostException;

public class Demo {
    public static void main(String[] args) throws UnknownHostException {
        //获取本地主机InetAddress对象
        InetAddress inetAddress=InetAddress.getLocalHost();
        //获取本地IP地址
        System.out.println(inetAddress.getHostAddress());
        //获取本地主机名
        System.out.println(inetAddress.getHostName());

        System.out.println("------------------------");
        //根据主机名获取InetAddress
        InetAddress inetAddress1=InetAddress.getByName("shishuo");
        System.out.println(inetAddress1);
    }
}


UDP通信程序



DatagramSocket类


这类代表一个发送和接收数据包的插座。该类是遵循 UDP协议实现的一个Socket类。数据报套接字发送或者接收点的分组传送服务。每个发送的数据包或数据报套接字上接收单独寻址和路由。从一台机器发送到另一台机器的多个数据包可能会被不同的路由,并可以以任何顺序到达。在可能的情况下,一个新建的DatagramSocket有SO_BROADCAST套接字选项已启用,以便允许广播数据报传输。为了收到广播包应该将DatagramSocket绑定到通配符地址。在一些实施方案中,广播包,也可以接受当一个DatagramSocket绑定到一个更具体的地址。


构造方法


方法名


说明

DatagramSocket()

构建一个数据报套接字 ,绑定到

本地主机



任何可用的端口

DatagramSocket(int port)

构建一个数据报套接字,绑定到

本地主机



指定端口

DatagramSocket(int port, InetAddress laddr)

创建一个数据报套接字,绑定到

指定的本地地址

DatagramSocket(SocketAddress bindaddr)

创建一个数据报套接字,绑定到

指定的本地套接字地址

protected DatagramSocket(DatagramSocketImpl impl)

创建一个绑定的数据报套接字, 与指定的datagramsocketimpl相关(一般不使用)


DatagramSocket常用方法


方法名


说明

void send(DatagramPacket p)

发送数据报包

void close()

关闭数据报套接字

void receive(DatagramPacket p)

接受数据报包


代码实现

客户端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/**
 *UDP网络编程发送端
 */
public class SendDemo {
    public static void main(String[] args) throws IOException {
        //DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口
        DatagramSocket d = new DatagramSocket();
        while(true) {
            System.out.println("请输入:");
            Scanner sc = new Scanner(System.in);
            String s = sc.nextLine();
            //使数据用字节数组存放
            byte[] bytes = s.getBytes();
            //创建对象包
            DatagramPacket p = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 10086);
            //发送数据包
            d.send(p);
        }
//        //关闭发送端
//        d.close();
    }
}

服务端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 *UDP网络编程接收端
 */
public class ReceviceDemo {
    public static void main(String[] args) throws IOException {
        //创建Socket接收端对象,并指明端口号为10086,与发送端保持一致
        DatagramSocket d=new DatagramSocket(10086);
        while(true){
            //使用字节数组接收数据
            byte[] bytes=new byte[1024];
            //
            DatagramPacket p=new DatagramPacket(bytes,bytes.length);
            //接收数据包
            d.receive(p);
            System.out.println("发送方信息:"+p.getAddress().getHostAddress()+"时间为"+getDate());
            //解析数据
            System.out.println("数据是:"+new String(p.getData(),0,p.getLength()));
        }
    }

    public static String getDate(){
        Date d = new Date();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = dateFormat.format(d);
        return format;
    }
}


TCP通信程序


  • 客户端:

    java.net

    .Socket 类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。

  • 服务端:

    java.net

    .ServerSocket 类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。


Socket类构造方法


方法名


说明

Socket(InetAddress address,int port)

创建流套接字并将其连接到指定IP指定端口号

Socket(String host, int port)

创建流套接字并将其连接到指定主机上的指定端口号


Socket类常用方法


方法名


说明

InputStream getInputStream()

返回此套接字的输入流

OutputStream getOutputStream()

返回此套接字的输出流


代码实现

先启动服务端,再启动客户端。

客户端:

package TCP;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class TCPDemo {
    public static void main(String[] args) throws IOException {
        //获取当前主机ip
        String hostAddress = InetAddress.getLocalHost().getHostAddress();
        //创建发送端对象(客户端) 指定主机上的端口号
        Socket socket = new Socket(hostAddress, 10086);
        while(true){
            System.out.println("请输入");
            Scanner sc = new Scanner(System.in);
            String s = sc.nextLine();
            //获取输出流对象写数据
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write(s.getBytes());
            
            //获取到服务器端发的回溯信息
            InputStream intput = socket.getInputStream();
            byte[] bytes=new byte[1024];
            int len = intput.read(bytes);
            System.out.println("收到回执信息:"+new String(bytes,0, len));

            //关闭资源
//            socket.close();
        }
    }
}

服务端:

package TCP;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPReceviceDemo {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(10086);
        //接收数据
        Socket accept = serverSocket.accept();
        while (true) {
            //创建字节数组接收
            byte[] bytes = new byte[1024];
            //获取字节输入流读数据
            InputStream inputStream = accept.getInputStream();
            int read = inputStream.read(bytes);
            //回溯信息
            OutputStream outputStream = accept.getOutputStream();
            outputStream.write("我已经收到信息!".getBytes());
            //输出数据
            System.out.println(new String(bytes, 0, read));
            //关闭资源
//            accept.close();
        }
    }
}



版权声明:本文为weixin_48882711原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。