Java 网络编程

 
Java 网络编程
基于套接字的通信可以使程序通过指定的套接字进行通信。套接字是两个主机之间逻辑链接的端点,可以用于发送和接收数据,Java对套接字的处理非常类似于对输入输出操作的处理,因此,程序从socket中读写就像从文件中读写一样容易
Java支持流套接字和数据报套接字:流套接字使用传输控制协议TCP进行数据传输,而数据报套接字使用的是用户数据报协议UDP进行数据传输
1 、客户/ 服务器计算模式
网络程序设计通常涉及一个服务器和一个或多个客户,客户向服务器发送请求,服务器响应请求。服务器创建一个服务器套接字,一旦建立起与客户的连接,服务器就利用客户套接字连接用户
1.1 、服务器套接字
要创建一个服务器,需要创建一个服务器套接字(server socket)并把它附加到一个端口上,服务器从端口监听连接。端口标识套接字上的TCP服务,断口号的范围从0到65536,但是0到1024号是为特权服务保留的端口
ServerSocket serverSocket=new ServerSocket(port);
1.2 、客户套接字
创建服务器套接字之后,服务器可以使用下述数据监听连接:
Socket socket= serverSocket.accept();
这个语句会一直等待,直到一个客户与服务器套接字建立连接。
客户执行下列语句与服务器进行连接:
Socket socket= new Socket(serverName,port);
上述语句可以打开一个套接字,使得客户程序能够与服务器进行通信。其中serverName是服务期的Internet主机名或IP地址
DNS:Internet上一种把主机名翻译成IP地址的服务
1.3 、通过套接字进行数据传输
服务器接受连接后,服务期和客户之间的通信就行输入输出(I/O)流一样开始进行
为了获得输入输出流,在套接字对象上使用getInputStream()方法和getOutputStream()方法:
InputStream input=socket.getInputStream();
OutputStream output=socket.getOutputStream();
InputStream流和OutputStream流涌来读取或写入字节
2 、网络地址类InetAddress
有时候想知道谁正连接在服务器上。可以使用类InetAddress来求得客户的主机名和IP地址。InetAddress类是IP地址的一个模型。使用下述语句可以在套接字上为客户创建InetAddress的一个实例:
InetAddress inetAddress=socket.getInetAddress();
主机名:inetAddress.getHostName()
IP地址:inetAddress.getHostAddress()
还可以使用静态方法getByName通过主机名或IP地址创建InetAddress的一个实例:
InetAddress address=InetAddress.getByName(“www.bit.edu.cn”)
3 、多客户服务
多个客户同时与单个服务器连接是非常常见的,典型的情形是,一个服务器程序连续不断地在服务器上运行,Internet上各处的用户都可能想与它建立连接。可以使用线程处理服务器上多个客户的同步问题,为每个连接创建一个线程
while(ture){
 Socket socket= serverSocket.accept();
 Thread thread=new ThreadClass(socket);
 thread.start();
}
服务器套接字可以有多个连接,while循环的每次迭代创建一个新的连接,无论何时,只要建立一个新的连接,就创建一个新线程来处理服务器与新客户之间的通信,这样,就可以有多个连接同时运行
4 、从Web 服务器上读取文件
Java允许通过Web服务器从远程主机上读取文件
为了读取一个文件,首先要为文件创建一个URL:
URL url=new URL(“www.bit.edu.cn/index.html”)
然后,可以使用定义在URL类中的openStream()方法,对文件的URL打开一个输入流:
InputStream inputStream=url.openStream();
现在可以从输入流中读取数据了
5 、数据报套接字
如果客户与服务器利用流套接字进行通信,它们之间拥有一条专用的点对点通道。为了通信,它们建立连接,传输数据,然后关闭连接。流套接字使用TCP协议进行数据传输。
如果客户与服务器通过数据报套接字进行通信,它们之间没有点对点的专用通道,数据是用分组进行传输的。数据报套接字是用用户数据报协议(UDP)
Java.net.package包包含两个类DatagramPacket和DatagramSocket类,利用它们可以编写使用数据报在网络上发送和接收分组的程序
5.1 、DatagramPacket
数据报分组类DatagramPacket表示数据报的分组。数据报的分组用来实现无连接的分组传输服务,每个分组仅仅依据包含在分组内的信息,从一台机器发送到另一台机器
要为来自客户的传送创建DatagramPacket对象,可以使用构造方法:
DatagramPacket(byte[] buf,int length,InetAddress host,int port)
一旦创建了数据报分组,就可以使用getData方法和setData方法获取和设置分组中的数据
5.2 、DatagramSocket
数据报套接字类DatagramSocket表示发送和接收数据报分组的套接字。数据报套接字是分组传输服务的发送和接收点。每个在套接字上发送和接收的分组都是独立编址和路由的
要创建服务器的数据报套接字,使用构造方法:
DatagramSocket(int port)
将套接字绑定到本地主机指定的端口上
要创建客户的数据报套接字,使用构造方法:
DatagramSocket()
将套接字绑定到本地主机任意一个可用的端口上
为了发送数据,需要创建一个分组,填入内容,指定接收机的Internet地址和端口号,并在DatagramSocket对象上调用发送分组的send(packet)方法
为了接收数据,需要创建一个空的分组,并在DatagramSocket对象上调用接受分组的receive(packet)方法
5.3 、数据报程序设计
数据报没有服务器套接字的概念,从某种意义上说,数据报程序设计不同于流套接字编程,客户和服务器都使用DatagramSocket发送和接收分组
通常,将一个应用程序设计成服务器,使用指定端口的构造方法DatagramSocket(int port)创建数据报套接字。客户创建数据报套接字时可以不指定端口号,在运行时动态的进行选择。当客户向服务器发送一个分组时,客户的IP地址和端口号都包含在分组内,服务器能够从分组中提取它们,并利用它们
程序通过数据报套接字发送和接收分组:
DatagramServer
Datagramsocket socket;
socket= DatagramSocket(8000);
byte[] buf=new bute[256];
DatagramPacket receivePacket=new DatagramPacket(buf,buf.length);
socket.receive(receivePacket);
//从buf中获取数据或调用方法receivePacket.getData();
DatagramPacket sendPacket=new DatagramPacket(buf,buf.length);
//在sendPacket中设置客户的端口号和InetAddress
//在buf数组中填入内容
socket.send(sendPackage);
DatagramClient
Datagramsocket socket;
socket=new Datagramsocket();
byte[] buf=new bute[256];
InetAddress address=new InetAddress(serverName);
DatagramPacket sendPacket=new DatagramPacket(buf,buf.length,address,8000);
//在buf数组中填入内容
socket.send(sendPackage);
socket.receive(receivePacket);
//从buf中获取数据或调用方法receivePacket.getData();
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值