【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();

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


原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2016-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SpringBoot 核心技术

SpringCloud组件 & 源码剖析:Eureka服务注册方式流程全面分析

在SpringCloud组件:Eureka服务注册是采用主机名还是IP地址?文章中我们讲到了服务注册的几种注册方式,那么这几种注册方式的源码是怎么实现的呢?我们...

11310
来自专栏北京马哥教育

linux服务器下LNMP安装与配置方法

云豆贴心提醒,本文阅读时间6分钟 一、准备 1.准备php函数的rpm包 2.准备lnmp其他的源代码包 3.安装php-5.2.14源代码包所需要的函数支...

40590
来自专栏分布式系统进阶

Kafka的日志管理模块--LogManagerKafka源码分析-汇总

a. 如果kafka进程是优雅干净地退出的,会创建一个名为.kafka_cleanshutdown的文件作为标识; b. 启动kafka时, 如果不存在该文件...

20810
来自专栏生信宝典

Linux服务器数据定期同步和备份方式

数据安全是做数据分析的人需要关注的一大问题。对于我们分析的关键数据、使用的关键脚本都需要定期备份。 scp 最简单的备份方式,就是使用cp (本地硬盘)或scp...

44890
来自专栏idba

ZanDB基于Celery定时任务的二次开发

ZanDB早期的任务需求中,大部分都是针对servant(跑在主机上的agent)做任务调度。也就是说,一期的任务系统,满足的是在特定时刻调用特定主机执行特定的...

16820
来自专栏Spark学习技巧

大数据最佳实践 | HBase客户端

1减少RPC调用的方法 1.1.问题提出 HBase中rowkey是索引,任何对全表的扫描或是统计都需要用到scan接口,一般都是通过next()方法获取数据...

47170
来自专栏Java后端技术栈

图解Storm并发机制及其执行流程

在上一篇,我们对Storm集群进行了搭建,并使用Java完成了代码的演示,我们知道在Storm中,先要设计一个用于实时计算的图状结构,我们称之为拓扑(topol...

15020
来自专栏程序手艺人

nghttp2 - HTTP/2 C Library 简明教程(一)

479120
来自专栏FreeBuf

Kali下常用安全工具中文参数说明(160个)

*本文原创作者:屌丝绅士,属Freebuf原创奖励计划,转载请注明来自FreeBuf 由于篇幅有限,只列举部分,ps:第一次发有什么不对的 还望各位大大指正 n...

1.3K90
来自专栏IT可乐

JS 中 cookie 的使用

1、cookie 是什么?   ①、cookie 是存储于访问者计算机中的变量。每当一台计算机通过浏览器来访问某个页面时,那么就可以通过 JavaScript ...

34870

扫码关注云+社区

领取腾讯云代金券