java中的网络通讯编程分为两种,一、TCP(传输控制协议)方式。二、UDP(用户数据报协议)方式。java
一、TCP(传输控制协议)方式
编程
使用这种网络通讯方式的时候,须要创建专门的虚拟链接,而后才能进行可靠的数据传输,若是数据传输失败,则客户端会自动重发该数据。服务器
二、UDP(用户数据报协议)方式。网络
这种方式就像是手机之间发送短信,无需创建专门的连接,可是传输也是不可靠的,若是短信发送失败的话,则服务端是收不到数据的。socket
这两种方式都是常常用到的,重要的数据通常都是采用tcp的方式来进行传输,大量的非重要数据能够采用udp的方式来进行传输,因为tcp须要创建链接并以及确认传输是否正确,因此它比udp要多花费一些时间,并且传输时,产生的数据量要比udp方式要大一些。tcp
总结一些tcp和udp的区别学习
UDP是一种不可靠的传输协议,它不能保证每次传输的数据包都是按次序到达的。spa
TCP是一种可靠的传输协议,它确保接受方彻底正确的接收了发送方发送的全部数据。.net
UDP传输数据的时候有大小限制,每一个数据报大小不能超过64KB。线程
TCP则没有限制,它们在socket之间按照统一的格式,传多少都没问题。
UDP不须要创建链接就能够传输数据,由于它所传输的数据报中都已经包含接收方完整的地址
TCP则否则,它必须创建连接,在socket之间传输必需要创建链接,全部它比UDP多了一个创建链接的时间。
UDP操做简单,TCP生命力强。
客户端网络编程
一、创建链接
创建链接的时候须要指定链接到服务器的ip地址和端口号,创建完成后就会造成一条虚拟链接,后面的交换数据就会经过这条链接来进行。
二、交换数据
交换链接的时候严格按照请求的响应模型,客户端将请求数据发送给服务端,服务端根据请求的数据做出相应的响应,将数据按照相应模型反馈给客户端。
三、关闭链接
当数据交换完成后,就会断开链接,释放端口、内存等资源。
步骤2能够根据业务逻辑的须要,重复进行。
服务端网络编程
一、监听端口
服务端所要作的就是监听本地的某个端口,这个端口就是服务端开放给客户端的端口。
二、获取链接
当服务端链接到服务端的时候,就会获取一个链接,链接中包含客户端的ip地址等信息,交换数据的时候就是经过此连接进行交换数据。每个链接都是由一个专门的线程独立处理该链接。
三、交换数据
服务端的交换数据的过程和客户端的不一样,服务端是先接受来自客户端的数据,在进行相应的逻辑处理后,将获得的数据发送给客户端。
四、关闭链接
交换完成后,就会关闭这个链接,同时释放其所监听的端口、内存等资源。
举例说明:
客户端
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) { } } } }