前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【java网络】编程基础

【java网络】编程基础

作者头像
程序员互动联盟
发布2018-03-16 11:42:37
1.1K0
发布2018-03-16 11:42:37
举报
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();

转载自:http://blog.csdn.net/hbrqlpf/article/details/1845648


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档