Socket實現通訊,實時接收資料以及傳送資料
阿新 • • 發佈:2018-12-30
公司要做一個視訊採集socket通訊的專案,第三方服務端已經提供好了服務,讓我們對接,但是目前ui還沒有,所以就暫時先自己寫個小demo測試一下資料連線。
* 先看下佈局吧,很直觀。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="socket.hdsx.com.socketdemo.MainActivity">
<EditText
android:id="@+id/port"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="埠號"
android:text="5500" />
<Button
android:id="@+id/btn_connect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/port"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:text="建立連線!" />
<Button
android:id="@+id/btn_receiver"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_connect"
android:layout_centerHorizontal="true"
android:text="接收資料!" />
<Button
android:id="@+id/btn_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_receiver"
android:layout_centerHorizontal="true"
android:text="傳送資料!" />
<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_send"
android:layout_centerHorizontal="true"
android:text="斷開連線!" />
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:gravity="center"
android:text=""
android:textSize="16sp" />
</RelativeLayout>
```
就是自己手動輸入埠號,手動的ip沒有寫,第三方直接給的固定的。
* 容我先建立Socket連線再說
```
/*
建立連線
*/
case R.id.btn_connect:
tv_content.setText("");
String port = this.port.getText().toString();
if (!"".equals(port)) {
intPort = Integer.parseInt(port);
} else {
Toast.makeText(MainActivity.this, "輸入埠號", Toast.LENGTH_SHORT).show();
return;
}
mThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
/*
建立請求連線
*/
socket = new Socket("192.168.43.151", intPort);
System.out.println(socket.isConnected());
runOnUiThread(new Runnable() {
@Override
public void run() {
if (socket.isConnected()) {
tv_content.setText("建立連線成功!" + intPort);
} else {
tv_content.setText("建立連線失敗!" + intPort);
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
});
break;
private ExecutorService mThreadPool;//這就是個執行緒池管理
mThreadPool = Executors.newCachedThreadPool();
```
* 通訊建立成功了, 讓我先發送個引數資料再說
```
case R.id.btn_send:
sendMessageToServer();
break;
/*
傳送資料給服務端
*/
private void sendMessageToServer() {
long l = System.currentTimeMillis();
final JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("msgType", "");
jsonObject.put("msgValue", "");
jsonObject.put("msgTime", l + "");
} catch (Exception e) {
e.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
try {
os = socket.getOutputStream();
os.write((jsonObject.toString() + "/n").getBytes("utf-8"));
// 資料的結尾加上換行符才可讓伺服器端的readline()停止阻塞
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
```
引數就是上面的, 這都很直觀的說。
傳送訊息之後,接下來就是處理返回的資料。注意這返回的資料格式很多,自行選擇解析
* 處理返回的資料
```
/*
獲取資料
*/
case R.id.btn_receiver:
tv_content.setText("");
new Thread(new Runnable() {
@Override
public void run() {
try {
is = socket.getInputStream();
// isr = new InputStreamReader(is);
// br = new BufferedReader(isr);
DataInputStream input = new DataInputStream(is);
byte[] b = new byte[1024];
int len = 0;
String response = "";
while (true) {
len = input.read(b);
response = new String(b, 0, len);
Log.e("datadadata", response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
break;
```
簡單豪爽的轉換成了string,我管你是什麼。哈哈
* 最後就是斷開連線
```
case R.id.btn_stop:
dissConnection();
break;
/*
斷開 連線
*/
private void dissConnection() {
try {
// 斷開 客戶端傳送到伺服器 的連線,即關閉輸出流物件OutputStream
os.close();
// 斷開 伺服器傳送到客戶端 的連線,即關閉輸入流讀取器物件BufferedReader
br.close();
// 最終關閉整個Socket連線
socket.close();
// 判斷客戶端和伺服器是否已經斷開連線
System.out.println(socket.isConnected());
} catch (IOException e) {
e.printStackTrace();
}
}
```
資源demo地址 :https://download.csdn.net/download/binbinxiaoz/10481505
以上就是個簡單的小demo,如果你需要可以參考參考。有關你們專案上的需求還要自己去完善,包括建立失敗之後繼續進行連線,接收到的是個流進行視訊播放阿什麼的。
* 先看下佈局吧,很直觀。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="socket.hdsx.com.socketdemo.MainActivity">
<EditText
android:id="@+id/port"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="埠號"
android:text="5500" />
<Button
android:id="@+id/btn_connect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/port"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dp"
android:text="建立連線!" />
<Button
android:id="@+id/btn_receiver"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_connect"
android:layout_centerHorizontal="true"
android:text="接收資料!" />
<Button
android:id="@+id/btn_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_receiver"
android:layout_centerHorizontal="true"
android:text="傳送資料!" />
<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_send"
android:layout_centerHorizontal="true"
android:text="斷開連線!" />
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:gravity="center"
android:text=""
android:textSize="16sp" />
</RelativeLayout>
```
就是自己手動輸入埠號,手動的ip沒有寫,第三方直接給的固定的。
* 容我先建立Socket連線再說
```
/*
建立連線
*/
case R.id.btn_connect:
tv_content.setText("");
String port = this.port.getText().toString();
if (!"".equals(port)) {
intPort = Integer.parseInt(port);
} else {
Toast.makeText(MainActivity.this, "輸入埠號", Toast.LENGTH_SHORT).show();
return;
}
mThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
/*
建立請求連線
*/
socket = new Socket("192.168.43.151", intPort);
System.out.println(socket.isConnected());
runOnUiThread(new Runnable() {
@Override
public void run() {
if (socket.isConnected()) {
tv_content.setText("建立連線成功!" + intPort);
} else {
tv_content.setText("建立連線失敗!" + intPort);
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
});
break;
private ExecutorService mThreadPool;//這就是個執行緒池管理
mThreadPool = Executors.newCachedThreadPool();
```
* 通訊建立成功了, 讓我先發送個引數資料再說
```
case R.id.btn_send:
sendMessageToServer();
break;
/*
傳送資料給服務端
*/
private void sendMessageToServer() {
long l = System.currentTimeMillis();
final JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("msgType", "");
jsonObject.put("msgValue", "");
jsonObject.put("msgTime", l + "");
} catch (Exception e) {
e.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
try {
os = socket.getOutputStream();
os.write((jsonObject.toString() + "/n").getBytes("utf-8"));
// 資料的結尾加上換行符才可讓伺服器端的readline()停止阻塞
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
```
引數就是上面的, 這都很直觀的說。
傳送訊息之後,接下來就是處理返回的資料。注意這返回的資料格式很多,自行選擇解析
* 處理返回的資料
```
/*
獲取資料
*/
case R.id.btn_receiver:
tv_content.setText("");
new Thread(new Runnable() {
@Override
public void run() {
try {
is = socket.getInputStream();
// isr = new InputStreamReader(is);
// br = new BufferedReader(isr);
DataInputStream input = new DataInputStream(is);
byte[] b = new byte[1024];
int len = 0;
String response = "";
while (true) {
len = input.read(b);
response = new String(b, 0, len);
Log.e("datadadata", response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
break;
```
簡單豪爽的轉換成了string,我管你是什麼。哈哈
* 最後就是斷開連線
```
case R.id.btn_stop:
dissConnection();
break;
/*
斷開 連線
*/
private void dissConnection() {
try {
// 斷開 客戶端傳送到伺服器 的連線,即關閉輸出流物件OutputStream
os.close();
// 斷開 伺服器傳送到客戶端 的連線,即關閉輸入流讀取器物件BufferedReader
br.close();
// 最終關閉整個Socket連線
socket.close();
// 判斷客戶端和伺服器是否已經斷開連線
System.out.println(socket.isConnected());
} catch (IOException e) {
e.printStackTrace();
}
}
```
資源demo地址 :https://download.csdn.net/download/binbinxiaoz/10481505
以上就是個簡單的小demo,如果你需要可以參考參考。有關你們專案上的需求還要自己去完善,包括建立失敗之後繼續進行連線,接收到的是個流進行視訊播放阿什麼的。