android 全局 socket,学习Android socket通信之如何解决中文乱码
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)題。
- 上一篇: 《最强祖师》山野村夫与培植奇才的抉选
- 下一篇: android sina oauth2.