网络编程——TCP编程及UDP编程

1.概述

java是一种位于Internet上的语言,从语言级上提供了对网络应用程序的支持。且java实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境

1.1计算机网络

学习网络编程,首先要了解计算及网络的意义,计算机网络指的是将位于不同地域具有独立功能的算机,通过通信方式及线程连接起来,由功能完善的的软件来实现资源共享以及信息连接的一种系统。

1.2网络编程的目的

通过网络协议(TCP及UDP)实现资源共享及信息连接

2.核心要素

两个端口:服务器端(ServerSocker);客户端( Socket)

如何精确找到网络中的某台计算机:IP+端口

找到计算机后如何高效可靠的传输数据:通信协议(UDP及TCP)

3.TCP编程

首先需要两个端口,服务器端及客户端

服务器端:通过ServerSocket类创建一个服务端对象,调用accept()实现监听功能

写入数据时有两种方法,可以通过创建OutputStream对象,调用write()方法;

或者通过处理流创建OutputStream对象后,将此对象作为参数,传入到DataOUtputstream对象中,通过DataOUtputstream对象写入服务端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ServeDome1 {
    //服务器端
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket=new ServerSocket(9999);
        System.out.println("服务器启动,等待连接");
        Socket socket=serverSocket.accept();//监听,如果监听到有客户顿发送链接需求,就会获得相应的客户端Socket
        System.out.println("连接成功");
        Scanner scanner=new Scanner(System.in);
        InputStream in=socket.getInputStream();
        DataInputStream din=new DataInputStream(in);
    //满足服务端反馈客户端消息的需要
        OutputStream out=socket.getOutputStream();
        DataOutputStream dout=new DataOutputStream(out);
    //也可以使用节点流方式 OutputStream out=socket.getOutputStream();
        while(true){
            String msg=din.readUTF();
            System.out.println("来自客户端的消息"+msg);
            System.out.println("返回客户端的消息");
            String msg1=scanner.nextLine();
            dout.writeUTF(msg1);
        }
    }
}

客户端 :通过创建Socket对象发送连接请求,注意参数列表中要传入连接对象的IP地址及窗口

import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class ServeDome2 {
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("127.0.0.1",9999);
        Scanner scanner=new Scanner(System.in);
        InputStream in=socket.getInputStream();
        DataInputStream din=new DataInputStream(in);
        OutputStream out=socket.getOutputStream();
        DataOutputStream dout=new DataOutputStream(out);
        while (true) {
            System.out.println("客户输入");
            String msg=scanner.nextLine();
            dout.writeUTF(msg);
            String msg1=din.readUTF();
            System.out.println("来自服务器的消息"+msg1);
        }
    }
}

4.UDP编程

同样需要两个端口;

服务器端:创建DatagrameSocket对象,且必须含有客户端的端口;建立一个byte数组,将数组,以及数组长度作为参数到DatagramPacket对象中,调用DatagrameSocket类中的recieve方法,接收数据到DatagramPacket对象中的数组中去,最终通过String类的构造器以UTF-8的译码格式转换为字符串

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Server {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket=new DatagramSocket(9999);
        byte[]b=new byte[1024];
        while(true){
            DatagramPacket dp=new DatagramPacket(b,b.length);
            datagramSocket.receive(dp);
            String msg=new String(b,0,dp.getLength(),"UTF-8");
            System.out.println(msg);
        }
    }
}

客户端 :首先创建DatagramSocket对象,然后创建byte数组,通过字符串中的getBytes()方法以UTF-8的格式转换为字节存入byte数组中,再创建DatagramPacket对象,将连接对象的IP地址及端口和数组及数组长度作为参数传入,再通过DategramSocket类中的sent方法,将DatagramPacket对象作为参数传入,进行发送

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.*;
public class Client {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket=new DatagramSocket();
        while (true){
            byte[]b="你好服务器".getBytes("UTF-8");
            //将发送的数据以UTF-8的译码格式转换为字节
            DatagramPacket datagramPacket=new DatagramPacket(b,b.length, InetAddress.getByName("127.0.0.1"),9999);
            //将发送的数据存储到byte数组中
            datagramSocket.send(datagramPacket);
        }
    }
}

5.TCP及UDP编程的区别

UDP是一个面向无连接的协议,通过UDP协议发送的数据报,只管发送,无法保证一定可以安全送到目的地,也无法保证何时可以送达;且客户端与服务端断开连接后无法检测到

TCP是一个面向连接的协议,通过TCP协议发送的数据,必须建立可靠的连接,在客户端断开时,服务端会发生异常,提示断开连接,即就是可以检测到连接是否断开

你可能感兴趣的:(tcp/ip,udp,网络,java)