日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

android 全局 socket,学习Android socket通信之如何解决中文乱码

發(fā)布時(shí)間:2024/8/5 Android 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 全局 socket,学习Android socket通信之如何解决中文乱码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

socket是網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱為一個(gè)socket。socket通常也稱作"套接字",用于描述IP地址和端口,是一個(gè)通信鏈的句柄,可以用來(lái)實(shí)現(xiàn)不同虛擬機(jī)或不同計(jì)算機(jī)之間的通信。在Internet上的主機(jī)一般運(yùn)行了多個(gè)服務(wù)軟件,同時(shí)提供幾種服務(wù)。

客戶軟件將插頭插到不同編號(hào)的插座,就可以得到不同的服務(wù)最重要的是,Socket是面向客戶/服務(wù)器模型而設(shè)計(jì)的,針對(duì)客戶和服務(wù)器程序提供不同的Socket系統(tǒng)調(diào)用。客戶隨機(jī)申請(qǐng)一個(gè)Socket,系統(tǒng)為之分配一個(gè)Socket號(hào);服務(wù)器擁有全局公認(rèn)的Socket,任何客戶都可以向它發(fā)出連接請(qǐng)求和信息請(qǐng)求。Socket利用客戶/服務(wù)器模式巧妙地解決了進(jìn)程之間建立通信連接的問(wèn)題。服務(wù)器Socket半相關(guān)為全局所公認(rèn)非常重要。

目前想讓手機(jī)客戶端和服務(wù)器保持長(zhǎng)連接故選擇socket進(jìn)行通信

首先是新建一個(gè)socket服務(wù)器端

package com.wpndemo.socket;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* TODO

* @author cuiran

* @version TODO

*/

public class Main {

private static final int PORT = 8090;

private List mList = new ArrayList();

private ServerSocket server = null;

private ExecutorService mExecutorService = null; //thread pool

public static final String bm="utf-8"; //全局定義,以適應(yīng)系統(tǒng)其他部分

public static void main(String[] args) {

new Main();

}

public Main() {

try {

server = new ServerSocket(PORT);

mExecutorService = Executors.newCachedThreadPool(); //create a thread pool

System.out.print("server start ...");

Socket client = null;

while(true) {

client = server.accept();

mList.add(client);

mExecutorService.execute(new Service(client)); //start a new thread to handle the connection

}

}catch (Exception e) {

e.printStackTrace();

}

}

class Service implements Runnable {

private Socket socket;

private BufferedReader in = null;

private String msg = "";

public Service(Socket socket) {

this.socket = socket;

try {

in = new BufferedReader(new InputStreamReader(socket.getInputStream(),bm));

msg = "user" +this.socket.getInetAddress() + "come toal:"

+mList.size();

this.sendmsg();

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void run() {

// TODO Auto-generated method stub

try {

while(true) {

if((msg = in.readLine())!= null) {

if(msg.equals("exit")) {

System.out.println("ssssssss");

mList.remove(socket);

in.close();

msg = "user:" + socket.getInetAddress()

+ "exit total:" + mList.size();

socket.close();

this.sendmsg();

break;

} else {

System.out.println("msg="+msg);

msg = socket.getInetAddress() + ":" + msg;

this.sendmsg();

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

public void sendmsg() {

System.out.println(msg);

int num =mList.size();

for (int index = 0; index < num; index ++) {

Socket mSocket = mList.get(index);

PrintWriter pout = null;

try {

pout = new PrintWriter(new BufferedWriter(

new OutputStreamWriter(mSocket.getOutputStream(),bm)),true);

pout.println(msg);

}catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

然后是新建一個(gè)Android工程:

在文件【AndroidManifest.XML】添加內(nèi)容:

然后是創(chuàng)建類:

package com.cayden.socket;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.io.UnsupportedEncodingException;

import java.net.Socket;

import com.cayden.util.Conf;

import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

public class SocketActivity extends Activity implements Runnable {

private TextView tv_msg = null;

private EditText ed_msg = null;

private Button btn_send = null;

// private Button btn_login = null;

private static final String HOST = "219.143.49.189";

private static final int PORT = 8403;

private Socket socket = null;

private BufferedReader in = null;

private PrintWriter out = null;

private String content = "";

public static final String bm="utf-8"; //全局定義,以適應(yīng)系統(tǒng)其他部分

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

tv_msg = (TextView) findViewById(R.id.TextView);

ed_msg = (EditText) findViewById(R.id.EditText01);

// btn_login = (Button) findViewById(R.id.Button01);

btn_send = (Button) findViewById(R.id.sendBtn);

try {

socket = new Socket(HOST, PORT);

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(

socket.getOutputStream(),bm)), true);

Log.i(Conf.TAG, "連接成功");

} catch (IOException ex) {

ex.printStackTrace();

Log.i(Conf.TAG, "出現(xiàn)異常:"+ex.getMessage());

ShowDialog("login exception" + ex.getMessage());

}

btn_send.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

String msg = ed_msg.getText().toString();

if (socket.isConnected()) {

if (!socket.isOutputShutdown()) {

try {

out.println(msg);

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

});

new Thread(SocketActivity.this).start();

}

public void ShowDialog(String msg) {

new AlertDialog.Builder(this).setTitle("notification").setMessage(msg)

.setPositiveButton("ok", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

}

}).show();

}

@Override

public void run() {

// TODO Auto-generated method stub

try {

while (true) {

if (socket.isConnected()) {

if (!socket.isInputShutdown()) {

if ((content = in.readLine()) != null) {

content += "\n";

mHandler.sendMessage(mHandler.obtainMessage());

} else {

}

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

public Handler mHandler = new Handler() {

public void handleMessage(Message msg) {

super.handleMessage(msg);

tv_msg.setText(tv_msg.getText().toString() + content);

}

};

}

通過(guò)上文可以知道要實(shí)現(xiàn)手機(jī)客戶端和服務(wù)器保持長(zhǎng)連接需要選擇socket通信,整個(gè)流程下來(lái)首先要做的是新建一個(gè)socket服務(wù)器端,再新建一個(gè)android工程,最后創(chuàng)建一個(gè)類。在后續(xù)中會(huì)增加采用mina框架來(lái)實(shí)現(xiàn)通信。

總結(jié)

以上是生活随笔為你收集整理的android 全局 socket,学习Android socket通信之如何解决中文乱码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。