第(1)页共(5)页1、课程名称:网络编程2、知识点2.1、上次课程的主要知识点集合框架的使用。2.2、本次预计讲解的知识点网络编程的基本概念以及组成。3、具体内容(☆☆☆☆☆)3.1、认识网络编程计算机网络:将物理上分开的主机连接在一起,就形成了网络。但是为了可以区分出不同的主机,所以需要给他设置一个IP地址(IPv4)。但是如果要想进行连接还需要依靠端口。如果要想进行通讯,还需要有协议,例如:TCP、UDP、HTTP、FTP。在以后的WEB开发中主要使用的是HTTP协第(2)页共(5)页议。而在网络编程中主要使用TCP、UDP;·TCP:可靠的数据传输;·UDP:不可靠的数据传输;但是对于Java的网络程序开发也分为两类:·C/S:客户、服务器端,需要开发出两套代码,一套是服务器程序,另外一套是客户端程序,而运行维护的时候也要维护两套代码,但是这种开发很安全,因为使用的是自己的专属协议,同时端口可以自己方便控制。但是维护会很辛苦。·B/S:浏览器、服务器模式,只需要开发出一套服务器端的代码,客户端通过浏览器执行,但是这种开发模式虽然维护方便,只需要维护一套代码,但是由于使用的公开的HTTP协议,并且是公开的端口号,所以安全性会比较差。3.2、实现网络编程如果要想实现网络编程主要使用的就是两个类:·服务器:ServerSocket;·客户端:Socket,在网络中,每一个用户都使用Socket表示。范例:开发一个服务器端代码·服务器端的开发主要依靠的是ServerSocket程序类,在这个类中有如下的几个方法:|-构造:publicServerSocket(intport)throwsIOException;|-等待客户端连接:publicSocketaccept()throwsIOException;·当取得了客户端连接的Socket对象之后肯定需要进行一些信息的交互,在Socket类中定义有以下方法:|-取得客户端的输入流:publicInputStreamgetInputStream()throwsIOException;|-取得客户端的输出流:publicOutputStreamgetOutputStream()throwsIOException;packagecn.mldn.demo;importjava.io.PrintStream;importjava.net.ServerSocket;importjava.net.Socket;publicclassHelloServer{publicstaticvoidmain(String[]args)throwsException{ServerSocketserver=newServerSocket(9999);//表示在本机的9999端口监听System.out.print(等待客户端连接...);Socketclient=server.accept();//进入到阻塞状态,等待PrintStreamout=newPrintStream(client.getOutputStream());//表示向客户端输出out.println(HelloWorld!!!);out.close();server.close();}}客户端需要接收服务器端的输出信息。范例:客户端接收服务器端信息packagecn.mldn.demo;importjava.net.Socket;importjava.util.Scanner;publicclassHelloClient{publicstaticvoidmain(String[]args)throwsException{Socketclient=newSocket(localhost,9999);第(3)页共(5)页Scannerscan=newScanner(client.getInputStream());//接收服务器端输入数据scan.useDelimiter(\n);if(scan.hasNext()){System.out.println(【服务器端回应数据】+scan.next());}scan.close();client.close();}}服务器端的输出对客户端而言表示的是输入信息。3.3、Echo程序Echo程序的本质在于客户端与服务器端的数据的接收与回应操作,客户端随意输入信息给服务器端,服务器端接收到之后前面增加一个“ECHO:”返回输入的内容给客户端。范例:定义服务器端代码packagecn.mldn.demo;importjava.io.PrintStream;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.Scanner;publicclassEchoServer{publicstaticvoidmain(String[]args)throwsException{ServerSocketserver=newServerSocket(9999);System.out.print(等待客户端连接...);Socketclient=server.accept();//有客户端连接了Scannerscan=newScanner(client.getInputStream());scan.useDelimiter(\n);PrintStreamout=newPrintStream(client.getOutputStream());booleanflag=true;while(flag){//表示要一直进行客户端输入数据的接收if(scan.hasNext()){Stringstr=scan.next().trim();//必须消除空格if(byebye.equalsIgnoreCase(str)){//断开连接flag=false;out.println(您已退出系统,拜拜!);}else{out.println(ECHO:+str);}}}server.close();}}而客户端代码需要实现键盘的输入操作,而后将信息发送给服务器端。第(4)页共(5)页范例:编写客户端代码packagecn.mldn.demo;importjava.io.PrintStream;importjava.net.Socket;importjava.util.Scanner;publicclassEchoClient{publicstaticvoidmain(String[]args)throwsException{Socketclient=newSocket(localhost,9999);Scannerinput=newScanner(System.in);//键盘输入信息Scannerin=newScanner(client.getInputStream());//得到服务器端的输出信息in.useDelimiter(\n);input.useDelimiter(\n);PrintStreamout=newPrintStream(client.getOutputStream());//向服务器端输出booleanflag=true;while(flag){System.out.print(请输入数据:);if(input.hasNext()){Stringstr=input.next().trim();//取得输入数据out.println(str);//将信息发送给服务器端if(in.hasNext()){System.out.println(in.next().trim());}if(byebye.equalsIgnoreCase(str)){flag=false;}}}client.close();}}以上的代码只是一个单线程操作,是主线程在提供着支持,很明显,一个服务器只能够为一个客户端服务。如果一个服务器要为多个用户服务,那么就需要使用多线程的操作完成,即:把每一个客户端都作为一个线程存在。范例:修改EchoServer类packagecn.mldn.demo;importjava.io.PrintStream;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.Scanner;publicclassEchoServer{publicstaticvoidmain(String[]args)throwsException{ServerSocketserver=newServerSocket(9999);booleanoutFlag=true;while(outFlag){System.out.print(等待客户端连接...);Socketclient=server.accept();//有客户端连接了newThread(()-{第(5)页共(5)页try{Scannerscan=newScanner(client.getInputStream());scan.useDelimiter(\n);PrintStreamout=newPrintStream(client.getOutputStream());booleanflag=true;while(flag){//表示要一直进行客户端输入数据的接收if(scan.hasNext()){Stringstr=scan.next().trim();//必须消除空格if(byebye.equalsIgnoreCase(str)){//断开连接flag=false;out.println(您已退出系统,拜拜!);}else{out.println(ECHO:+str);}}}}catch(Exceptione){}}).start();}}}主线程将打开所有的子线程,每一个连接到服务器端的操作都通过一个线程来描述。4、总结服务器开发=网络支持+IO+多线程。