1. 程式人生 > >Socket 長連線 短連線 心跳 JAVA SOCKET程式設計

Socket 長連線 短連線 心跳 JAVA SOCKET程式設計

簡單解釋就是:

短連線:建立連線,傳送資料包,關閉連線

長連線:建立連線,傳送資料包,傳送心跳包,傳送資料包,傳送心跳包,傳送心跳包。。。。。。

所以又頻繁的資料收發的話,短連線會頻繁建立TCP連線,而對於長連線,則始終用的是同一個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("這是服務端,監聽本機"+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>-1) {
					String data = new String(recData);
					if(data.trim().equals("over")) {
						s.close();
					}
					System.out.println("讀取到客戶端傳送的來資料:"+data);
					out.write("這是服務端發給客戶端的資料:".getBytes());
					out.write(recData);
				}else {
					System.out.println("資料讀取完畢!");
					s.close();
					System.exit(0);
					//ss.close();
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

以上這種服務端讀資料是阻塞式,如果客戶端沒有資料寫過來,服務端就會一直阻塞在那不動

客戶端開啟一個telnet即可測試服務端的socket程式了,當然你也可以自己寫一個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("傳送心跳資料包");
				out.write("send heart beat data package !".getBytes());
			}
		} catch (Exception e) {
			e.printStackTrace();
			out.close();
			client.close();
		}
	}

}
同時這要是一個心跳的例項,心跳只要不出現異常的情況下,可以直接使用client連線傳送資料包,不需要new socket新建連線了。

accept()等待連線,該方法阻塞當前執行緒直到建立連線為止

以上服務端的網路程式只能和一個客戶端程式連線,拒絕多個客戶端的連線。

我們可以通過執行緒來解決這個問題:每當程式建立一個新的套接字連線,也就是呼叫accept方法時,將啟動一個新的執行緒來處理伺服器和客戶端的連線,而主程式將立即返回並等待下一個連線。