网络编程(TCP/IP,UDP,Socket,ServerSocet,DatagramSocket, DatagramPacket)

网络编程

计算机网络

把分布在不同地理区域的独立功能的计算机,通过通信设备与线路连接起来,由于功能完善的软件实现资源共享和信息传递的系统

网络编程的目的:直接或间接地通过网络通讯协议与其他计算机进行通讯。

网络编程中的两个主要问题

1.如何准确的定位网络上一台或多台主机,即IP地址。

2.找到主机后如何可靠高效的进行数据传输,即通讯协议。

ip/端口

IP(计算机)/端口号(电脑上的软件)

IP地址:InetAddress可以唯一的标识Internet上的主机

分类方式1:IPV4(16位)和IPV6(64位)

特点:不易记忆

分类方式2:公网地址和局域网地址

域名:DNS 管理全球的域名

端口号

公认端口号(0-1023)

注册端口号(1024-49151)

动态/私有端口(49152-65535)

端口号与IP地址组合得出一个网络套接字

实例:

public class Demo1 {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress inetAddress = InetAddress.getByName("www.baidu.com");
        System.out.println(inetAddress.getHostAddress());//获得主机地址
        System.out.println(inetAddress.getHostName());//获得主机名
    }
}

运行结果:

在这里插入图片描述

网络通信协议

计算机网络中实现通信必须有一些约定,即通信协议。

例如:代码结构(传输内容),传输的速度,出错控制…

传输控制协议 TCP(Transmission Control Protocol)

用户数据报协议 UDP(User Datagram Protocol)。

TCP通信特点

1.传输数据之前客户端与服务器必须建立联系,即三次握手。

(1)客户端发起请求

(2)服务器给客户端的确认回复

(3)客户端给服务器的确认回复

  1. 传输数据可靠,可以传输大量数据但效率低。

  2. 断开连接需要四次挥手。

    (1)客户端向服务器发送断开请求。

    (2)服务器向客户端发送确认信息。

    (3)服务器端向客户端发送断开请求。

    (4)客户端向服务器端发送断开确认。

UDP通信特点

将数据,数据源,目标地址封装在数据包(报)中。

无需建立连接,直接发出,每个数据包最大64kb。

因无需建立连接,不可靠,但传输速度快。

java中TCP协议实现通信

Socket 网络套接字 表示客户端 ,里面封装服务器IP,端口。

ServerSocet 表示服务器端,监听客户端的连接。

实例1:(通信方式1)

//创建服务器
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(9999);
        System.out.println("客户端请求建立连接");
        ss.accept();//阻塞式监听
        System.out.println("建立连接成功");
    }
 //创建客户端,创建时需要建立连接
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("192.168.3.105",9999);
    }

‘运行结果:

实例2:

 //创建服务器
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(9988);
        System.out.println("客户端请求建立连接");
        Socket s = ss.accept();//阻塞式监听
        System.out.println("建立连接成功");
        //接收客户端发送的信息
        InputStream is = s.getInputStream();
        byte[] b = new byte[1024];
        int length = is.read(b);//将客户端发送的消息写入到数组中
        //将byte数组转为字符串
        String str = new String(b, 0, length, "utf-8");
        System.out.println("服务器接受到的客户端信息为" + str);
    }
//创建客户端,创建时需要先建立连接
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("192.168.3.109", 9988);
        OutputStream os = s.getOutputStream();
        String str = "Hello,服务器我来了";

        os.write(str.getBytes("UTF-8"));
        os.close();
        s.close();
    }

运行结果:
在这里插入图片描述

实例3:(通信方式2)

//创建服务器
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(9988);
        Socket s = ss.accept();

        DataInputStream dis = new DataInputStream(s.getInputStream());
        String string = dis.readUTF();
        System.out.println("客户端说:"+string);

        DataOutputStream dos = new DataOutputStream(s.getOutputStream());
        Scanner input = new Scanner(System.in);
        System.out.println("请服务器端输入:");
        String  str = input.next();
        dos.writeUTF(str);
    }
//创建客户端,创建时需要建立连接
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("192.168.3.109",9988);
        //数据输出字节流
        DataOutputStream dos = new DataOutputStream(s.getOutputStream());
        Scanner input = new Scanner(System.in);
        System.out.println("请客户端输入:");
        String  str = input.next();//阻塞式的等待
        dos.writeUTF(str);

        DataInputStream dis = new DataInputStream(s.getInputStream());
        String string = dis.readUTF();
        System.out.println("服务器端说:"+string);
        dos.close();
        s.close();
    }

运行结果:

java中UDP协议实现通信

 public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(9988);
        byte[] b = new byte[1024];
        DatagramPacket dp = new DatagramPacket(b,b.length);
        ds.receive(dp);//接收数据
        String s = new String(dp.getData(),0, b.length);
        System.out.println(s);
    }
public static void main(String[] args) throws IOException {
        //发送端Socket只管发送数据
        DatagramSocket ds = new DatagramSocket();
        //封装数据报
        byte[] b = "hello,服务器".getBytes("utf-8");
        InetAddress  ia =  InetAddress.getByName("127.0.0.1");
        DatagramPacket dp =  new DatagramPacket(b, b.length,ia,9988);
        ds.send(dp);//发送数据
    }

运行结果:

注意

不论UDP实现通信还是TCP实现通信,都需要有服务器端先建立连接。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值