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) {  
            }  
        }  
    }  
}  


posted @ 2014-02-21 08:57  jessonlv  阅读(439)  评论(0编辑  收藏  举报