快捷搜索:  汽车  科技

java的socket编程基础(Java网络编程之Socket)

java的socket编程基础(Java网络编程之Socket)在一些程序中,程序既有客户端功能也有服务器端功能,最常见的软件就是BT、emule这类软件了。 连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。 现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。 在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client),等待其他程序连接的程序被称作服务器(Server)。客户端程序可以在需要的时候启动,而服务器为了能够时刻相应连接,则需要一直启动。例如以打电话为例,首先拨号的人类似于客户端,接听电话的人必须保持电话畅通类似于服务器。

Java网络编程之SOCKET

一、课程目标

网络模型

TCP协议与UDP协议区别

Http协议底层实现原理。

二、什么是网络模型

网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。

现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。

在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client),等待其他程序连接的程序被称作服务器(Server)。客户端程序可以在需要的时候启动,而服务器为了能够时刻相应连接,则需要一直启动。例如以打电话为例,首先拨号的人类似于客户端,接听电话的人必须保持电话畅通类似于服务器。

连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。

在一些程序中,程序既有客户端功能也有服务器端功能,最常见的软件就是BT、emule这类软件了。

四、Socket入门

4.1、什么是Socket?

Socket就是为网络服务提供的一种机制。

通讯的两端都有Sokcet

网络通讯其实就是Sokcet间的通讯

数据在两个Sokcet间通过IO传输。

4.2、TCP与UDP在概念上的区别:

udp: a、是面向无连接 将数据及源的封装成数据包中 不需要建立建立连接

b、每个数据报的大小在限制64k内

c、因无连接 是不可靠协议

d、不需要建立连接 速度快

tcp: a、建议连接,形成传输数据的通道.

b、在连接中进行大数据量传输,以字节流方式

c 通过三次握手完成连接 是可靠协议

d 必须建立连接m效率会稍低

4.3、UDP协议

通过UDP协议实现课程案例,客户端与服务器端进行传输

4.3.1 UDP服务器端代码

class UdpServer { public static void main(String[] args) throws IOException { System.out.println("udp接受数据启动......."); DatagramSocket ds = new DatagramSocket(8080); byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf buf.length); // 阻塞效果 ds.receive(dp); System.out.println("来源:" dp.getAddress().getHostAddress() " port:" dp.getPort()); String str = new String(dp.getData() 0 dp.getLength()); System.out.println("客户端发送数据:" str); ds.close(); } }

4.3.2 UDP客户端代码

public class UdpClient { public static void main(String[] args) throws IOException { System.out.println("udp 发送数据"); DatagramSocket ds = new DatagramSocket(); String str = "客户端发送数据...."; byte[] strByte = str.getBytes(); DatagramPacket dp = new DatagramPacket(strByte strByte.length InetAddress.getByName("192.168.1.3") 8080); ds.send(dp); ds.close(); } }

4.3、TCP协议

4.3.3 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),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据,

java的socket编程基础(Java网络编程之Socket)(1)

四次分手:

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。

(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。

(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

java的socket编程基础(Java网络编程之Socket)(2)

1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在 一个报文里来发送。

但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以 未必会马上会关闭SOCKET 也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报 文和FIN报文多数情况下都是分开发送的.

2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

4.3.1 服务器端代码

public class TcpServer { public static void main(String[] args) throws IOException { System.out.println("socket服务器端启动...."); ServerSocket serverSocket = new ServerSocket(8080); //获取客户端对象 Socket accept = serverSocket.accept(); InputStream inputStream = accept.getInputStream(); byte[] buf= new byte[1024]; int len=inputStream.read(buf); String str =new String(buf 0 len); System.out.println("str:" str); serverSocket.close(); } }

4.3.2 客户端代码

System.out.println("socket启动...."); Socket s = new Socket("192.168.1.3" 8080); OutputStream outputStream = s.getOutputStream(); outputStream.write("我是客戶端....".getBytes()); s.close();

猜您喜欢: