java中的网络通信编程之TCP篇
java中的网络通信编程分为两种,1、TCP(传输控制协议)方式。2、UDP(用户数据报协议)方式。
1、TCP(传输控制协议)方式
使用这种网络通信方式的时候,需要建立专门的虚拟连接,然后才能进行可靠的数据传输,如果数据传输失败,则客户端会自动重发该数据。
2、UDP(用户数据报协议)方式。
这种方式就像是手机之间发送短信,无需建立专门的链接,但是传输也是不可靠的,如果短信发送失败的话,则服务端是收不到数据的。
这两种方式都是经常用到的,重要的数据一般都是采用tcp的方式来进行传输,大量的非重要数据可以采用udp的方式来进行传输,由于tcp需要建立连接并以及确认传输是否正确,所以它比udp要多花费一些时间,而且传输时,产生的数据量要比udp方式要大一些。
总结一些tcp和udp的区别
UDP是一种不可靠的传输协议,它不能保证每次传输的数据包都是按次序到达的。
TCP是一种可靠的传输协议,它确保接受方完全正确的接收了发送方发送的所有数据。
UDP传输数据的时候有大小限制,每个数据报大小不能超过64KB。
TCP则没有限制,它们在socket之间按照统一的格式,传多少都没问题。
UDP不需要建立连接就可以传输数据,因为它所传输的数据报中都已经包含接收方完整的地址
TCP则不然,它必须建立链接,在socket之间传输必须要建立连接,所有它比UDP多了一个建立连接的时间。
UDP操作简单,TCP生命力强。
客户端网络编程
1、建立连接
建立连接的时候需要指定连接到服务器的ip地址和端口号,建立完成后就会形成一条虚拟连接,后面的交换数据就会通过这条连接来进行。
2、交换数据
交换连接的时候严格按照请求的响应模型,客户端将请求数据发送给服务端,服务端根据请求的数据作出相应的响应,将数据按照相应模型反馈给客户端。
3、关闭连接
当数据交换完成后,就会断开连接,释放端口、内存等资源。
步骤2可以根据业务逻辑的需要,重复进行。
服务端网络编程
1、监听端口
服务端所要做的就是监听本地的某个端口,这个端口就是服务端开放给客户端的端口。
2、获取连接
当服务端连接到服务端的时候,就会获取一个连接,连接中包含客户端的ip地址等信息,交换数据的时候就是通过此链接进行交换数据。每一个连接都是由一个专门的线程独立处理该连接。
3、交换数据
服务端的交换数据的过程和客户端的不同,服务端是先接受来自客户端的数据,在进行相应的逻辑处理后,将得到的数据发送给客户端。
4、关闭连接
交换完成后,就会关闭这个连接,同时释放其所监听的端口、内存等资源。
举例说明:
客户端
1) 建立Socket连接
Socket socket1 = new Socket(“http://blog.csdn.net/jessonlv”,80);
2)按照“请求-响应”模型进行网络数据交换
在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可。示例代码如下:
OutputStream os = socket1.getOutputStream(); //获得输出流
InputStream is = socket1.getInputStream(); //获得输入流
这里获得的只是最基本的输出流和输入流对象,还可以根据前面学习到的IO知识,使用流的嵌套将这些获得到的基本流对象转换成需要的装饰流对象,从而方便数据的操作。
3)关闭网络连接
socket1.close();
public class Constants { public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null; OutputStream os = null; InputStream is = null; // 监听端口号 int port = 10000; try { // 建立连接 serverSocket = new ServerSocket(port); // 获得连接 socket = serverSocket.accept(); // 接收客户端发送内容 is = socket.getInputStream(); byte[] b = new byte[1024]; int n = is.read(b); // 输出 System.out.println("客户端发送内容为:" + new String(b, 0, n)); // 向客户端发送反馈内容 os = socket.getOutputStream(); os.write(b, 0, n); } catch (Exception e) { e.printStackTrace(); } finally { try { // 关闭流和连接 os.close(); is.close(); socket.close(); serverSocket.close(); } catch (Exception e) { } } } }