网络编程 详解

  1. 概述

计算机网络:将不同地理区域的计算机(广义)通过通信线路(光纤)连接起来,通过功能完备的软件实现数据共享,信息传递。

网络编程 :使程序借助网络在不同计算机间传输数据。

Java提供的网络类库,可以实现网络连接 ,且Java支持网络传输。

2.网络通信要素

2.1 IP

网络中的计算机通过IP地址来进行寻找主机。

局域网ip(192.168.110)

广域网ip

打开cmd,输入命令:ipconfig,回车即可查看。

2.2 端口号

与计算机上的程序相对应,每个运行中的程序会分配一个端口号,不可重复。

端口号范围是0-65535,其中 0-1024被系统占用,定义时1024-65535。

2.3 通信协议

通信双方有一些约定,如何安全可靠的传输数据,速率,传输代码,出错控制等。

传输层协议中有两个重要的协议:

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

安全、可靠;

使用前,”三次握手“,必须测试网络是否通畅;

进行通信的两个应用进程:客户端——>服务端;

传输完成,释放已建立的连接,效率低;

断开时,“四次挥手“。

三次握手详解:

(1)Cilent端发送连接请求

(2)Server端接受连接后回复Ack报文,并向此次连接分配资源

(3)Client端接收到Ack报文后向Server端发生Ack报文,这样就建立了TCP连接。

图解:

举例详解:

总结:三次握手是要确认对方收到了自己的数据。若只有两次,客户端无回应,这会浪费服务端的资源。三次握手的2个重要功能:双方做好发送数据的准备工作;允许双方协商初始序列号。

四次挥手详解:

(1)Client发送一个FIN,来关闭Client到Server的数据传送

(2)Server接收到FIN后,发送一个ACK给Client

(3)Server发送一个FIN,来关闭Server到Client的数据传送

(4)Client收到FIN后,发送ACK给Server,完成四次挥手

举例详解:

客户端


import java.io.*;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("127.0.0.1",55555);
        OutputStream out=socket.getOutputStream();//获取输出流
        DataOutputStream d=new DataOutputStream(out);
        d.writeUTF("你好服务器");

        //获取输入流对象
        InputStream in =socket.getInputStream();
        DataInputStream din=new DataInputStream(in);
        System.out.println("来自服务端的消息:"+din.readUTF());
    }
}

服务端


import java.io.*;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        //创建了一个服务器  端口为55555
        ServerSocket server=new ServerSocket(55555);
        System.out.println("服务器启动");
        Socket socket=server.accept();//监听客户端是否连接了服务器,是阻塞式的
        System.out.println("客户端连接成功"+socket);//socket就是连接到服务器的socket

        //获取输入流对象
        InputStream in=socket.getInputStream();
        DataInputStream d=new DataInputStream(in);
        System.out.println("来自客户端的信息:"+d.readUTF());

        //获取输出流对象
        OutputStream out=socket.getOutputStream();
        DataOutputStream dout=new DataOutputStream(out);
        dout.writeUTF("你好,找到客户端了!");

    }
}

运行结果:


//服务端
服务器启动
客户端连接成功Socket[addr=/127.0.0.1,port=55402,localport=55555]
来自客户端的信息:你好服务器

//客户端
来自服务端的消息:你好,找到客户端了!

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

将数据、源、目标封装在一个数据包中;因无需连接,故不安全,发送成功与否都不知道;发送数据结束时不用释放资源,速度快。


import java.io.IOException;
import java.net.*;

public class Send {
    public static void main(String[] args) throws IOException {
        //负责发送和接收信息
        DatagramSocket datagramSocket=new DatagramSocket();
        while(true){
            String s="你好,接收端";
            DatagramPacket datagramPacket=new DatagramPacket(s.getBytes(),s.getBytes().length, InetAddress.getByName("127.0.0.1"),55555);
            datagramSocket.send(datagramPacket);
        }
    }
}

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

public class Receieve {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket=new DatagramSocket(55555);
        byte[] b=new byte[1024];
            DatagramPacket datagramPacket=new DatagramPacket(b,b.length);
            datagramSocket.receive(datagramPacket);
            String s=new String(datagramPacket.getData(),0,datagramPacket.getLength());
            System.out.println(s);//你好,接收端
            datagramSocket.close();
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小谭同学ha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值