Java中的网络编程

网络编程

网络编程的概述:1:Java是Internet上的语言,它从语言上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。2.Java提供的网络内库,可以实现互通的网络连接,网络的底层细节被隐藏在Java的本机安装系统里面,由JVM进行控制,并且Java实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。

要想实现网络编程,需要考虑以下两个问题:
问题一:要想实现网络传输,需要考虑的问题有哪些?

1.使用Ip地址定位互联网一台主机;使用端口号定位一个应用。
2.要想是想网络传输,要先创建一个InetAdderss类,我们通过以下方式建立InetAdderss类:

InetAdderss inet1=InetAdderss.getByName(host);//这里host是指知己的IP地址

②InetAddress inet1 = InetAddress.getLocalHost(); //获取本机的InetAddress对象
3.①String hostName = inet.getHostName(); //获取域名
②String hostAddress = inet.getHostAddress();//返回主机IP地址
问题二:如何才能进行可靠的、高效的数据传输?
要使实现可靠、高效的数据传输,必须通过网络通信协议。根据下图,了解网络通信协议:

img

在java.net包中提供了两种常见的网络协议的支持:
①TCP:TCP是传输控协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称为TCP/IP。
②UDP:UDP是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。

TCP和UDP的优缺点:
1、TCP协议
①使用TCP协议前,须建立TCP链接,形成传输数据通道。
②传输前,采用“三次握手”方式,是可靠的。
③TCP协议进行通信的两个应用进程:客户端、服务端。
④在连接中可进行大数据量的传输。
⑤传输完毕,需释放已建立的连接,效率低。
2.UDP协议
①将数据、源、目的封装成数据包,不需要建立连接。
②每个数据报的大小限制在64K内。
③因无需连接,故是不可靠的。
④发送数据结束时无需释放资源,速度快。
四、Socket 编程
套接字使用TCP提供了两台计算机之间的通信机制。 客户端程序创建一个套接字,并尝试连接服务器的套接字。

当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对 Socket 对象的写入和读取来进行进行通信。

java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种来监听客户端,并与他们建立连接的机制。

InetAdderss的测试:

public class MyTest7 {
    public static void main(String[] args) throws UnknownHostException {
        //获得本机ip
        InetAddress ip= InetAddress.getLocalHost();
        System.out.println(ip);
        //获得本机ip地址
        String hostAddress = ip.getHostAddress();
        System.out.println(hostAddress);
        //获得本机主机名
        String hostName = ip.getHostName();
        System.out.println(hostName);
    }
}
public class MyTest7 {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress name = InetAddress.getByName("www.jd.com");
        //获得IP地址
        String hostAddress = name.getHostAddress();
        //获得域名
        String hostName = name.getHostName();
        
        System.out.println(hostAddress);
        System.out.println(hostName);
    }
}


端口测试:


public class MyTest7 {
    public static void main(String[] args) throws UnknownHostException {
        InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8082);
        String hostName = socketAddress.getHostName();
        System.out.println(hostName);
//或的端口名
        int port = socketAddress.getPort();
        System.out.println(port);


    }
}

URL测试:

URL类有多种形式的构造函数:
(1) URL ( String url)
  //url代表一个绝对地址,URL对象直接指向这个资源,如:
  URL urll=new URL(http://www.cqwu.edu.cn);

(2) URL ( URL baseURL , String relativeURL)
 // 其中,baseURL代表绝对地址,relativeURL代表相对地址。如:
  URL urll=new URL(http://www.cqwu.edu.cn);
  URL lib=new URL(urll , “library / library.asp”);

(3) URL ( String protocol , String host , String file)
  //其中,protocol代表通信协议,host代表主机名,file代表文件名。如:
  new URL (“http” , www.cqwu.edu.cn, “/ test / test.asp”);

(4) URL ( String protocol , String host , int port , String file)
  URL lib = new URL (“http” , www.cqwu.edu.cn, 80 , “/ test / test.asp”);

2、获取URL对象的属性
  getDefaultPort(): 返回默认的端口号。
  getFile(): 获得URL指定资源的完整文件名。
  getHost(): 返回主机名。
  getPath(): 返回指定资源的文件目录和文件名。
  getPort(): 返回端口号,默认为-1。
  getProtocol(): 返回表示URL中协议的字符串对象。
  getRef(): 返回URL中的HTML文档标记,即#号标记。
  getUserInfo: 返回用户信息。
  toString: 返回完整的URL字符串。

UDP编程:

1.UDP网络通信
①类 DatagramSocket 和 DatagramPacket 实现了基于UDP协议的网络程序。
②UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不确定什么时候可以抵达。
③DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
④UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的链接。
2.UDP网络通信流程:
①DatagramSocket 和 DatagramPacket。
②建立发送端,接收端。
③建立数据包。
④调用 Scoket 的发送、接收方法。
⑤关闭 Scoket。
3.发送端与接收端是两个独立的运行程序。

接收方:

public class peopleOne {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(5051);
        byte[] receiveBuf = new byte[1024];

        DatagramPacket packet = new DatagramPacket(receiveBuf, receiveBuf.length);
        System.out.println("等你包裹来");
        while (true){
            socket.receive(packet);
            String s = new String(packet.getData(),0, packet.getLength());
            System.out.println("你收到消息:  "+s);
            if ("886".equals(s)){
                break;
            }
        }
socket.close();
    }
}

发送方

public class peopleTwo {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port=5051;
        byte[] sendBuf = new byte[1024];
        Scanner sc =null;
        while (true){
            sc= new Scanner(System.in);
            System.out.println("请输入你要发的内容");
           String s= sc.next();
           sendBuf=s.getBytes();
            DatagramPacket packet = new DatagramPacket(sendBuf, 0, sendBuf.length,address,port);

            socket.send(packet);
            if ("886".equals(sc.nextLine())){
                break;
            }
        }
        socket.close();
    }
}

TCP编程:

以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:
①服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
②服务器调用 ServerSocket 类 的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
③服务器正在等待时,一个客户端实例化一个Socket对象,指定服务器名称和端口号来请求连接。
④Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
⑤在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
⑥连接建立后,通过使用I/O流在进行通信。每一个 socket 都有一个输出流和一个输入流。客户端的输出流连接到服务器端的输入流,而客户端的输入 流连接到服务器端的输出流。

服务器

public class TestServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(6060);
        System.out.println("开启了服务器");
        while (true){
            Socket accept = serverSocket.accept();
            System.out.println("连入了一个用户");
            DataInputStream dis = new DataInputStream(accept.getInputStream());
            System.out.println(dis.readUTF());
            if ("886".equals(dis.readUTF())){
                System.out.println("结束了连接");
                break;
            }

        }
    }
}

客户端

public class TestClient {
    public static void main(String[] args) throws IOException {
while (true){
    Socket socket = new Socket("127.0.0.1", 6060);
    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入");
    String string = sc.nextLine();
    dos.writeUTF(string);
    if ("886".equals(string)){
        break;
    }
}


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值