Android 客戶端Socket 實現及簡單封裝。
阿新 • • 發佈:2019-01-04
Socket,客戶端實現。先下載SocketTools工具,以便測試。
第一次用,沒有寫到的,請指出。首先 建個類,然後寫方法。。。。。。調皮了。。直接來
TCP UDP 連線
public class SocketClient {
private static final Socket SOCKET=null;
private static final DataInputStream dis=null;//輸入
private static final DataOutputStream dos=null;//輸出
private Timer heartBeatTimer;
private TimerTask heartBeatTask;
private SocketClient(){}
private static SocketClient socketClient;
private static DatagramSocket socketUdp=null;
private static Socket socketTcp=null;
//獲取單例
public static SocketClient getSingle(){
if(socketClient==null){
synchronized (SocketClient.class) {//加鎖 多個程序使用
if(socketClient==null){//優化
socketClient=new SocketClient();
}
}
}
return socketClient;
}
/**
* 獲取TCP連線
* @param serverIp :服務Ip地址
* @param prot :埠號
* @param data :data 要傳送的資料
* @param call :CallBackSocket 介面
*/
public void getTCPConnect(String serverIp,int prot,String data,CallBackSocketTCP call){
//建立Socket"192.168.1.115",60000
try {
socketTcp= new Socket(serverIp,prot);
SocketUtil util=new SocketUtil(socketTcp);
util.sendData(data);
//獲取輸入流,並讀取服務端的響應資訊
boolean b=true;
while(b){
boolean ba=util.isConnect();
//把值給介面,這裡的介面作用,就是傳值的作用
call.isConnect(ba);
System.out.println("當前Soket是否連線:"+ba);
String info =util.receiveData();
//同理
call.Receive(info);
System.out.println(" 伺服器說:"+info);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* UDP連線,
* @param port 埠號
* @param data 通過UDP傳送的資料
*/
public void getUDPConnect(int port,String datas,CallBackSocketUDP call){
try {
/*
* 向伺服器端傳送資料
*/
// 1.定義伺服器的地址、埠號、資料localhost
InetAddress address = InetAddress.getByName("localhost");
// port = 8800;
byte [] data = datas.getBytes();
// 2.建立資料報,包含傳送的資料資訊
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
// 3.建立DatagramSocket物件
socketUdp = new DatagramSocket();
// 4.向伺服器端傳送資料報
socketUdp.send(packet);
boolean b=true;
while(b){
/*
* 接收伺服器端響應的資料
*/
// 1.建立資料報,用於接收伺服器端響應的資料
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
// 2.接收伺服器響應的資料
socketUdp.receive(packet2);
// 3.讀取資料
String reply = new String(data2, 0, packet2.getLength());
call.Receive(reply);//把傳送的資料交給介面
System.out.println("我是客戶端,伺服器說:" + reply);
// 4.關閉資源
}
// socketUdp.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 關閉 這裡請教一個問題。 就是我關閉不了。為了實現長連線。怎麼弄。
*/
public void closeSocket(){
if(socketUdp!=null){
socketUdp.close();
System.out.println("關閉了UDP連線");
}else if(socketTcp!=null){
try {
socketTcp.close();
System.out.println("關閉了TCP連線");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
System.out.println("沒有開啟無須關閉!!");
}
}
在這裡面。使用了兩個介面。不要忘記添加了
//TCP
public interface CallBackSocketTCP {
//這個回撥用於獲取服務端返回的資料
void Receive(String info);
//判斷是否處在連線在狀態
void isConnect(boolean state);
}
//UDP
public interface CallBackSocketUDP {
void isConnect(boolean state);//判斷狀態
void Receive(String data); //接收服務端返回的資料
}
//對了,還有一個工具類
/**
*
* @author jay chen
* Socket 工具類
*/
public class SocketUtil {
Socket socket = null;
public SocketUtil(Socket socket) {
super();
this.socket = socket;
}
//斷開連線
public void closeConnect(){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//檢測是否連線 如果斷開就重連
public boolean isConnect(){
if(socket.isClosed()){//檢測是否關閉狀態
//TODO 這個地方檢測數 是斷開,在這寫重連的方法。
return false;
}
return true;
}
//傳送資料
public void sendData(String data) throws IOException {
OutputStream outputStream = socket.getOutputStream();
outputStream.write(data.getBytes());
}
//接收資料
public String receiveData() throws IOException {
InputStream inputStream = socket.getInputStream();
// DataInputStream data=new DataInputStream(inputStream);
byte[] buf = new byte[1024];
int len = inputStream.read(buf);
String text = new String(buf, 0, len);
return text;
}
}
最後就是呼叫了。
public static void main(String[] args) {
//IP 請填寫你們的本機地址 SocketClient.getSingle().getTCPConnect("192.168.00.00", 60000,"客戶端 要傳送的data", new CallBackSocketTCP() {
// @Override
// public void Receive(String info) {
// // TODO Auto-generated method stub
// System.out.println("服務端返回的資料:"+info);
//
// }
//
// @Override
// public void isConnect(boolean state) {
// // TODO Auto-generated method stub
// if(state){
// System.out.println(state);
// }else{
// System.out.println("正在嘗試重新連線socket");
// }
// }
//
//
// });
SocketClient.getSingle().getUDPConnect(55555,"這是我要傳送的資料",new CallBackSocketUDP() {
@Override
public void isConnect(boolean state) {//連線狀態
// TODO Auto-generated method stub
System.out.println(state);
}
@Override
public void Receive(String data) {//返回的資料
// TODO Auto-generated method stub
System.out.println(data);
}
});
//關閉 socket
SocketClient.getSingle().closeSocket();
}
開啟SocketTool 開始測試吧。。