TCP UDP、Socket

来源:互联网 发布:斯太尔wt数据俯仰角 编辑:程序博客网 时间:2024/05/20 18:18

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


TCP UDP

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

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

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

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

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。

0 0
原创粉丝点击