10-网络编程

网络编程

问:Java Socket的几个方法

getInetAddress()      Returns the address to which the socket is connected.      
getLocalAddress()     Gets the local address to which the socket is bound.      
getReuseAddress()     Tests if SO_RESUSADDR is enabled.      
getRemotePort()        Returns the remote port number to which this socket is connected.

问:基于TCP协议的Socket通信

(1) 客户端实现步骤

  • 创建Socket对象,指明需要连接的服务器的地址和端口号
  • 连接建立后,通过输出流想服务器端发送请求信息
  • 通过输入流获取服务器响应的信息
  • 关闭响应资源

实例代码:

public static void main(String[] args) {
    Socket socket=null;
    PrintWriter pw=null;
    BufferedReader br=null;
    try {
        // 1、创建客户端Socket,指定服务器地址和端口
        socket = new Socket("127.0.0.1", 6000);
        // 2、获取输入流,并读取服务器端的响应信息
        br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        // 3、获取输出流,向服务器端发送信息
        pw = new PrintWriter(socket.getOutputStream());
        // 4. 通过输入流、输出流通信
    }catch (IOException e) {
        e.printStackTrace();
    } finally{
        try {
            // 5、关闭资源
            if(br!=null)
                br.close();
            if(pw!=null)
                pw.close();
            if(socket!=null)
                socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(2) 服务器端实现步骤

  • 创建ServerSocket对象,绑定监听端口
  • 通过accept()方法监听客户端请求
  • 连接建立后,通过输入流读取客户端发送的请求信息
  • 通过输出流向客户端发送乡音信息
  • 关闭相关资源

实例代码:

public static void main(String[] args) {
    ServerSocket serverSocket = null;
    Socket socket = null;
    BufferedReader br = null;
    PrintWriter pw = null;
    try {
        // 1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口(1024-65535),并监听此端口
        serverSocket = new ServerSocket(6000);
        // 2、调用accept()方法开始监听,等待客户端的连接
        socket = serverSocket.accept();
        // 3、获取输入流,并读取客户端信息
        br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        // 4、获取输出流,响应客户端的请求
        pw = new PrintWriter(socket.getOutputStream());
        // 5. 通过输入流、输出流通信
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            // 6、关闭资源
            if (br != null)
                br.close();
            if (br != null)
                pw.close();
            if (br != null)
                socket.close();
            if (br != null)
                serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

问:基于UDP协议的Socket通信

(1) 客户端实现步骤

  • 定义服务器的地址、端口号、数据
  • 创建DatagramPacket,包含将要发送的信息
  • 创建DatagramSocket
  • 向服务器发送数据

实例代码:

public static void main(String[] args) {
    DatagramSocket socket = null;
    try {
        // 向服务器端发送数据
        // 1、定义服务器的地址、端口号、数据
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 10010;
        byte[] data1 = "Hello Server".getBytes();
        // 2、创建数据报,包含发送的数据信息
        DatagramPacket packet1 = new DatagramPacket(data1, data1.length, address, port);
        // 3、创建DatagramSocket对象
        socket = new DatagramSocket();
        // 4、向服务器发送数据
        socket.send(packet1);

        // =========================================================
        // 接受服务器端响应数据
        // 1、创建数据报,用于接受服务器端响应数据
        byte[] data2 = new byte[1024];
        DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
        // 2、接受服务器响应的数据
        socket.receive(packet2);
        String str = new String(data2, 0, packet2.getLength());
        System.out.println("I am client, server says:" + str);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        // 4、关闭资源
        if(socket!=null)
            socket.close();
    }
}

(2) 服务器端实现步骤

  • 创建DatagramSocket,指定端口号
  • 创建DatagramPacket,,用于接受客户端发送的数据
  • 接受客户端发送的数据信息
  • 读取数据

实例代码:

public static void main(String[] args) {
    DatagramSocket socket = null;
    try {
        // 接受服务器端数据
        // 1、创建服务器端DatagramSocket,指定端口
        socket = new DatagramSocket(10010);
        // 2、创建数据报,用于接受客户端发送的数据
        byte[] data1 = new byte[1024];//
        DatagramPacket packet1 = new DatagramPacket(data1, data1.length);
        // 3、接受客户端发送的数据
        socket.receive(packet1);// 此方法在接受数据报之前会一致阻塞
        // 4、读取数据
        String info = new String(data1, 0, data1.length);
        System.out.println("I am server, client says: " + info);

        // =========================================================
        // 向客户端响应数据
        // 1、定义客户端的地址、端口号、数据
        InetAddress address = packet1.getAddress();
        int port = packet1.getPort();
        byte[] data2 = "Welcome!".getBytes();
        // 2、创建数据报,包含响应的数据信息
        DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
        // 3、响应客户端
        socket.send(packet2);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        // 4、关闭资源
        if (socket != null)
            socket.close();
    }
}
分享到 评论