当服务器线程读到客户端数据之后程序遍历socketList集合并将该数据向socketList集合中的每个Socket发送一次该服务器线程将把从Socket中读到的数据向socketList中的每个Socket转发一次如run()线程执行体中的粗体字代码所示
每个客户端应该包含条线程一条负责读取用户的键盘输入并将用户输入的数据写入Socket对应的输出流中一条负责读取Socket对应输入流中的数据(从服务器发送过来的数据)并将这些数据打印输出其中负责读取用户键盘输入的线程由Myclient负责也就是由程序的主线程负责客户端主程序代码如下
程序清单codes///MultiThread/client/MyClientjava
public class MyClient
{
public static void main(String[] args)throws Exception
{
Socket s = s = new Socket( )
//客户端启动ClientThread线程不断读取来自服务器的数据
new Thread(new ClientThread(s))start() //①
//获取该Socket对应的输出流
PrintStream ps = new PrintStream(sgetOutputStream())
String line = null;
//不断读取键盘输入
BufferedReader br = new BufferedReader(new InputStreamReader(Systemin))
while ((line = brreadLine()) != null)
{
//将用户的键盘输入内容写入Socket对应的输出流
psprintln(line)
}
}
}
上面程序中获取键盘输入的代码在第章中已有详细解释此处不再赘述当该线程读到用户键盘输入的内容后将用户键盘输入的内容写入该Socket对应的输出流
除此之外当主线程使用Socket连接到服务器之后并启动了ClientThread来处理该线程的Socket通信如程序中①号代码所示
ClientThread线程负责读取Socket输入流中的内容并将这些内容在控制台打印出来
程序清单codes///MultiThread/client/ClientThreadjava
public class ClientThread implements Runnable
{
//该线程负责处理的Socket
private Socket s;
//该现成所处理的Socket所对应的输入流
BufferedReader br = null;
public ClientThread(Socket s)
throws IOException
{
thiss = s;
br = new BufferedReader(
new InputStreamReader(sgetInputStream()))
}
public void run()
{
try
{
String content = null;
//不断读取Socket输入流中的内容并将这些内容打印输出
while ((content = brreadLine()) != null)
{
Systemoutprintln(content)
}
}
catch (Exception e)
{
eprintStackTrace()
}
}
}
上面线程的功能也非常简单它只是不断获取Socket输入流中的内容当获取Socket输入流中的内容后直接将这些内容打印在控制台如上程序中粗体字代码所示
先运行上面程序中的MyServer类该类运行后只是作为服务器看不到任何输出接着可以运行多个MyClient相当于启动多个聊天室客户端登录该服务器接着可以看到我们在任何一个客户端通过键盘输入一些内容后单击回车键将可看到所有客户端(包括自己)都会在控制台收到他刚刚输入的内容这就粗略实现了一个C/S结构聊天室的功能
返回目录疯狂Java讲义
编辑推荐
Java程序性能优化让你的Java程序更快更稳定
新手学Java 编程
Java程序设计培训视频教程
[] []