




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2Socket通信程序设计,文志强zhqwen20001计算机与通信学院,基本内容,2.1Socket通信原理2.2Socket网络编程2.3项目实战,2.1Socket通信原理,IP地址:主机标识端口:服务类型,Socket=IP(address)+Port(server),套接字通讯首先强调发送方和接收方的区别,同时也明确服务器和客户机之间的不同一个客户机必须知道服务器的地址和端口,以便进行申请连接一个服务器从它接收到的数据报文中读取客户端的地址和端口套接字通过,确定服务器和客户机的地址和端口以及协议,利用java.io实现数据的传输,Socket程序基本机理,Java-Internet语言具备强大网络通信功能,基于套接字(Socket)通信方式,流套接字,TCP协议(TransmissionControlProtocol),UDP协议(UserDatagramProtocol),数据报套接字,Java的Socket属于流式套接字通信,采用TCP协议,提供面向连接的服务,实现可靠的通信。,JavaSocket,J提供两个类,实现Socke通信:,Socket编程属低层次网络编程,功能强大,相对URL网络编程提供更多的功能和更灵活的控制,复杂度较高。,ServerSocket-服务器端Socket-客户端通,操作TCP套接字的发送和接收需要借助java.io包的InputStream/OutputStream完成,分别通过方法实现:Socket.getInputStream()/Socket.getOutputStream(),Socket/ServerSocket构造函数,Socket()通过系统默认类型的SocketImpl创建未连接套接字Socket(InetAddressaddress,intport)创建一个流套接字并将其连接到指定IP地址的指定端口号Socket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort)创建一个套接字并将其连接到指定远程端口上的指定远程地址Socket(Stringhost,intport)创建一个流套接字并将其连接到指定主机上的指定端口号Socket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)创建一个套接字并将其连接到指定远程主机上的指定远程端口,ServerSocket()创建非绑定服务器套接字ServerSocket(intport)创建绑定到特定端口的服务器套接字ServerSocket(intport,intbacklog)利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号ServerSocket(intport,intbacklog,InetAddressbindAddr)使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器,Socket/ServerSocket主要方法,JavaSocket通信原理,通讯的两个程序分别为Client/Server。Client端程序申请连接,Server端程序监听所有端口,判断是否有Client程序的服务请求。当Client程序请求某端口连接时,Server程序将“套接字”连接到该端口上,此时,Client/Server程序建立一个虚连接。Client程序向套接字写入请求,Server程序处理请求并把处理结果通过套接字送回给Client。通信结束时,拆除所建的虚拟连接。,Socket网络通信程序由三个基本部分组成:(1)建立连接:通信双方在通信开始之前,建立一条专用的虚拟连接通道(2)数据通信:利用虚拟连接通道传送数据信息进行通信(3)拆除连接:通信结束时,将所建的虚拟连接拆除。,2.2Socket网络编程,Server端,Client端,service=ServiceSocket(port_number)创建service对象,以TCP服务实现端口监听socket=ServerSocket.accept()创建socke对象,接收用户访问请求,Socket=Socket(port_number)创建socke对象,建立连接,发送访问请求,InputStreamSocket对象输入流OutputStreamSocket对象输出流通过socke对象实现与Client端数据传输,OutputStreamSocket对象输出流InputStreamSocket对象输入流通过socke对象,实现与Servert端数据传输,socket.close()关闭Socke关闭结束与Client端的连接service.close()关闭监听程序,socket.close()关闭Socke结束与Server端的连接,(1)建立连接,(2)数据通讯,(3)拆除连接,Socke通信机制,OutputStream获得Socket对象输出流,Socke通信机制,建,立,S,o,c,k,e,t,连,接,通过流传输数据,服务端,联结成功获得已连接的Socket对象,Socket(host,port)创建Socket对象向指定主机端口发出连接请求,客户端,Socket对象,ServerSocket对象,InputStream获得Socket对象输入流,申,请,连,接,ServiceSocket.close()停止提供TCP连接服务,一个ServerSocket对象和一个Socket对象,一个Socket对象,Socket.close()关闭TCP连接,ServiceSocket(port)创建ServiceSocke对象,提供TCP连接服务,accept()在指定的端口监听客户端请求联结创建,InputStream获得Socket对象输入流,Socket.close()关闭TCP连接,OutputStream获得Socket对象输出流,ServerSocket对象,访问监听,利用构造函数创建ServerSocke/Socket两个对象,建立双向连接引入异常处理机制建立I/O流实现读/写数据流释放连接,ServerSocket程序基本框架结构,JavaServerSocket,Socket创建一个服务器的典型工作流程:(1)创建一个指定端口的ServerSocket对象。(2)ServerSocket对象调用accept()方法创建一个Socket对象。实现端口监听连接请求。-但accept()收到客户端连接请求,且返回连接客户端与服务器的Socket对象,则双方的虚电路建立完成。(3)调用getInputStream()方法和getOutputStream()方法获得Socket对象的输入流和输出流。(4)服务器与客户端根据协议交互数据。(5)直至一端请求关闭连接,服务器和客户端连接终止。(6)服务器回到第2步,继续监听下一次的连接。而客户端则运行结束。,importjava.io.*;.*;publicclassTcpServerstaticpublicvoidmain(Stringargs)tryServerSocketsvrsoc=newServerSocket(8000);Sockesoc=svrsoc.accept();InputStreamis=soc.getInputStream();/Socket输入流DataInputStreamin=newDataInputStream(is);OutputStreamos=soc.getOutputStream();/Socket输出流PrintStreamout=newPrintStream(os);/*服务器创建输入流对象in和输出流对象out,接收客户输入信息(in)和向客户发送信息(out),同样,客户端也建立两个对象,与服务器双向通信。服务器向输出流信息都成为客户输入信息,而客户输出的信息送入服务者的输入流。*/InetAddressclientIP=soc.getInetAddress();System.out.println(ClientsIPaddress:+clientIP);intport=soc.getPort();/得到客户方的端口System.out.println(Clientsport:+port);out.println(Welcome!.);Stringstr=in.readLine();/在输入流对象in中读一行while(!str.equals(“quit”)System.out.println(“客户端:+str);str=in.readLine();System.out.println(“客户关机.);catch(Exceptione)System.out.println(Error:+e);finallyis.close();/关闭输入流os.close();/关闭输出流soc.close();/关闭socket,拆除链路svrsoc.close();/关闭监听,停止服务,1、创建指定端口的ServerSocket对象,2、调用accept()方法监听端口连接请求,3-1、Socket绑定客户IP地址和端口3-2、调用getInputStream()或getOutputStream()方法获得Socket对象的输入流和输出流,4、服务器与客户端连接根据协议交互数据,5、请求关闭连接,服务器和客户端连接终止,6、停止该用户TCP连接服务,服务器套接字程序,JavaSocket,Socket创建一个客户端的典型工作流程:(1)创建一个指定地址和端口的Socket对象,建立服务器与客户端连接。(2)调用getInputStream()方法或getOutputStream()方法获得Socket对象的输入流和输出流。(3)服务器与客户端连接根据协议交互数据。(4)请求关闭连接,服务器和客户端连接终止。,.*;importjava.io.*;publicclassTcpClientstaticpublicvoidmain(Stringargs)trySocketsoc=newSocket(localhost,8000);System.out.println(ConnectingtotheServer.);InputStreamis=soc.getInputStream();OutputStreamos=soc.getOutputStream();DataInputStreamin=newDataInputStream(is);PrintStreamout=newPrintStream(os);Stringstrin=in.readLine();System.out.println(“服务器端:+strin);bytebmsg=newbyte20;System.in.read(bmsg);Stringmsg=newString(bmsg,0);msg=msg.trim();while(!msg.equals(quit)/从键盘循环读入,直到输入”quit”为止out.println(msg);System.in.read(bmsg);msg=newString(bmsg,0);msg=msg.trim();out.println(msg);catch(Exceptione)System.out.println(Error:+e);finallyis.close();/关闭输入流os.close();/关闭输出流soc.close();/关闭socket,拆除链路System.exit(0);,1、创建指定地址和端口的Socket对象建立服务器与客户端连接,2、调用getInputStream()或getOutputStream()方法获得Socket对象的输入流和输出流,3、服务器与客户端连接根据协议交互数据,4、关闭请求连接,服务器和客户端连接终止,客户机套接字程序,Socke通信编程-异常处理,ServerSocket和socket编程需要进行try-catch异常处理(1)服务器端:ServerSocketserver;Socketsocket;tryserver=newServerSocket(port);socket=server.accept();.catch(Exceptione)System.out.println(“Erroroccurred:”+e);(2)客户端:Socketsocket;trysocket=newSocket(“ServerName”,port);catch(Exceptione)System.out.println(“Erroroccurred:”+e);,建立Socket连接后,利用方法getOutputStream()和getInputStream()建立向Socket读写数据的I/O流。需要进行try-catch异常处理。tryInputStreamins=socket.getInputStream();OutputStreamouts=socket.getOutputStream();catch(Exceptione)System.out.println(“Erroroccurred:”+e);,Socke通信编程建立/输出流,获取Socket的输入/输出流后,需要对两个流对象建立数据流的读/写操作InputStreamins=socket.getInputStream();OutputStreamouts=socket.getOutputStream();或PrintStreamout=newPrintStream(outs);读入一个字符串并将其长度写入输出流中,则用:Stringstr=inn.readLine();out.println(str.length();,Socke通信编程读写数据流,无论是服务器程序还是客户端程序,通信结束时,必须断开连接并释放所占用的资源。Java断开连接方法:close();(1)关闭输入输出流停止数据传输(2)关闭socket终止申请服务(3)关闭serversocket关闭监听服务,Socke通信编程释放连接,问题:Socket设计输入流和输出流的处理,客户机与服务器进行数据读取时将引起堵塞。解决办法:服务器一旦接受到用户的Socket,将专门为该用户建立在一个独立的线程,进行数据的访问交换操作。,/(2)服务器端程序importjava.io.*;.*;importjava.util.*;publicclassServerpublicstaticvoidmain(Stringargs)ServerSocketserver=null;ServerThreadthread;Socketyou=null;while(true)tryserver=newServerSocket(4331);catch(IOExceptione1)System.out.println(“正在监听”);/ServerSocket对象不能重复创建。tryyou=server.accept();System.out.println(客户的地址:+you.getInetAddress();catch(IOExceptione)System.out.println(正在等待客户);if(you!=null)newServerThread(you).start();/为每个客户启动一个专门的线程。elsecontinue;,classServerThreadextendsThreadSocketsocket;DataOutputStreamout=null;DataInputStreamin=null;Strings=null;ServerThread(Sockett)socket=t;tryin=newDataInputStream(socket.getInputStream();out=newDataOutputStream(socket.getOutputStream();catch(IOExceptione)publicvoidrun()while(true)doublea=0,b=0,c=0,root1=0,root2=0;trya=in.readDouble();/堵塞状态,除非读取到信息。b=in.readDouble();c=in.readDouble();doubledisk=b*b-4*a*c;root1=(-b+Math.sqrt(disk)/(2*a);root2=(-b-Math.sqrt(disk)/(2*a);out.writeDouble(root1);out.writeDouble(root2);catch(IOExceptione)System.out.println(客户离开);break;,/(1)客户端程序.*;importjava.io.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;classClientextendsJFrameimplementsRunnable,ActionListenerJButtonconnection,computer;JTextFieldinputA,inputB,inputC;JTextAreashowResult;Socketsocket=null;DataInputStreamin=null;DataOutputStreamout=null;Threadthread;publicClient()socket=newSocket();/待连接的套接字。connection=newJButton(连接服务器);computer=newJButton(求方程的根);computer.setEnabled(false);/没有和服务器连接之前,该按钮不可用。inputA=newJTextField(0,12);inputB=newJTextField(0,12);inputC=newJTextField(0,12);BoxboxV1=Box.createVerticalBox();boxV1.add(newJLabel(输入2次项系数);boxV1.add(newJLabel(输入1次项系数);boxV1.add(newJLabel(输入常数项);BoxboxV2=Box.createVerticalBox();boxV2.add(inputA);boxV2.add(inputB);boxV2.add(inputC);BoxbaseBox=Box.createHorizontalBox();baseBox.add(boxV1);baseBox.add(boxV2);Containercon=getContentPane();con.setLayout(newFlowLayout();showResult=newJTextArea(8,18);con.add(connection);con.add(baseBox);con.add(computer);con.add(newJScrollPane(showResult);computer.addActionListener(this);connection.addActionListener(this);thread=newThread(this);setBounds(100,100,360,310);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);,publicvoidrun()while(true)trydoubleroot1=in.readDouble();/堵塞状态,除非读取到信息。doubleroot2=in.readDouble();showResult.append(n两个根:n+root1+n+root2);showResult.setCaretPosition(showResult.getText().length();catch(IOExceptione)showResult.setText(与服务器已断开);computer.setEnabled(false);break;publicvoidactionPerformed(ActionEvente)if(e.getSource()=connection)try/请求和服务器建立套接字连接if(socket.isConnected()elseInetAddressaddress=InetAddress.getByName();InetSocketAddresssocketAddress=newInetSocketAddress(address,4331);socket.connect(socketAddress);in=newDataInputStream(socket.getInputStream();out=newDataOutputStream(socket.getOutputStream();computer.setEnabled(true);thread.start();catch(IOExceptionee)if(e.getSource()=computer)trydoublea=Double.parseDouble(inputA.getText(),b=Double.parseDouble(inputB.getText(),c=Double.parseDouble(inputC.getText();doubledisk=b*b-4*a*c;if(disk=0)out.writeDouble(a);out.writeDouble(b);out.writeDouble(c);elseinputA.setText(此2次方程无实根);catch(Exceptionee)inputA.setText(请输入数字字符);publicstaticvoidmain(Stringargs)Clientwin=newClient();,2.3项目实战:聊天室系统的设计与实现,1.系统
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冷链物流特殊作业安全技术措施
- EPC工程项目跨部门配合协调措施
- 基坑工程质量安全隐患及防治措施
- 配电网络负荷分配调控难点及措施
- 校本研修教师成长总结范文
- 新人教版七年级历史下册教学设计计划
- 传统文化与现代艺术融合展览创新创业项目商业计划书
- 互动式造浪机创新创业项目商业计划书
- 话题作文“记忆中的人、事儿”(2024年四川眉山中考满分作文13篇附审题指导)
- 2025至2030中国复古灯行业发展现状及营销策略分析报告
- 剪刀式登高车安全技术交底
- (外研版3起)英语五年级上册单词字帖书写练习(手写体)高清打印版
- 人音版4年级上册第三单元快乐的校园
- 品牌推广战略实战手册
- 年产10万吨连续玄武岩纤维项目可行性研究报告商业计划书
- YC/T 177-2024卷烟工业企业标准体系构成及指南
- 工程总承包项目管理组织方案
- 化工建设综合项目审批作业流程图
- 2024年互联网营销师(中级)理论考试题库(附答案)
- 【典型病例】HA380联合CVVH治疗重症胰腺炎复杂病例1例
- 中小企业融资存在的问题及对策分析
评论
0/150
提交评论