资源预览内容
第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
第9页 / 共18页
第10页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
客户端的 Socket下面是一个典型的创建客户端 Socket 的过程。trySocket socket=new Socket(“127.0.0.1“,4700); /127.0.0.1 是 TCP/IP 协议中默认的本机地址catch(IOException e)System.out.println(“Error:“+e);这是最简单的在客户端创建一个 Socket 的一个小程序段,也是使用 Socket 进行网络通讯的第一步。服务器端的 ServerSocket下面是一个典型的创建 Server 端 ServerSocket 的过程。ServerSocket server=null;try server=new ServerSocket(4700); /创建一个 ServerSocket 在端口 4700 监听客户请求catch(IOException e)System.out.println(“can not listen to :“+e);Socket socket=null;try socket=server.accept(); /accept()是一个阻塞的方法,一旦有客户请求,它就会返回一个 Socket 对象用于同客户进行交互catch(IOException e)System.out.println(“Error:“+e);以上的程序是 Server 的典型工作模式,只不过在这里Server 只能接收一个请求,接受完后 Server 就退出了。实际的应用中总是让它不停的循环接收,一旦有客户请求,Server 总是会创建一个服务线程来服务新来的客户,而自己继续监听。程序中 accept()是一个阻塞函数,所谓阻塞性方法就是说该方法被调用后,将等待客户的请求,直到有一个客户启动并请求连接到相同的端口,然后 accept()返回一个对应于客户的 socket。这时,客户方和服务方都建立了用于通信的 socket,接下来就是由各个 socket 分别打开各自的输入/输出流。 打开输入/出流类 Socket 提供了方法 getInputStream ()和getOutStream()来得到对应的输入/输出流以进行读/写操作,这两个方法分别返回 InputStream 和 OutputSteam类对象。为了便于读/写数据,我们可以在返回的输入/输出流对象上建立过滤流,如DataInputStream、DataOutputStream 或PrintStream 类对象,对于文本方式流对象,可以采用InputStreamReader 和OutputStreamWriter、PrintWirter 等处理。例如:PrintStream os=new PrintStream(new BufferedOutputStreem(socket.getOutputStream();DataInputStream is=new DataInputStream(socket.getInputStream();PrintWriter out=new PrintWriter(socket.getOutStream(),true);BufferedReader in=new ButfferedReader(new InputSteramReader(Socket.getInputStream();输入输出流是网络编程的实质性部分,具体如何构造所需要的过滤流,要根据需要而定,能否运用自如主要看对Java 中输入输出部分掌握如何。关闭 Socket每一个 Socket 存在时,都将占用一定的资源,在Socket 对象使用完毕时,要其关闭。关闭 Socket 可以调用 Socket 的 Close()方法。在关闭 Socket 之前,应将与 Socket 相关的所有的输入/输出流全部关闭,以释放所有的资源。而且要注意关闭的顺序,与 Socket 相关的所有的输入/输出该首先关闭,然后再关闭 Socket。os.close();is.close();socket.close();尽管 Java 有自动回收机制,网络资源最终是会被释放的。但是为了有效的利用资源,建议 按照合理的顺序主动释放资源。简单的 Client/Server 程序设计下面我们给出一个用 Socket 实现的客户和服务器交互的典型的 C/S 结构的演示程序, 通过仔细阅读该程序,会对前面所讨论的各个概念有更深刻的认识。程序的意义请参考注释。1. 客户端程序import java.io.*;import java.net.*;public class TalkClient public static void main(String args) trySocket socket=new Socket(“192.168.0.2“,4700); /向 192.168.0.2 的 4700 端口发出客户请求BufferedReader sin=new BufferedReader(new InputStreamReader(System.in);/由系统标准输入设备构造BufferedReader 对象PrintWriter os=new PrintWriter(socket.getOutputStream();/由 Socket 对象得到输出流,并构造PrintWriter 对象BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream();/由 Socket 对象得到输入流,并构造相应的 BufferedReader 对象String readline;readline=sin.readLine(); /从系统标准输入读入一字符串while(!readline.equals(“bye“) /若从标准输入读入的字符串为 “bye“则停止循环os.println(readline); /将从系统标准输入读入的字符串输出到 Serveros.flush(); /刷新输出流,使 Server 马上收到该字符串System.out.println(“Client:“+readline); /在系统标准输出上打印读入的字符串System.out.println(“Server:“+is.readLine(); /从 Server 读入一字符串,并打印到标准输出上readline=sin.readLine(); /从系统标准输入读入一字符串 /继续循环os.close(); /关闭 Socket 输出流is.close(); /关闭 Socket 输入流socket.close(); /关闭 Socketcatch(Exception e) System.out.println(“Error“+e); /出错,则打印出错信息2. 服务器端程序import java.io.*;import java.net.*;/import java.applet.Applet;public class TalkServerpublic static void main(String args) tryServerSocket server;try server=new ServerSocket(4700); /创建一个 ServerSocket 在端口 4700监听客户请求catch(Exception e) System.out.println(“can not listen to:“+e); /出错,打印出错信息Socket socket;trysocket=server.accept(); /使用 accept()阻塞等待客户请求,有客户/请求到来则产生一个 Socket 对象,并继续执行catch(Exception e) System.out.println(“Error.“+e); /出错,打印出错信息String line;BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream();/由 Socket 对象得到输入流,并构造相应的 BufferedReader 对象PrintWriter os=newPrintWriter(socket.getOutputStream();/由 Socket 对象得到输出流,并构造PrintWriter 对象BufferedReader sin=new BufferedReader(new InputStreamReader(System.in);/由系统标准输入设备构造BufferedReader 对象System.out.println(“Client:“+is.readLine(); /在标准输出上打印从客户端读入的字符串line=sin.readLine(); /从标准输入读入一字符串while(!line.equals(“bye“) /如果该字符串为 “bye“,则停止循环os.println(line); /向客户端输出该字符串os.flush(); /刷新输出流,使 Client 马上收到该字符串System.out.println(“Server:“+line); /在系统标准输出上打印读入的字符串System.out.println(“Client:“+is.readLine();/从 Client 读入一字符串,并打印到标准输出上line=sin.readLine(); /从系统标准输入读入一字符串 /继续循环os.close(); /关闭 Socket 输出流is.close(); /关闭 Socket 输入流socket.close(); /关闭 Socketserver.close(); /关闭 ServerSocketcatch(Exception e)System.out.println(“Error:“+e); /出错,打印出错信息从上面的两个程序中我们可以看到,socket 四个步骤的使用过程。 可以分别将 Socket 使用的四个步骤的对应程序段选择出来,这样便于 对 socket 的使用有进一步的了解。支持多客户的 client/server 程序设计前面提供的 Client/Server 程序只能实现 Server 和一个客户的对话。在实际应用中,往往是在服务器上运行一个永久的程序,它可以接收来自其他多个客户端的请求,提供相应的服务。为了实现在服务器方给多个客户提供服务的功能,需要对上面的程序进行改造,利用多线程实现多客户机制。服务器总是在指定的端口上监听是否有客户请求,一旦监听到客户请求,服务器就会启动一个专门的服务线程来响应该客户的请求,而服务器本身在启动完线程之后马上又进入监听状态,等待下一个客户的到来。客户端的程序和上面程序是完全一样的, 如果仔细阅读过上面的程序,可以跳过不读,把主要精力集中在Server 端的程序上。1. 客户端程序:MultiTalkClient.java2. 服务器端程序: MultiTalkServer.java3. 程序 ServerThread.java1. 客户端程序:MultiTalkClient.javaimport java.io.*;import java.net.*;public class MultiTalkClient public static void main(String args) trySocket socket=new Socket(“127.0.0.1“,4700); /向本机的 4700 端口发出客户请求Buffered
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号