TCP UDP、Socket

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013933272/article/details/53841998

回过头来看到自己写的东西真是太糟糕了,刚开始的初衷是希望能够写一些有用的文章,不管是自己偶尔看看或者是别的朋友不经意间看到,都能或多或少有点收获,可是现在看来,学艺也不精,理解也不深,就写了很多没用的东西,从头看到尾满满的水分。。。学无止尽,共勉。
2017/01/17


TCP UDP

TCP(Transmission Control Protocol 传输控制协议)

优点在于信息传输的稳定性、可靠性,传输前进行三次握手确定连接;
缺点在于效率相对较低,且头部较大。

UDP(User Data Protocol,用户数据报协议)

传输数据时大小被限定在64KB之内;
优点在于传输速度较快,指定地址和端口号就能直接传输数据;
缺点在于传输前没有连接确认,有可能会出现丢包的现象。

TCP和UDP都是传输层的协议,区别在传输前是否需要进行连接,可以把TCP和UDP分别理解成电话和短信。TCP(电话)在数据传输前要先建立通信,一方发起通信,另一方进行确认,确认通信成功后才能进行数据传输,传输完成后再断开连接,所以数据的传输时稳定可靠的,但是建立通信会降低一定的效率;而UDP(短信)相对来说比较快,不需要建立连接就能直接发送数据,只需要指定一个接收方,但是相对而言也不能确认对方是否收到数据。


Socket

先展示一段简单的C/S的socket通信代码
服务端核心代码
try{
    ServerSocket serverSocket = new ServerSocket(8888);
    Socket socket = serverSocket.accept();
    InputStream inputStream = socket.getInputStream();
    // 将字节流转为字符流
    InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    String temp; 
    while((temp = bufferedReader.readLine()) != null){
        System.out.println(temp);
    }
    bufferedReader.close();
    inputStream.close();
} catch (Exception e){
    e.printStackTrace();
}
客户端核心代码
try{
    String str = "Hello,Server";
    Socket socket =new Socket("192.168.64.39",8888);
    OutputStream outputStream = socket.getOutputStream();
    byte[] b = str.getBytes();
    outputStream.write(b);
    outputStream.flush();
    outputStream.close();
} catch (Exception e){
    e.printStackTrace();
}

Socket是对TCP/IP进行封装后的变成接口,通过它可以实现两台设备的通信。Socket都是成对出现的,描述了要连接的IP、端口对,即知道对方的IP以及端口就可以给对方发送消息。
单向的socket通信过程:
1)服务端利用Socket监听端口;
2)客户端发起连接;
3)客户端向服务端发送数据;
4)客户端,服务端断开连接。

java中的Socket类有两个方法isConnected()和isClosed(),在使用的时候有几点需要注意的。
isConnect()返回的不是socket当前是否连接的状态,而是曾经是否建立过连接。
isClosed()返回的是socket当前是否已经关闭连接的状态,连接中的socket调用close()方法、关闭输入输出流、断网都会导致连接中的socket状态改变。

在阅读源码的时候发现不同的JDK对Socket.close()的处理是不一样的,需要注意

java\net\Socket.java(android-23)

public synchronized void close() throws IOException {
    isClosed = true;
    isConnected = false;
    // RI compatibility: the RI returns the any address (but the original local port) after
    // close.
    localAddress = Inet6Address.ANY;
    impl.close();
    }
java\net\Socket.java(java-1.8)

public synchronized void close() throws IOException {
    synchronized(closeLock) {
    if (isClosed())
        return;
    if (created)
        impl.close();
    closed = true;
    }
}

也就是说AndroidSDK下的java代码中,调用socket.close()再调用socket.isConnected(),返回值为false。

展开阅读全文

没有更多推荐了,返回首页