java开发之网络编程

java开发之网络编程

1.网络编程
网络编程本质意义是两个设备之间的数据交换,在计算机网络中,设备指的是计算机。
网络编程基本上是基于请求/响应方式的,也就是一个设备发送请求数据给另一个,然后接收另一个设备的反馈。
在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称为客户端(client),等待程序连接的的程序称为服务端(server)
客户端可以在需要的时候启动,而服务器能够时刻响应连接,则需要一直连接。
2.IP地址和域名
在网络中需要知道一个设备的位置,则需要使用该设备的IP地址
IP地址是一个规定,现在使用的是IPv4,由4个0-255之间的数字组成,在计算机内部存储时只需要4个字节即可,在计算机中,IP地址是分配个网卡的,每个网卡都有一个唯一的IP地址
如果计算机有多个网卡,则该台计算机则拥有多个不同的IP地址,在同一网络内部,IP地址不能相同。
由于IP地址不方便记忆,所以创造了域名的概念,也就是给IP地址取一个字符的名字。
在网络中,只能使用IP地址进行数据传输,所以在传输之前,需要把域名转换为IP,这个由DNS服务器完成。
3.端口
为了在一台设备上可以运行多个程序,设计了端口(port),规定一个设备有216个,也就是65536个端口,每个端口对应一个唯一的程序,每个网络程序,无论是客户端还是服务端,都对应一个或多个特定的端口号
由0-1024之间组成,使用端口号可以找到一台设备上唯一的一个程序,如果需要和某台计算机简历连接,只需要知道IP地址或域名即可
但是如果想知道该台计算机上的某个程序交换数据,还必须知道该程序使用的端口号。
4.Socket
socket是为网络服务提供的一种机制,通讯两端都有socket,网络通讯是socket之间通讯,数据在两个socket之间通过IO传输。
5.TCP和UDP的区别
UDP
面向无连接,将数据及源的封装到数据包中,不需要建立连接
每个数据报的大小限制在64k内
因无连接,是不可靠协议
需要建立连接,速度快
TCP
建立连接,形成传输数据的通道
在连接中进行大量数据传输,以字节流形式
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
6.TCP握手协议
在TCP/IP协议中,TCP协议采用三次握手建立一个连接
第一次握手:建立连接时,客户端发送SYN包(SYN=J)到服务器,并进入SYN_SEND状态,等待服务器确认。
第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=j+1),同时自己发送一个SYN包(SYN=K),即SYN+ACK包,此时服务器为V状态。
第三次握手:客户端收到服务器的SYN+ACK包向服务器发送确认包ACK(ACK=K+1),此包发送完毕,客户端和服务器进入ESTABISHED状态,完成三次握手
7.TCP四次分手协议
由于TCP 连接是全双工的,因此每个方向都必须单独进行关闭,这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接
收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接再收到一个FIN后仍能发送数据,首先进行关闭的一个方向将执行主动关闭,而另一方执行被动关闭。
第一次:客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送
第二次:服务器B收到这个FIN,发回一个ACK,确定序号为收到的序号加1,和 SYN相同,一个FIN将占用一个序号
第三次:服务器B关闭与客户端A的连接,发送一个FIN个客户端A
第四次:客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
8.UDP开发
1)UDP服务端

public class UdpSocketServer{
    public static void main(String [] args)throws Exception{
        //创建socket服务,指定端口
        DatagramSocket d=new DatagramSocket(8080);  
        //定义接收数据格式
        byte[] b=new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(b, b.length);
        d.receive(datagramPacket); 
        //获取IP地址
        String ip = datagramPacket.getAddress().getHostAddress();
        //获取端口号
        int port = datagramPacket.getPort();
        //获取数据
        String str=new String(datagramPacket.getData(),0,datagramPacket.getLength());
        //关闭连接
        d.close();
        }
}

2)UDP客户端

public class UdpSocketClient{
    public static void main(String [] args){
        //建立socket服务
        DatagramSocket datagramSocket = new DatagramSocket(); 
        //明确要发送的数据
        String str="UDP发送消息···"; 
        byte[] bytes = str.getBytes(); 
        //通过socket服务将数据发送出去
        InetAddress serverIp = InetAddress.getByName("127.0.0.1");
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length,serverIp,8080);
        datagramSocket.send(datagramPacket); 
        //关闭连接 
        d.close();

}

}

9.TCP开发
1).TCP服务端

public class TcpSocketServer{
    public static void main(String[] args) throws IOException {
        System.out.println("服务端启动成功....");
        //1.创建socket服务端
        ServerSocket socket= new ServerSocket(8080);
        //2.获取与客户端进行连接
        Socket accept = socket.accept();
        String ip = accept.getInetAddress().getHostAddress();
        System.out.println(ip);
        InputStream inputStream = accept.getInputStream();
        byte[] b=new byte[1024];
        int len = inputStream.read(b);
        String str = new String(b,0,len);
        System.out.println(str);
        accept.close();
        socket.close();
    }

}

2).TCP客户端

public class TcpSocketClient{
    public static void main(String[] args) throws UnknownHostException, IOException {
        System.out.println("客户端发送数据....");
        //1.建立连接
        Socket socket = new Socket("127.0.0.1",8080);
        //2.获取socket流中的输出流,将数据发送给服务端
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("TCP发送消息。。。。".getBytes());
        socket.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值