java 网络编程-java(6)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/babybabyup/article/details/83445926

前言

计算机网络中学到了tcp/ip协议,重新拾起去年的java课本,学一学网络程序

正文

主要熟悉一下常用的有关网络的类,以及写写小程序实践一下。

套接字

当两个程序需要通信时,可以使用Socket类建立套接字连接在一起。套接字包含了IP地址和端口号。端口号是0~65535之间的一个整数,0~1023被预先定义的服务通信占用,所以要选用1024~65535之间的整数。

客户端Socket

  • 带参数构造方法
Socket mySocket = new Socket(String host, int port);

获得socket对象后,可以使用getInputStream()getOutputStream()获得输入流,输出流用来写,读数据。

  • 不带参数构造方法
Socket mySocket = new Socket();

通过connect(ScoketAddress socketAddress)连接。可以使用ScoketAddress子类InetSocketAddress对象。InetSocketAddress构造方法为

InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress inetAddress,int port)

用户端ServerSocket

通过ServerSocket对象可以获得一个Socket对象,用于连接客户端。其构造方法为:

ServerSocket serverForClicent = new ServerSocket(int port);

通过accept()获得Socket对象。
编写一个例子:
Client.java

package javanet;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {
    public static void main(String args[]) {
        String[] mess = {"1+1在什么情况下等于2", "狗为什么不生跳蚤", "什么东西能吃能看能做"};
        Socket mySocket = new Socket();
        DataInputStream in = null;
        DataOutputStream out = null;
        try {
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            InetSocketAddress inetSocketAddress = new InetSocketAddress(inetAddress, 2010);
            mySocket.connect(inetSocketAddress);
            in = new DataInputStream(mySocket.getInputStream());
            out = new DataOutputStream(mySocket.getOutputStream());
            for (int i=0;i<mess.length;i++) {
                out.writeUTF(mess[i]);
                String s = in.readUTF();
                System.out.println("客户收到服务器回答: "+s);
                Thread.sleep(5000);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

Server.java

package javanet;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String args[]) {
        String[] answer = {"在算错的情况下", "狗就能生狗", "电视面包沙发"};
        ServerSocket serverForClicent = null;
        Socket socketOnServer = null;
        DataOutputStream out = null;
        DataInputStream in = null;
        try {
            serverForClicent = new ServerSocket(2010);
            socketOnServer = serverForClicent.accept();
            in = new DataInputStream(socketOnServer.getInputStream());
            out = new DataOutputStream(socketOnServer.getOutputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
        for (int i=0;i<answer.length;i++) {
            if (socketOnServer!=null) {
                try {
                    System.out.println("服务器收到客户问题: "+in.readUTF());
                    out.writeUTF(answer[i]);

                } catch (Exception e) {
                    e.printStackTrace();

                }
            }
        }
    }
}

UDP数据报

套接字是基于socket的网络通信,是有连接的。通过connect()accept()连接,通过流来传输数据。UDP数据传输更快,但是无法确定数据是否到达目的主机,不提供可靠性保证。
UDP通信基本模式为:

  • 数据打包,发送数据包
  • 接收数据包并查看

发送数据包

DatagramPacket类将数据打包成数据包,DatagramSocket类发送数据包

InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
DatagramPacket datagramPacket = new DatagramPacket(data, data.length, inetAddress, 2009);
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.send(datagramPacket);

接收数据包

DatagramSocket类接收数据包后并封装在DatagramPacket对象中

DatagramSocket datagramSocket = new DatagramSocket(2009);
DatagramPacket datagramPacket = new DatagramPacket(data, len);
datagramSocket.receive(datagramPacket);

具体写一个例子
Myhost.java发送数据包

package udptest;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Myhost {
    public static void main(String args[]) {
        byte[] data = "今天是周日".getBytes();
        try {
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            DatagramPacket datagramPacket = new DatagramPacket(data, data.length, inetAddress, 2009);
            DatagramSocket datagramSocket = new DatagramSocket();
            datagramSocket.send(datagramPacket);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Youhost.java接收数据包

package udptest;


import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Youhost {
    public static void main(String args[]) {
        byte[] data = new byte[100];
        int len = 90;
        try {
            DatagramSocket datagramSocket = new DatagramSocket(2009);
            DatagramPacket datagramPacket = new DatagramPacket(data, len);
            datagramSocket.receive(datagramPacket);
            String me = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
            System.out.println(me);
            System.out.println(datagramPacket.getAddress());
            System.out.println(datagramPacket.getPort());
            System.out.println(datagramPacket.getSocketAddress());

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

猜你喜欢

转载自blog.csdn.net/babybabyup/article/details/83445926