//服務端,這里用PC機會服務端
package com.adventure.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;
public class MySocketServer {
private static final int PORT = 9999;
private List<Socket> mList = new ArrayList<Socket>();
private ServerSocket server = null;
private ExecutorService mExecutorService = null;//線程池
public MySocketServer(){
try {
server = new ServerSocket(PORT);
mExecutorService = Executors.newCachedThreadPool();//創建一個線程pool
Socket client = null;
while(true){
client = server.accept();
mList.add(client);
mExecutorService.execute(new ChatService(client));//執行里面的線程
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
new MySocketServer();
}
class ChatService implements Runnable{
private Socket socket;
private BufferedReader in = null;
private String msg="";
public ChatService(Socket socket){
this.socket = socket;
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
while(true){
String content = "";
if((content = in.readLine()) != null){
if(content.equals("exit")){
//如果收到信息為"exit",則向客戶端返回ok,然后關掉socket,
msg = "用戶IP:"+socket.getInetAddress() + " 退出后在線用戶數量:";
this.sendmsg("ok");
mList.remove(socket);
in.close();socket.close();
System.out.println(msg+ mList.size());
break;
}
else{
//打印客戶提交過來的其它信息
msg = "客戶端IP:"+socket.getInetAddress() +" 在線用戶數量:"+mList.size()+" " + content+"-"+socket.hashCode();
System.out.println(msg);
this.sendmsg(msg);
}
}
}
} catch (Exception e) {
System.out.println("server 數據讀取異常");
e.printStackTrace();
}
}
public void sendmsg(String message){
int num = mList.size();
for(int i=0;i<num;i++){
Socket mSocket = mList.get(i);
PrintWriter pout = null;
try {
pout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream())),true);
pout.println(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
//android客戶端
package cn.client.kwok;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.Socket;
import java.util.Enumeration;
import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class Client1Activity extends Activity {
/** Called when the activity is first created. */
private EditText content;
private Button send;
private String msg = "";
private Socket socket;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
content = (EditText) findViewById(R.id.content);
send = (Button) findViewById(R.id.button);
send.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
msg = content.getText().toString();
runt();
}
});
}
private void runt(){
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
chatConnection();
}
}).start();
}
public String getLocalMacAddress() {
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
info.getIpAddress();
return info.getMacAddress();
}
public void getLocalIPAddress(){
try {
for(Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){
NetworkInterface intf = en.nextElement();
for(Enumeration<InetAddress> ipAddr = intf.getInetAddresses();ipAddr.hasMoreElements();){
InetAddress inetAddress = ipAddr.nextElement();
String ip = inetAddress.getHostAddress();
Log.i("size", ip+"--"+getLocalMacAddress());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void chatConnection() {
BufferedReader in = null;
PrintWriter out = null;
try {
if(socket == null){
socket = new Socket("192.168.1.109", 9999);
Log.i("size","here");
}
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
if (socket.isConnected()) {
if (!socket.isOutputShutdown()) {
out.println(msg);
Log.i("size","client 113 send:"+ msg+" "+socket.hashCode());
}
}
while (true) {
if(in.readLine() != null){
if (in.readLine().equals("ok")) {
//out.println("ok");
Log.i("size", "client 113 exit "+socket.hashCode());
in.close();
if(out != null && socket != null){
out.close();
socket.close();
socket = null;
}
break;
} else {
Log.i("size","client 113 receive"+ in.readLine()+" "+socket.hashCode());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
