Socket 長(zhǎng)連接 短連接 心跳 JAVA SOCKET編程
來源:程序員人生 發(fā)布時(shí)間:2014-11-28 08:50:27 閱讀次數(shù):5205次
簡(jiǎn)單解釋就是:
短連接:建立連接,發(fā)送數(shù)據(jù)包,關(guān)閉連接
長(zhǎng)連接:建立連接,發(fā)送數(shù)據(jù)包,發(fā)送心跳包,發(fā)送數(shù)據(jù)包,發(fā)送心跳包,發(fā)送心跳包。。。。。。
所以又頻繁的數(shù)據(jù)收發(fā)的話,短連接會(huì)頻繁創(chuàng)建TCP連接,而對(duì)長(zhǎng)連接,則始終用的是同1個(gè)TCP連接
package com.tree.demo.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketDemo {
private static final int PORT = 1234;
private static final int BUFFER_SIZE = 1024;
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ServerSocket ss = new ServerSocket(PORT);
Socket s = ss.accept();
System.out.println("這是服務(wù)端,監(jiān)聽本機(jī)"+PORT+"端口");
byte[] recData = null;
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
while(true) {
recData = new byte[BUFFER_SIZE];
int r = in.read(recData);
//int r = in.read(recData);
if(r>⑴) {
String data = new String(recData);
if(data.trim().equals("over")) {
s.close();
}
System.out.println("讀取到客戶端發(fā)送的來數(shù)據(jù):"+data);
out.write("這是服務(wù)端發(fā)給客戶真?zhèn)€數(shù)據(jù):".getBytes());
out.write(recData);
}else {
System.out.println("數(shù)據(jù)讀取終了!");
s.close();
System.exit(0);
//ss.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上這類服務(wù)端讀數(shù)據(jù)是阻塞式,如果客戶端沒有數(shù)據(jù)寫過來,服務(wù)端就會(huì)1直阻塞在那不動(dòng)
客戶端開啟1個(gè)telnet便可測(cè)試服務(wù)真?zhèn)€socket程序了,固然你也能夠自己寫1個(gè)socket客戶端,以下:
package socket;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientSocketDemo {
private static final String HOST = "192.168.8.14";
private static final int PORT = 1234;
public static void main(String[] args) throws UnknownHostException,
IOException {
Socket client = new Socket(HOST, PORT);
OutputStream out = client.getOutputStream();
try {
while (true) {
Thread.sleep(1000);
System.out.println("發(fā)送心跳數(shù)據(jù)包");
out.write("send heart beat data package !".getBytes());
}
} catch (Exception e) {
e.printStackTrace();
out.close();
client.close();
}
}
}
同時(shí)這要是1個(gè)心跳的實(shí)例,心跳只要不出現(xiàn)異常的情況下,可以直接使用client連接發(fā)送數(shù)據(jù)包,不需要new socket新建連接了。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)