《网络编程 - Socket.ppt》由会员分享,可在线阅读,更多相关《网络编程 - Socket.ppt(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、网络编程-SocketC/S结构网络通讯流程o服务器开始监听o客户端申请连接o服务器接受连接(此时连接已经建立)o服务器与客户端开始通讯通讯条件o服务器IP或主机名或域名n通过IP来定位要连接的服务器所在位置n127.0.0.1表示本机IPnLocalhost表示本机o服务器监听的服务端口n通过IP找到要连接的服务器主机,但是服务器上运行着多个程序都监听着网络n而每个程序都监听着不同的端口n任何程序都必须通过端口来与网络通讯n这时,必须通过端口来定位服务器上要连接的程序通讯条件服务器 单用户opublic static void main(String args)nServerSocket s
2、erverSocket=null;nInputStream is=null;nInputStreamReader isr=null;nBufferedReader br=null;nSocket socket=null;ntry oserverSocket=new ServerSocket(6789);/开始监听osocket=serverSocket.accept();/等待接收数据ois=socket.getInputStream();/获得通向Socket的低端流oisr=new InputStreamReader(is);/高端流绑定低端流obr=new BufferedReader(
3、isr);/缓冲流绑定高端流owhile(true)/循环读取nString line=br.readLine();/接收数据nif(null=line)/如果客户端已经断开break;nnSystem.out.println(line);on catch(Exception e)e.printStackTrace();n finally otry is.close();catch(Exception e)e.printStackTrace();otry isr.close();catch(Exception e)e.printStackTrace();otry br.close();catc
4、h(Exception e)e.printStackTrace();otry socket.close();catch(Exception e)e.printStackTrace();otry serverSocket.close();catch(Exception e)e.printStackTrace();no客户端opublic static void main(String args)nSocket socket=null;nOutputStream os=null;nPrintStream ps=null;ntry osocket=new Socket(“127.0.0.1”,678
5、9);/申请连接oos=socket.getOutputStream();/获得通向Socket的低端流ops=new PrintStream(os);/高端流绑定低端流ops.println(“把犯人给我押上!”);/发送数据ops.flush();n catch(Exception e)e.printStackTrace();n finally otry ps.close();catch(Exception e)e.printStackTrace();otry os.close();catch(Exception e)e.printStackTrace();otry socket.clos
6、e();catch(Exception e)e.printStackTrace();no服务器 多用户ooserverSocket=new ServerSocket(6789);/开始监听owhile(true)/循环接收用户请求nsocket=serverSocket.accept();/等待接收数据nis=socket.getInputStream();nisr=new InputStreamReader(is);nbr=new BufferedReader(isr);nwhile(true)oString line=br.readLine();oif(null=line)nbreak;o
7、oSystem.out.println(line);nnsocket.close();oo服务器 多用户 并发o原理:n每次acept到一个Socket,都启动一个线程,把这个Socket交给这个线程进行处理n每个Socket象征着一个客户端,因为我们认为,我们将每个客户交给一个线程来处理n这种线程称为“客户线程”服务器 多用户 并发opublic class ClientThread extends Thread nprivate Socket socket=null;npublic ClientThread(Socket socket)othis.socket=socket;nnpubli
8、c void run()oInputStream is=null;oInputStreamReader isr=null;oBufferedReader br=null;otry nis=socket.getInputStream();nisr=new InputStreamReader(is);nbr=new BufferedReader(isr);nwhile(true)String line=br.readLine();if(null=line)break;System.out.println(line);no catch(Exception e)e.printStackTrace();
9、o finally ntry is.close();catch(Exception e)e.printStackTrace();ntry isr.close();catch(Exception e)e.printStackTrace();ntry br.close();catch(Exception e)e.printStackTrace();ntry socket.close();catch(Exception e)e.printStackTrace();ono服务器 多用户 并发opublic static void main(String args)nServerSocket serve
10、rSocket=null;nInputStream is=null;nInputStreamReader isr=null;nBufferedReader br=null;nSocket socket=null;ntry oserverSocket=new ServerSocket(6789);/开始监听owhile(true)nsocket=serverSocket.accept();/等待接收数据nClientThread clientThread=new ClientThread(socket);nclientThread.start();/启动一个客户线程on catch(Except
11、ion e)e.printStackTrace();n finally otry is.close();catch(Exception e)e.printStackTrace();otry isr.close();catch(Exception e)e.printStackTrace();otry br.close();catch(Exception e)e.printStackTrace();otry socket.close();catch(Exception e)e.printStackTrace();otry serverSocket.close();catch(Exception e
12、)e.printStackTrace();no客户端 多用户 并发o下面是模拟10个并发客户端的程序:opublic static void main(String args)nfor(int i=0;i 10;i+)oSocket socket=null;oOutputStream os=null;oPrintStream ps=null;otry nsocket=new Socket(127.0.0.1,6789);nos=socket.getOutputStream();nps=new PrintStream(os);nps.println(把犯人给我押上!);nps.flush();o
13、 catch(Exception e)e.printStackTrace();o finally ntry ps.close();catch(Exception e)e.printStackTrace();ntry os.close();catch(Exception e)e.printStackTrace();ntry socket.close();catch(Exception e)e.printStackTrace();ono总结o服务器:n用循环实现多客户n用多线程实现并发思索o已经可以,多用户,并发了o现在如果要求对同一个客户,都要求:n多任务n并发o怎么办?o提示:n与多用户并发一样o用循环实现多任务o用多线程实现并发