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 String DEBUG_TAG = "Activity";
- private String ipaddress;
- private int port ; //服务器IP、端口
- private Thread mThread = null;
- private Socket mSocket = null;
- private Button mButton_In = null;
- private Button mButton_Send= null;
- private EditText mEditText01 = null;
- private EditText mEditText02 = null;
- private BufferedReader mBufferedReader = 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 Socket mSocket;
- private BufferedReader mBufferedReader;
- private PrintWriter mPrintWriter;
- private String mStrMSG;
- 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 block
- e.printStackTrace();
- }
- // }
- }
- /**
- * 发送消息给所有客户端
- */
- private void sendMessage() throws IOException
- {
- System.out.println(mStrMSG);
- for (Socket client : mClientList)
- {
- mPrintWriter = new PrintWriter(client.getOutputStream(), true);
- mPrintWriter.println(mStrMSG);
- }
- }
- }
- }