读书人

android与PC经过Socket通信(可实现及时

发布时间: 2012-11-19 10:18:51 作者: rapoo

android与PC通过Socket通信(可实现及时游戏的通信)

打算把单机斗地主做成网络版的。

总结了下基本的通信模块

client:

package com.SocketClient;  import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;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.KeyEvent;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;public class SocketClient extends Activity {/** Called when the activity is first created. */private final StringDEBUG_TAG= "Activity";private  String ipaddress;private  int port ;//服务器IP、端口 private Thread mThread = null;private SocketmSocket= null;private ButtonmButton_In= null;private ButtonmButton_Send= null;private EditTextmEditText01 = null;private EditTextmEditText02 = null;private BufferedReadermBufferedReader= null;private EditText            mPortEdit=null;private EditText            mIpEdit=null;private PrintWriter mPrintWriter = null;private  String mStrMSG = "";boolean connected;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        mButton_In = (Button)findViewById(R.id.Button_In);mButton_Send = (Button)findViewById(R.id.Button_Send);mEditText01=(EditText)findViewById(R.id.EditText01);mEditText02=(EditText)findViewById(R.id.EditText02);mPortEdit=(EditText)findViewById(R.id.PortEdit);mIpEdit=(EditText)findViewById(R.id.IpEdit);mButton_In.setOnClickListener(new OnClickListener(){public void onClick(View v){if(!connected){ipaddress=mIpEdit.getText().toString();        port=Integer.parseInt(mPortEdit.getText().toString());try {mSocket = new Socket(ipaddress, port);//连接服务器mBufferedReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));//取得输入、输出流mPrintWriter=new PrintWriter(mSocket.getOutputStream(), true);   mIpEdit.setEnabled(false);mPortEdit.setEnabled(false);mButton_In.setText("disConnect");connected=true;mEditText02.setEnabled(connected);mButton_Send.setEnabled(connected);}catch (Exception e) {new AlertDialog.Builder(SocketClient.this)        .setTitle("ERROR!")        .setMessage(e.toString())        .setPositiveButton        (        "确定",        new DialogInterface.OnClickListener()        {        public void onClick(DialogInterface dialoginterface,int i)        {        mIpEdit.setText("");        mPortEdit.setText("");        }        }        )        .show();Log.e(DEBUG_TAG, e.toString());}}else{connected=false;mEditText02.setText("");mButton_In.setText("Connect");mPrintWriter.print("exit"+"\n");mPrintWriter.flush();mIpEdit.setEnabled(true);mPortEdit.setEnabled(true);mEditText02.setEnabled(connected);mButton_Send.setEnabled(connected);}}});mButton_Send.setOnClickListener(new OnClickListener(){public void onClick(View v){String str = mEditText02.getText().toString() + "\n";//取得编辑框中我们输入的内容mEditText02.setText("");try {      mPrintWriter.print(str);//发送给服务器    mPrintWriter.flush();}catch (Exception e) {Log.e(DEBUG_TAG, e.toString());}}});mThread = new Thread(mRunnable);mThread.start();    }    private Runnable mRunnable= new Runnable() {public void run(){while (true){try{if ( (mStrMSG = mBufferedReader.readLine()) != null ){mStrMSG+="\n";//消息换行mHandler.sendMessage(mHandler.obtainMessage());// 发送消息}}catch (Exception e){Log.e(DEBUG_TAG, e.toString());}}}};Handler mHandler= new Handler() {  public void handleMessage(Message msg)  {  super.handleMessage(msg);  try// 刷新  {  mEditText01.append(mStrMSG);//将聊天记录添加进来  }  catch (Exception e)  {  Log.e(DEBUG_TAG, e.toString());  }  } }; public boolean onKeyDown(int keyCode,KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK) {    String str="exit"+"\n";try {      mPrintWriter.print(str);//发送给服务器    mPrintWriter.flush();}catch (Exception e) {Log.e(DEBUG_TAG, e.toString());}    this.finish(); } return true; }}


server:

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;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;public class Server{    private static final int SERVERPORT = 8888; //服务器端口    private static List<Socket> mClientList = new ArrayList<Socket>(); //客户端连接    private ExecutorService mExecutorService;  //线程池    private ServerSocket mServerSocket;  //ServerSocket对象    public static void main(String[] args){new Server();}public Server(){try{mServerSocket = new ServerSocket(SERVERPORT);//设置服务器端口mExecutorService = Executors.newCachedThreadPool();//创建一个线程池System.out.println("start...");Socket client = null;//用来临时保存客户端连接的Socket对象while (true){client = mServerSocket.accept(); //接收客户连接并添加到list中mClientList.add(client);mExecutorService.execute(new ThreadServer(client));//开启一个客户端线程}}catch (IOException e){e.printStackTrace();}}       //每个客户端单独开启一个线程static class ThreadServer implements Runnable{private SocketmSocket;private BufferedReadermBufferedReader;private PrintWritermPrintWriter;private StringmStrMSG;public ThreadServer(Socket socket) throws IOException{this.mSocket = socket;mBufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));mStrMSG = "user:"+this.mSocket.getInetAddress()+" come total:" + mClientList.size();sendMessage();}public void run(){//try//{try {while ((mStrMSG = mBufferedReader.readLine()) != null){if (mStrMSG.trim().equals("exit"))//当一个客户端退出时{mClientList.remove(mSocket);mBufferedReader.close();mPrintWriter.close();mStrMSG = "user:"+this.mSocket.getInetAddress()+" exit total:" + mClientList.size();mSocket.close();sendMessage();break;}else{mStrMSG = mSocket.getInetAddress() + ":" + mStrMSG;sendMessage();}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//}}/** * 发送消息给所有客户端 */private void sendMessage() throws IOException{System.out.println(mStrMSG);for (Socket client : mClientList){mPrintWriter = new PrintWriter(client.getOutputStream(), true);mPrintWriter.println(mStrMSG);}}}}


1楼kzw1989昨天 11:13
好样的,加油

读书人网 >Android

热点推荐