socket使用demo

来源:互联网 发布:网络约车平台有哪几家 编辑:程序博客网 时间:2024/05/16 01:07

1、发送线程

public class SendGameStatus extends Thread {


private String IP = null;
private OutputStream outStrm = null;
private Socket ClientSocket = null;


private int Send_State = Parameter.GAME_PLAYING;
private Bitmap mBitmap;
private int Score = 0;


public SendGameStatus(String ip, int state, int score,Bitmap mBitmap) {
IP = ip;
        this.Score = score;
this.Send_State = state;
this.mBitmap = mBitmap;
}


public void run() {

try {
// 建立和服务器的连接
Log.i("sanlei","SendGameStatus--run1");
ClientSocket = new Socket(IP, Parameter.L_PORT);
// 阻塞运行
outStrm = ClientSocket.getOutputStream();


outStrm.write(Send_State);
outStrm.write(Score);


if(mBitmap != null){
byte[] bt = Util.imgBitmapByte(mBitmap);
String file_length = String.valueOf(bt.length);


outStrm.write(file_length.length());
outStrm.write(file_length.getBytes());
outStrm.write(bt);
}else{
outStrm.write(0);
}
ClientSocket.close();
outStrm.close();


} catch (Exception e) {
try {
outStrm.close();
ClientSocket.close();
} catch (Exception e1) {
// TODO Auto-generated catch block
AllLogPrintOut.debug("close socket error>>" + e.toString());
}
// TODO Auto-generated catch block
AllLogPrintOut.debug("send ip message error>>" + e.toString());
}
}



}

2、接收线程

public class ReceverGameStatus extends Thread {
private ServerSocket connection = null;
private Socket socket = null;
private InputStream instrm = null;
private Handler mHandler;
private boolean isRunning = true;
public ReceverGameStatus(Handler mhandler){

mHandler = mhandler;
}
public boolean createConnection() throws Throwable {
boolean ret = false;
try {
connection = new ServerSocket(Parameter.L_PORT);
ret = true;
} catch (IOException e2) {
// TODO Auto"Connect请求线程出错"-generated catch block
e2.printStackTrace();
throw e2;
}
return ret;
}

public void close(){

try {
if (isRunning) {
isRunning = false;
if(connection !=null && !connection.isClosed()) {
connection.close();
connection.bind(null);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void startListenSocket() {
isRunning = true;
this.start();

}


public void run() {


try {
while(isRunning){
Log.i("sanlei","ReceverGameStatus--run1");
// accept阻塞直到被连接
socket = connection.accept();


// 阻塞运行
instrm = socket.getInputStream();
int state = instrm.read();
int score = instrm.read();
int File_Length = instrm.read();

          Bitmap mBitmap = null;


          if(File_Length > 0){
             String File_length_String =FileIoOperate.getFileString(instrm, File_Length);      
             int Length = Integer.valueOf(File_length_String);
             mBitmap = Util.getUserPhotoBitmap(instrm);
          }
GameStatusItem lGameStatusItem = new GameStatusItem(score,mBitmap,state);


               //通知主线程通道中收到一个用户信息请求
  HandlerControlCeneter.sendMessageToMainThread(Parameter.GAME_STATUS,mHandler,lGameStatusItem);  

}
} catch (Exception e) {
e.printStackTrace();
AllLogPrintOut.debug("receiver ip error>>" + e.toString());
//throw new IllegalStateException(e);
} finally {
try {
if (socket != null && !socket.isClosed()) {
socket.close();
}
close();
instrm.close();//new
isRunning = false;
} catch (Exception e) {
//throw new IllegalStateException(e);
AllLogPrintOut.debug("socket close error>>" + e.toString());
}
}
Log.i("sanlei","ReceverGameStatus--run2");
}
}
3、写一个GameManager类,以便统一管理

public class GameManager {

private static GameManager mSendControl;
Handler mHandler;
private Context mContext;
private SendGameStatus mSendGameStatus;
private ReceverGameStatus mReceverGameStatus;
public static GameManager getSendControl(Handler mHandler, Context mContext){
if(mSendControl == null){
mSendControl = new GameManager(mHandler, mContext);
}
return mSendControl;
}
private GameManager(Handler mHandler, Context mContext){
this.mContext = mContext;
this.mHandler = mHandler;
mReceverGameStatus =new ReceverGameStatus(mHandler);
}

public void beginGameStatusConnectListener(){
try {
if (mReceverGameStatus.createConnection()) {
mReceverGameStatus.startListenSocket();
}
} catch (Throwable e) {
// TODO Auto-generated catch block
AllLogPrintOut.error("beginGameStatusConnectListener occure exception");
}
}


public void closeGameStatusConnectListener(){
try {
mReceverGameStatus.close();
} catch (Throwable e) {
// TODO Auto-generated catch block
AllLogPrintOut.error("closeGameStatusConnectListener occure exception");
}
}

public void sendToResgiterSendGameStatus(String ip, int state, int score,Bitmap mBitmap){


mSendGameStatus = new SendGameStatus(ip, state, score, mBitmap);
mSendGameStatus.start();
}

}
4、写一个handle类,以便子线程和主线程通讯
public class GameManagerHandler extends Handler{


public static GameManagerHandler mHandler;
private GameStatusBackAction mGameStatusBackAction;

public static GameManagerHandler getInstance(GameStatusBackAction gameStatusBackAction){
if(mHandler == null){
mHandler = new GameManagerHandler(gameStatusBackAction);
}
return mHandler;
}
private GameManagerHandler(GameStatusBackAction gameStatusBackAction){
this.mGameStatusBackAction = gameStatusBackAction;
}




@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch(msg.what){
case Parameter.GAME_STATUS:
mGameStatusBackAction.ReceiveNewOpponentGameStatus(msg.obj);
break;

}
}

5、主activity 调用socket线程

void onCreate(Bundle savedInstanceState) {
......
mHandler = GameManagerHandler.getInstance(this);
mGameManager = mGameManager.getSendControl(mHandler, this); 
receiveGameStatus();
setTimerStatus(true);
}
private void sendGameStatus(){
if(null!=mGameManager){
mGameManager.sendToResgiterSendGameStatus(mOpponentIP, mStatus, current_score, getOpponentPicture());
}
}
private void receiveGameStatus(){
if(null!=mGameManager){
mGameManager.beginGameStatusConnectListener();
}
}
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
setTimerStatus(false);
if(null!=mGameManager){
mGameManager.closeGameStatusConnectListener();
}
}
//定义timer
Handler mSendImagehandler=new Handler();
Runnable mSendImagerunnable=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
sendGameStatus();
mSendImagehandler.postDelayed(this, SEND_IMAGE_DELAY_MILLIS);
}
};
public void setTimerStatus(boolean status){
if(status){
mSendImagehandler.postDelayed(mSendImagerunnable, SEND_IMAGE_DELAY_MILLIS);
}else {
mSendImagehandler.removeCallbacks(mSendImagerunnable);
}
}
@Override
public void ReceiveNewOpponentGameStatus(Object gameStatus) {
// TODO Auto-generated method stub
L2048GameStatusItem l2048GameStatusItem = (L2048GameStatusItem)gameStatus;
mOpponentPicture.setImageBitmap(l2048GameStatusItem.getGame_Picture());
}

0 0