综合课程实习-网络程序设计.ppt_第1页
综合课程实习-网络程序设计.ppt_第2页
综合课程实习-网络程序设计.ppt_第3页
综合课程实习-网络程序设计.ppt_第4页
综合课程实习-网络程序设计.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2 Socket通信程序设计,文志强 计算机与通信学院,基本内容,2.1 Socket通信原理 2.2 Socket 网络编程 2.3 项目实战,2.1 Socket通信原理,IP地址 : 主机标识 端 口 : 服务类型,Socket = IP(address) + Port(server),套接字通讯首先强调发送方和接收方的区别,同时也明确服务器和客户机之间的不同 一个客户机必须知道服务器的地址和端口,以便进行申请连接 一个服务器从它接收到的数据报文中读取客户端的地址和端口 套接字通过,确定服务器和客户机的地址和端口以及协议,利用java.io实现数据的传输,Socket程序基本机理,Jav

2、a-Internet语言 具备强大网络通信功能,基于套接字(Socket)通信方式,流套接字,TCP协议 (Transmission Control Protocol),UDP协议 (User Datagram Protocol),数据报套接字,Java的Socket属于流式套接字通信,采用TCP协议,提供面向连接的服务,实现可靠的通信。,Java Socket,J提供两个类,实现Socke通信:,Socket编程属低层次网络编程,功能强大,相对URL网络编程提供更多的功能和更灵活的控制,复杂度较高。,ServerSocket - 服务器端 Socket - 客户端通,操作TCP 套接字的发送

3、和接收需要借助java.io包的 InputStream / OutputStream 完成,分别通过方法实现: Socket.getInputStream() / Socket.getOutputStream(),Socket/ServerSocket构造函数,Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号 Socket(InetAddress address, int port, InetAddress localAddr, i

4、nt localPort) 创建一个套接字并将其连接到指定远程端口上的指定远程地址 Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号 Socket(String host, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程主机上的指定远程端口,ServerSocket() 创建非绑定服务器套接字 ServerSocket(int port) 创建绑定到特定端口的服务器套接字 ServerSocket(int port, int backlog) 利用指

5、定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号 ServerSocket(int port, int backlog, InetAddress bindAddr) 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器,Socket/ServerSocket主要方法,Java Socket通信原理,通讯的两个程序分别为Client/Server。Client端程序申请连接,Server端程序监听所有端口,判断是否有Client程序的服务请求。 当Client程序请求某端口连接时, Server程序将“套接字”连接到该端口上,此时, Client/Ser

6、ver程序建立一个虚连接。 Client程序向套接字写入请求, Server程序处理请求并把处理结果通过套接字送回给Client 。 通信结束时,拆除所建的虚拟连接。,Socket网络通信程序由三个基本部分组成: (1)建立连接: 通信双方在通信开始之前,建立一条专用的虚拟连接通道 (2)数据通信: 利用虚拟连接通道传送数据信息进行通信 (3)拆除连接: 通信结束时,将所建的虚拟连接拆除。,2.2 Socket 网络编程,Server端,Client端,service = ServiceSocket (port_number) 创建service对象,以TCP服务实现端口监听 socket =

7、 ServerSocket.accept() 创建socke对象, 接收用户访问请求,Socket = Socket (port_number) 创建socke对象,建立连接,发送访问请求,InputStream Socket对象输入流OutputStream Socket对象输出流 通过socke对象实现与Client端数据传输,OutputStream Socket对象输出流 InputStream Socket对象输入流 通过socke对象,实现与Servert端数据传输,socket.close() 关闭Socke关闭结束与Client端的连接 service. close() 关闭监

8、听程序,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() 停止提供

9、TCP连接服务,一个ServerSocket对象和一个Socket对象,一个Socket对象,Socket.close() 关闭TCP连接,ServiceSocket (port) 创建ServiceSocke对象,提供TCP连接服务,accept () 在指定的端口监听客户端请求联结创建,InputStream 获得Socket对象输入流,Socket.close() 关闭TCP连接,OutputStream 获得Socket对象输出流,ServerSocket 对象,访问监听,利用构造函数创建ServerSocke/Socket两个对象,建立双向连接 引入异常处理机制 建立I/O流 实现读

10、/写数据流 释放连接,ServerSocket程序基本框架结构,Java ServerSocket,Socket创建一个服务器的典型工作流程: (1)创建一个指定端口的ServerSocket对象。 (2)ServerSocket对象调用accept()方法创建一个Socket对象。实现端口监听连接请求。-但accept() 收到客户端连接请求,且返回连接客户端与服务器的Socket对象,则双方的虚电路建立完成。 (3)调用getInputStream()方法和getOutputStream()方法获得Socket对象的输入流和输出流。 (4)服务器与客户端根据协议交互数据。 (5)直至一端请

11、求关闭连接,服务器和客户端连接终止。 (6)服务器回到第2步,继续监听下一次的连接。而客户端则运行结束。,import java.io.*; import .*; public class TcpServer static public void main(String args) try ServerSocket svrsoc=new ServerSocket(8000); Socke soc=svrsoc.accept(); InputStream is=soc.getInputStream(); /Socket输入流 DataInputStream in=new DataInputStr

12、eam(is); OutputStream os=soc.getOutputStream(); /Socket输出流 PrintStream out=new PrintStream(os); /*服务器创建输入流对象in和输出流对象out,接收客户输入信息(in)和向客户发送信息(out), 同样,客户端也建立两个对象,与服务器双向通信。服务器向输出流信息都成为客户输入信息,而客户输出的信息送入服务者的输入流。*/ InetAddress clientIP=soc.getInetAddress(); System.out.println(Clients IP address:+clientIP

13、); int port=soc.getPort(); /得到客户方的端口 System.out.println(Clients port:+port); out.println(Welcome!.); String str=in.readLine(); /在输入流对象in中读一行 while(!str.equals(“quit”) System.out.println(“客户端:+str); str=in.readLine(); System.out.println(“客户关机.); catch(Exception e) System.out.println(Error:+e); finall

14、y is.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连接服务,服务器套接字程序,Java Sock

15、et,Socket创建一个客户端的典型工作流程: (1)创建一个指定地址和端口的Socket对象,建立服务器与客户端连接。 (2)调用getInputStream()方法或getOutputStream()方法获得Socket对象的输入流和输出流。 (3)服务器与客户端连接根据协议交互数据。 (4)请求关闭连接,服务器和客户端连接终止。,import .*; import java.io.*; public class TcpClient static public void main(String args) try Socket soc=new Socket(localhost,8000)

16、; System.out.println(Connecting to the Server.); InputStream is = soc.getInputStream(); OutputStream os = soc.getOutputStream(); DataInputStream in= new DataInputStream(is); PrintStream out = new PrintStream(os); String strin =in.readLine(); System.out.println(“服务器端:+strin); byte bmsg = new byte20;

17、System.in.read(bmsg); String msg=new String(bmsg,0); msg=msg.trim(); while(!msg.equals(quit) /从键盘循环读入,直到输入”quit”为止 out.println(msg); System.in.read(bmsg); msg=new String(bmsg,0); msg=msg.trim(); out.println(msg); catch (Exception e) System.out.println(Error: +e); finally is.close(); /关闭输入流 os.close(

18、); /关闭输出流 soc.close(); /关闭socket,拆除链路 System.exit(0); ,1、创建指定地址和端口的Socket对象 建立服务器与客户端连接,2、调用getInputStream()或getOutputStream()方法获得Socket对象的输入流和输出流,3、服务器与客户端连接根据协议交互数据,4、关闭请求连接,服务器和客户端连接终止,客户机套接字程序,Socke通信编程 - 异常处理,ServerSocket和socket编程需要进行try-catch异常处理 (1)服务器端: ServerSocket server; Socket socket; tr

19、y server=new ServerSocket(port); socket=server.accept(); . catch(Exception e) System.out.println(“Error occurred:”+e); (2)客户端: Socket socket; try socket=new Socket(“Server Name”, port); catch(Exception e) System.out.println(“Error occurred:”+e); ,建立Socket连接后,利用方法getOutputStream()和getInputStream()建立向

20、Socket读写数据的I/O流。 需要进行try-catch异常处理。 try InputStream ins = socket. getInputStream(); OutputStream outs = socket. getOutputStream(); catch(Exception e) System.out.println(“Error occurred:”+e); ,Socke通信编程 建立/输出流,获取Socket的输入/输出流后,需要对两个流对象建立数据流的读/写操作 InputStream ins = socket. getInputStream(); OutputStre

21、am outs = socket. getOutputStream(); 或 PrintStream out = new PrintStream(outs); 读入一个字符串并将其长度写入输出流中,则用: String str = inn.readLine(); out.println(str.length();,Socke通信编程 读写数据流,无论是服务器程序还是客户端程序,通信结束时,必须断开连接并释放所占用的资源。 Java断开连接方法: close(); (1)关闭输入输出流 停止数据传输 (2)关闭socket 终止申请服务 (3)关闭server socket 关闭监听服务,Soc

22、ke通信编程 释放连接,问题: Socket设计输入流和输出流的处理,客户机与服务器进行数据读取时将引起堵塞。 解决办法: 服务器一旦接受到用户的Socket,将专门为该用户建立在一个独立的线程,进行数据的访问交换操作。,/(2) 服务器端程序 import java.io.*; import .*; import java.util.*; public class Server public static void main(String args) ServerSocket server=null; ServerThread thread; Socket you=null; while(t

23、rue) try server=new ServerSocket(4331); catch(IOException e1) System.out.println(“正在监听”); /ServerSocket对象不能重复创建。 try you=server.accept(); System.out.println(客户的地址:+you.getInetAddress(); catch (IOException e) System.out.println(正在等待客户); if(you!=null) new ServerThread(you).start(); /为每个客户启动一个专门的线程。 el

24、se continue; ,class ServerThread extends Thread Socket socket; DataOutputStream out=null; DataInputStream in=null; String s=null; ServerThread(Socket t) socket=t; try in=new DataInputStream(socket.getInputStream(); out=new DataOutputStream(socket.getOutputStream(); catch (IOException e) public void

25、run() while(true) double a=0,b=0,c=0,root1=0,root2=0; try a=in.readDouble(); /堵塞状态,除非读取到信息。 b=in.readDouble(); c=in.readDouble(); double disk=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 (IOException e) System.out.

26、println(客户离开); break; ,/(1) 客户端程序 import .*; import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; class Client extends JFrame implements Runnable,ActionListener JButton connection,computer; JTextField inputA,inputB,inputC; JTextArea showResult; Socket socket=null; Data

27、InputStream in=null; DataOutputStream out=null; Thread thread; public Client() socket=new Socket(); /待连接的套接字。 connection=new JButton(连接服务器); computer=new JButton(求方程的根); computer.setEnabled(false); /没有和服务器连接之前,该按钮不可用。 inputA=new JTextField(0,12); inputB=new JTextField(0,12); inputC=new JTextField(0,

28、12); Box boxV1=Box.createVerticalBox(); boxV1.add(new JLabel(输入2次项系数); boxV1.add(new JLabel(输入1次项系数); boxV1.add(new JLabel(输入常数项); Box boxV2=Box.createVerticalBox(); boxV2.add(inputA); boxV2.add(inputB); boxV2.add(inputC); Box baseBox=Box.createHorizontalBox(); baseBox.add(boxV1); baseBox.add(boxV2)

29、; Container con=getContentPane(); con.setLayout(new FlowLayout(); showResult=new JTextArea(8,18); con.add(connection); con.add(baseBox); con.add(computer); con.add(new JScrollPane(showResult); computer.addActionListener(this); connection.addActionListener(this); thread = new Thread(this); setBounds(

30、100,100,360,310); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ,public void run() while(true) try double root1=in.readDouble(); /堵塞状态,除非读取到信息。 double root2=in.readDouble(); showResult.append(n两个根:n+root1+n+root2); showResult.setCaretPosition(showResult.getText().length(); catch(

31、IOException e) showResult.setText(与服务器已断开); computer.setEnabled(false); break; public void actionPerformed(ActionEvent e) if(e.getSource()=connection) try /请求和服务器建立套接字连接 if(socket.isConnected() else InetAddress address=InetAddress.getByName(127.0.0.1); InetSocketAddress socketAddress=new InetSocketA

32、ddress(address,4331); socket.connect(socketAddress); in =new DataInputStream(socket.getInputStream(); out = new DataOutputStream(socket.getOutputStream(); computer.setEnabled(true); thread.start(); catch (IOException ee) if(e.getSource()=computer) try double a=Double.parseDouble(inputA.getText(), b=

33、Double.parseDouble(inputB.getText(), c=Double.parseDouble(inputC.getText(); double disk=b*b-4*a*c; if(disk=0) out.writeDouble(a); out.writeDouble(b); out.writeDouble(c); else inputA.setText(此2次方程无实根); catch(Exception ee) inputA.setText(请输入数字字符); public static void main(String args) Client win=new Client(); ,2.3 项目实战:聊天室系统的设计与实现,1. 系统整体框架(C/S模式),2. 模块设计,客户端,登陆,修改用户名,发送聊天信息,接收并显示聊天信息,修改服务器地址,服务器端

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论