上面开发了启动与关闭服务器端线程程序,下面我们继续开发服务端程序。其实剩下的两个线程CilentThread与BroadCast很好理解,前者就是从客户端读取信息;后者就是服务端想客户端定时发送信息。只要把这两点看懂了,程序就不能。好了,我就直接上代码了:
1、ClientThread.java代码如下:
package com.wyf.wpf;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
public class ClientThread extends Thread {
// 声明客户端socket
Socket clientSocket;
// 声明客户端数据输出与输入流
DataInputStream in = null;
DataOutputStream out = null;
// 服务端线程
ServerThread serverThread;
// 构造函数,初始化相关变量
public ClientThread(Socket socket, ServerThread serverThread) {
this.clientSocket = socket;
this.serverThread = serverThread;
try {
in = new DataInputStream(clientSocket.getInputStream());
out = new DataOutputStream(clientSocket.getOutputStream());
} catch (IOException e2) {
System.out.println("发生异常" + e2);
System.out.println("建立I/O通道失败!");
System.exit(3);
}
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while (true) {
try {
// 读取客户端输入数据
String message = in.readUTF();
synchronized (serverThread.messages) {
if (message != null) {
// 添加数据到服务端显示
serverThread.messages.addElement(message);
Sever.jTextArea.append(message + '\n');
}
}
} catch (IOException E) {
break;
}
}
}
}
讲解:
当该类的构造方法被调用时,获得了Socket得输入与输出流,向客户端发送数据或接受客户端数据。Run()方法监听Socket是否有新消息,如果有新消息,则加入messages数组中。
2、编写BroadCast.java,代码如下:
package com.wyf.wpf;
import java.io.IOException;
public class BroadCast extends Thread {
// 声明服务、客户端线程
ClientThread clientThread;
ServerThread serverThread;
// 字符串
String str;
// 构造函数
public BroadCast(ServerThread serverThread) {
this.serverThread = serverThread;
}
// 运行
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while (true) {
try {
Thread.sleep(200);
} catch (InterruptedException E) {
}
synchronized (serverThread.messages) {
if (serverThread.messages.isEmpty()) {
continue;
}
// 取得消息
str = (String) this.serverThread.messages.firstElement();
}
// 同步发送消息到各个客户端
synchronized (serverThread.clients) {
for (int i = 0; i < serverThread.clients.size(); i++) {
// 取得各个客户端
clientThread = (ClientThread) serverThread.clients
.elementAt(i);
try {
// 客户端中写入数据
clientThread.out.writeUTF(str);
} catch (IOException E) {
}
}
this.serverThread.messages.removeElement(str);
}
}
}
}
讲解:
该类的run()方法每隔200ms执行一次,向所有客户端发送messages数组中尚未发送出得消息。
好了服务端程序就到此开发完毕了。我们的Android聊天室也告一段落了。下面要开发的就是手机客户端。敬请期待,谢谢!