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
- 好样的,加油