每一个手机客户端使用Socket与服务器端进行通信,把消息发送给服务器,并监听和显示服务器端发来的消息。
使用ServerSocket创建TCP服务器端,服务器为每个Socket单独创建一个线程用来与客户端进行通信。
服务器端代码如下:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class SimpleServer {
public static ArrayList sockets = new ArrayList();
public static void main(String[] agrs) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(3000);
while (true) {
Socket socket = serverSocket.accept();
System.out.println("get a socket:" + socket.getInetAddress().getHostAddress());
sockets.add(socket);
new Thread(new ServerThread(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ServerThread implements Runnable {
Socket socket;
BufferedReader bufferedReader;// 该socket对应的字符输入流
public ServerThread(Socket s) throws IOException {
this.socket = s;
bufferedReader = new BufferedReader(new InputStreamReader(
socket.getInputStream(), "utf-8"));// 初始化输入流
}
@Override
public void run() {
try {
String chat = null;
while ((chat = bufferedReader.readLine()) != null) {
for (Socket s : SimpleServer.sockets) {
s.getOutputStream().write((chat + "\n").getBytes("utf-8"));
}
}
} catch (IOException e) {
SimpleServer.sockets.remove(socket);
System.out.println("remove a socket");
e.printStackTrace();
}
}
}
手机端代码如下:
package com.example.multithreadclient;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class ClientActivity extends ActionBarActivity {
public static final int SEND_FLAG = 0x124;
public static final int RECIVE_FLAG = 0x123;
public static final int TIMEOUT_FLAG = 0x111;
TextView showTextView;
EditText sendEditText;
Button sendButton;
UIHander uiHander;
ClientThread clientThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showTextView = (TextView) findViewById(R.id.showTextView);
sendEditText = (EditText) findViewById(R.id.sendText);
sendButton = (Button) findViewById(R.id.sendButton);
uiHander = new UIHander(showTextView);
clientThread = new ClientThread(uiHander);
new Thread(clientThread).start();
sendButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String str = sendEditText.getText().toString();
if (str==null || str.equals("")) {
return;
}
str = clientThread.hostAddress + ":"+str;
Message message = new Message();
message.what = 0x124;
Bundle data = new Bundle();
data.putString("send", str);
message.setData(data);
clientThread.threadHander.sendMessage(message);
sendEditText.setText("");
}
});
}
class UIHander extends Handler {
TextView show;
public UIHander(TextView view) {
this.show = view;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 0x123) {
show.append("\n" + msg.getData().getString("context"));
}
if (msg.what == 0x111) {
show.setText("服务器连接失败!");
}
}
}
}
package com.example.multithreadclient;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import com.example.multithreadclient.ClientActivity.UIHander;
public class ClientThread implements Runnable {
UIHander uiHander;
public ClientThreadHander threadHander;
public String hostAddress = "???";
Socket socket = null;
OutputStream os = null;
BufferedReader br = null;
public ClientThread(UIHander hander) {
this.uiHander = hander;
}
class ClientThreadHander extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 0x124) {
try {
os.write((msg.getData().getString("send") + "\r\n")
.getBytes("utf-8"));
} catch (SocketTimeoutException e) {
uiHander.sendEmptyMessage(0x111);
} catch (UnsupportedEncodingException e) {
uiHander.sendEmptyMessage(0x111);
} catch (IOException e) {
uiHander.sendEmptyMessage(0x111);
}
}
}
}
@Override
public void run() {
try {
socket = new Socket();
socket.connect(new InetSocketAddress("192.168.0.104", 3000), 4000);
hostAddress = socket.getLocalAddress().getHostAddress();
os = socket.getOutputStream();
br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
// 新建一个子线程用来监听服务器端的输入数据
new Thread() {
@Override
public void run() {
String content = null;
try {
while ((content = br.readLine()) != null) {
Message msg = new Message();
Bundle bundle = new Bundle();
bundle.putString("context", content);
msg.what = 0x123;
msg.setData(bundle);
uiHander.sendMessage(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
Looper.prepare();
threadHander = new ClientThreadHander();
Looper.loop();
} catch (SocketTimeoutException e) {
uiHander.sendEmptyMessage(0x111);
} catch (UnknownHostException e) {
uiHander.sendEmptyMessage(0x111);
} catch (IOException e) {
uiHander.sendEmptyMessage(0x111);
}
}
}
效果如下: