📄 right8_3_9.htm
字号:
<html><head><title>JAVA编程语言</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><link rel="stylesheet" href="../../../css/text.css" type="text/css"></head><body bgcolor="#FFFFFF" text="#000000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" ><table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF"> <tr> <td valign="top"> <table width="97%" border="0" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF" align="center"> <tr> <td height="244" valign="top"> <p class="pt9-black"> <span class="zhongdian">1. 客户端程序:MultiTalkClient.java</span><a name="01"></a><br> <br> import java.io.*;<br> import java.net.*;<br> public class MultiTalkClient {<br> public static void main(String args[]) {<br> try{<br> Socket socket=new Socket("127.0.0.1",4700); <br> <font color="339900">//向本机的4700端口发出客户请求</font><br> BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));<br> <font color="339900">//由系统标准输入设备构造BufferedReader对象</font><br> PrintWriter os=new PrintWriter(socket.getOutputStream());<br> <font color="339900">//由Socket对象得到输出流,并构造PrintWriter对象</font><br> BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));<br> <font color="339900">//由Socket对象得到输入流,并构造相应的BufferedReader对象</font><br> String readline;<br> readline=sin.readLine(); <font color="339900">//从系统标准输入读入一字符串</font><br> while(!readline.equals("bye")){ <br> <font color="339900">//若从标准输入读入的字符串为 "bye"则停止循环</font><br> os.println(readline); <br> <font color="339900">//将从系统标准输入读入的字符串输出到Server</font><br> os.flush(); <font color="339900"><br> //刷新输出流,使Server马上收到该字符串</font><br> System.out.println("Client:"+readline); <br> <font color="339900">//在系统标准输出上打印读入的字符串</font><br> System.out.println("Server:"+is.readLine()); <br> <font color="339900">//从Server读入一字符串,并打印到标准输出上</font><br> readline=sin.readLine(); <font color="339900"><br> //从系统标准输入读入一字符串</font><br> } <font color="339900">//继续循环</font><br> os.close(); <font color="339900">//关闭Socket输出流</font><br> is.close(); <font color="339900">//关闭Socket输入流</font><br> socket.close(); <font color="339900">//关闭Socket</font><br> }catch(Exception e) {<br> System.out.println("Error"+e); <font color="339900">//出错,则打印出错信息</font><br> }<br> }<br> }<br> <br> <span class="zhongdian">2. 服务器端程序: MultiTalkServer.java<a name="02"></a></span><br> <br> import java.io.*;<br> import java.net.*;<br> import ServerThread;<br> public class MultiTalkServer{<br> static int clientnum=0; <font color="339900">//静态成员变量,记录当前客户的个数</font><br> public static void main(String args[]) throws IOException {<br> ServerSocket serverSocket=null;<br> boolean listening=true;<br> try{<br> serverSocket=new ServerSocket(4700); <br> <font color="339900">//创建一个ServerSocket在端口4700监听客户请求</font><br> }catch(IOException e) {<br> System.out.println("Could not listen on port:4700."); <br> //出错,打印出错信息<br> System.exit(-1); <font color="339900">//退出</font><br> }<br> while(listening){ <font color="339900">//永远循环监听</font><br> new ServerThread(serverSocket.accept(),clientnum).start();<br> <font color="339900">//监听到客户请求,根据得到的Socket对象和<br> 客户计数创建服务线程,并启动之</font><br> clientnum++; <font color="339900">//增加客户计数</font><br> }<br> serverSocket.close(); <font color="339900">//关闭ServerSocket</font><br> }<br> }</p> <p class="pt9-black"> <span class="zhongdian">3. 程序ServerThread.java<a name="03"></a></span><br> <br> import java.io.*;<br> import java.net.*;<br> public class ServerThread extends Thread{<br> Socket socket=null; <font color="339900">//保存与本线程相关的Socket对象</font><br> int clientnum; <font color="339900">//保存本进程的客户计数</font><br> public ServerThread(Socket socket,int num) { <font color="339900">//构造函数</font><br> this.socket=socket; <font color="339900">//初始化socket变量</font><br> clientnum=num+1; <font color="339900">//初始化clientnum变量</font><br> }<br> public void run() { <font color="339900">//线程主体</font><br> try{<br> String line;<br> BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));<br> <font color="339900">//由Socket对象得到输入流,并构造相应的BufferedReader对象</font><br> PrintWriter os=newPrintWriter(socket.getOutputStream());<br> <font color="339900">//由Socket对象得到输出流,并构造PrintWriter对象</font><br> BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));<br> <font color="339900">//由系统标准输入设备构造BufferedReader对象</font><br> System.out.println("Client:"+ clientnum +is.readLine());<br> <font color="339900">//在标准输出上打印从客户端读入的字符串</font><br> line=sin.readLine(); <br> <font color="339900">//从标准输入读入一字符串</font><br> while(!line.equals("bye")){ <br> <font color="339900">//如果该字符串为 "bye",则停止循环</font><br> os.println(line); <br> <font color="339900">//向客户端输出该字符串</font><br> os.flush(); <br> <font color="339900">//刷新输出流,使Client马上收到该字符串</font><br> System.out.println("Server:"+line); <br> <font color="339900">//在系统标准输出上打印该字符串</font><br> System.out.println("Client:"+ clientnum +is.readLine());<br> <font color="339900">//从Client读入一字符串,并打印到标准输出上</font><br> line=sin.readLine(); <br> <font color="339900">//从系统标准输入读入一字符串</font><br> } <font color="339900">//继续循环</font><br> os.close(); <font color="339900">//关闭Socket输出流</font><br> is.close(); <font color="339900">//关闭Socket输入流</font><br> socket.close(); <font color="339900">//关闭Socket</font><br> server.close(); <font color="339900">//关闭ServerSocket</font><br> }catch(Exception e){<br> System.out.println("Error:"+e); <br> <font color="339900">//出错,打印出错信息</font><br> }<br> }<br> }<br> <br> 这个程序向读者展示了网络应用中最为典型的C/S结构,我们可以用下面的图来描述这样一种模型:<br> <img src="../../../images/tu/ch08/8_3_10.gif" width="440" height="360"> <br> <br> <font color="000099">通过以上的学习,读者应该对Java的面向流的网络编程有了一个比较全面的认识,这些都是基于TCP的应用,后面我们将介绍基于UDP的Socket编程。</font></p> </td> </tr> </table> </td> </tr></table></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -