




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Socket编程单元九基于TCP的Socket编程目录CONTENTS1基于UDP的Socket编程29.4.1基于TCP的Socket编程
根据ServerSocket用于服务器端,而Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket,它们的工作都是通过Socketlmp1类及其子类完成的。关于Socket、ServerSocket及Socketlmp1类的具体方法,这里不再一一介绍,需要这些类时,请大家自行查阅JDKAPI文档。9.4.1基于TCP的Socket编程
图9.7展示了基于TCP的Socket编程的示意图。图9.7基于TCP的Socket编程
在服务器端,创建一个ServerSocket对象,并指定一个端口号,使用ServerSocket类的accept()服务器处于阻塞状态,等待用户请求。
在客户端,通过指定一个InetAddress对象和一个端口号,创建一个Socket对象,通过这个Socket对象,连接到服务器。9.4.1基于TCP的Socket编程
首先我们来看服务器端程序,具体代码如下:import.*;importjava.io.*;publicclassTestServer{publicsaticvoidmain(Stringargs[]){try{//创建一个ServerSocket对象,并端口号8888ServerSockets=newServerSocket(8888);while(true){//侦听并接受到此套接字的连接Sockets1=s.accept();OutputStreamos=s1.getOutputStream();DataOutputStreamdos=newDataOutputStream(os);dos.writeUTF("客户端IP:"+s1.getInetAddress().getHostAddress()+"客户端端口号:"+s1.getPort());dos.close();sl.close();}}catch(IOExceptione){e.printStackTrace();System.out.println("程序运行出错!");}}}9.4.1基于TCP的Socket编程
该服务器端程序的作用就是监听8888端口,当有发送到本机8888端口的Socket请求时,建立输出流,将通过accept()方法创建的Socket对象的IP地址和端口号输出到客户端。编译、运行程序,使服务器启动并处于监听状态。下面编写客户端程序9.4.1基于TCP的Socket编程
import.*;importjava.io.*;publicclassTestClient{publicstaticvoidmain(Stringargs[]){try{//通过IP地址和端口号,创建一个Socket对象Sockets1=newSocket("127.0,0.1",8888);//建立输入数据流InputStreamis=s1.getInputStream();DataInputStreamdis=newDataInputStream(is);System.out.println(dis.readUTF());dis.close();s1.close();}catch(ConnectExceptione){e.printStackTrace();System.err.println("服务器连接失败!");}catch(IOExceptione){e.printStackTrace();}}}9.4.1基于TCP的Socket编程
该客户端程序通过IP地址和端口号8888,创建一个客户端Socket对象,建立输入数据流,通过输入数据流读取指定1P地址和端口号上服务器端程序的输出,并在控制台将服务器的输出显示出来。编译、运行程序,结果如图9.8所示。图9.8使用JavaSocket编程9.4.1基于TCP的Socket编程
在这个通过JavaSocket编程实现的客户端、服务器端程序中,客户端没有请求的具体内容,只要有请求,服务器就将指定的内容发送给客户端,客户端将接收的内容显示出来。接下来对上面的案例进行调整,服务器端可以接收客户端请求的内容,并显示在服务器端控制台上。具体服务器端程序代码如下:importjava.io.*;import.*;publicclassTestSockServer{publicstaticvoidmain(String[]args){InputStreamin=null;OutputStreamout==null;try{ServerSockets=newServerSocket(8888);Sockets1=s.accept();in=s1.getInputStream();out=s1.getOutputStream();DataOutputStreamdos=newDataOutputStream(out);DataInputStreamdis=newDataInputStream(in);Stringstr=null;if((str=dis.readUTF())!=null){System.out.println("客户端输入内容:"+str);System.out.println("客户端IP:"+s1.getInetA,ddress().getHostAddress());System.out.println("客户端端口号:"u+s1.getPort());}dos.writeUTF("服务器端反馈客户端!");dis.close();dos.close();s1.olose();}catch(IOExceptione){e.printStackTrace();}}}9.4.1基于TCP的Socket编程
客户端代码如下:import.*;importjava.io.*;publicclassTestSockClient{publicstaticvoidmain(String[]args){InputStreamis=null;OutputStreamos=null;Strings=null;try{Socketsocket=newSocket("localhost",8888);is=socket.getInputStream();os=socket.getOutputStream();DataInputStreamdis=newDataInputStream(is);DataOutputStxeamdos=newDataOutputStream(os);//客户端向服务器端发送请求的内容dos.writeUTF("客户端提交服务器");if((s=dis.readUTF())!=null)System.out.println(s);dos.close();dis.close();socket.close();}catch(UnknownHostExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}}9.4.1基于TCP的Socket编程
编译、运行服务器端、客户端程序,运行结果如图9.9和图9.10所示。图9.9Socket编程服务器端图9.10Socket编程客户端9.4.2基于UDP的Socket编程
UDP是用户数据报协议,它提供的是无连接、不可靠信息传送服务。Java主要提供了两个类来实现基于UDP的Socket编程。 DatagramSocket:此类表示用来发送和接收数据报包的套接字。数据报套接字是包投递服务的发送或接收点,每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。在DatagramSocket上总是启用UDP广播发送。 DatagramPacket:此类表示数据报包。数据报包用来实现无连接包投递服务,每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。9.4.2基于UDP的Socket编程
图9.11展示了基于UDP的Socket编程的示意图。图9.11基于UDP的Socket编程9.4.2基于UDP的Socket编程
DatagramPacket类主要有两个构造函数。
一个用来接收数据DatagramPacket(byte[]recyBuf,intreadLength),用一个字节数组接收UDP包,recyBuf数组在传递给构造函数时是空的,而readLength值用来设定要读取的字节数。
一个用来发送数据DatagramPacket(byte[]sendBuf,intsendLength,InetAddressiaddr,intport),建立将要传输的UDP包,并指定IP地址和端口号。
接下来通过一个案例,演示Java如何实现基于UDP的Socket编程9.4.2基于UDP的Socket编程import.*;importjava.io.*;publicclassTestUDPServer{publicstaticvoidmain(Stringargs[])throwsException{//创建数据报包的套接字,端口号8888DatagramSocketds=newDatagramSocket(8888);bytebuf[]=newbyte[1024];//创建接收的数据报包DatagramPacketdp=newDatagramPacket(buf,buf.length);System.out,println("务器端:");while(true){//从此套接字接收数据报包ds.receive(dp);ByteArrayInputStreambais=newByteAirayInputStream(buf);DataInputStreamdis=newDataInputStream(bais);System.out.println(dis.readLong());}}}import.*;importjava.io.*;publicclassTestUDPClient{publicstaticvoidmain(Stringargs[])throwsException{longn=10000L;ByeArrayOutputStreambaos=newByteArrayOutputStream();DataOutputStreamdos=newDataOutputStream(baos);dos.writeLong(n);byte[]buf=baos.toByteArray();System.cmt.println("客户端:");System.out.println(buf.length);//创建数据报包的套接字,端口号9999DatagramSocketds=newDatagramSocket(9999);//创建发送的数据报包DatagramPacketdp=newDatagramPacket(buf,buf.length,newInetSock
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/IEC 23090-8:2025 EN Information technology - Coded representation of immersive media - Part 8: Network based media processing
- 【正版授权】 IEC 63119-1:2025 FR Information exchange for electric vehicle charging roaming service - Part 1: General
- 卒中相关知识课件
- 河南小升初鹤壁数学试卷
- 健康素养66项培训课件
- 贵阳市一模高三数学试卷
- 广西钦州市初二数学试卷
- 2025届广东省惠州市惠东县燕岭学校高一物理第二学期期末质量检测试题含解析
- 健康科普课件要求
- 2025年上海市华东师范大学二附中物理高二第二学期期末质量跟踪监视模拟试题含解析
- 2025年北京市中考招生考试数学真题试卷(真题+答案)
- 原创领袖的风采-易发久
- 沭阳如东中学教学工作十八条措施与有效教学的实施策略
- DB33∕642-2019 热电联产能效、能耗限额及计算方法
- 考试录用公务员笔试监考工作培训
- GM∕T 0036-2014 采用非接触卡的门禁系统密码应用指南
- 钱江杯优质工程检查表
- 内蒙古高中毕业生学籍表毕业生登记表学年评语表成绩单身体健康检查表完整版高中档案文件
- NMRV减速机说明
- 小升初火车过桥问题
- 动叶可调式轴流风机动叶调节原理图
评论
0/150
提交评论