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