1、服务器端的实现
服务器端需要通过ServerSocket来创建一个ServerSocket服务对象,然后通过accept()方法Socket对象获得来监听连接上来的客户端(这个方法是阻塞的),最后再对客户端发送过来的字节流进行读取。下面贴出我写的服务器端的代码,供参考:
<span style="white-space:pre"> </span>private static int PORT = 54327;//端口号
private static List<Socket> mSocketList = new ArrayList<Socket>();//存放请求的客户端的Socket
private ExecutorService mExcutorService;//一个线程池
private ServerSocket mServerSocket;//Socket服务器端服务
下面是声明ServerSocket对象及监听客户端请求
try {
<span style="white-space:pre"> </span>mServerSocket = new ServerSocket(PORT);
mExcutorService = Executors.newCachedThreadPool();//实例化线程池对象(一次执行所有线程)
Socket client = null;
while (true) {
client = mServerSocket.accept();
mSocketList.add(client);//将连接的客户端添加进集合
mExcutorService.execute(new ThreadServer(client));//给每一个客户端开一个线程放进线程池中
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
try {
<span style="white-space:pre"> </span>mServerSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
定义一个线程类用来和客户端交互
static class ThreadServer implements Runnable {
private Socket mSocket;
private BufferedReader mBufferedReader;//用来读取客户端发来的数据
private PrintWriter mPrintWriter;//用来写入信息发给客户端
private String MSG = "ggg";
public ThreadServer(Socket socket) throws IOException {
this.mSocket = socket;
mBufferedReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream(), "UTF-8"));
mPrintWriter = new PrintWriter(mSocket.getOutputStream(), true);
MSG = mBufferedReader.readLine();
sendMessage();
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
<span style="white-space:pre"> </span>while ((MSG = mBufferedReader.readLine()) != null) {//readLine()方法是阻塞的,当有数据流时执行,没有则阻塞
sendMessage();//发送信息给客户端
}
} catch (Exception e) {
} finally {
}
}
服务器将信息转发给所有客户端private void sendMessage() throws IOException {
for (Socket client : mSocketList) {
mPrintWriter = new PrintWriter(client.getOutputStream(), true);
mPrintWriter.println(MSG);
}
}
客户端的实现
新建一个线程,将网络处理放在其中,具体的用法注释中已经写明
new Thread(new Runnable() {
@Override
public void run() {
try {
<span style="white-space:pre"> </span>// TODO Auto-generated method stub
mSocket = new Socket(mHost, mPort);//mHost为服务器地址,mPort和服务器的端口号一样
mOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream())),true);//写入数据
mIn = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));//读取服务器发来的数据
if (mSocket.isConnected()) {
handler.sendEmptyMessage(2);
}
while (true) {
if (!mSocket.isClosed() && mSocket.isConnected() && !mSocket.isInputShutdown() && mIn!=null
) {
if (null!=(textLine+=mIn.readLine())) {//读取数据
<span style="white-space:pre"> </span>Message message = new Message();
message.what = 1;
message.obj = textLine;
handler.sendMessage(message);
}
}
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
版权声明:本文为android_hdh原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。