----------android培训、java培训期待与您交流!----------
java的网络编程提供了两种网络通信协议:TCP(传输控制协议)和UDP(数据报协议).
TCP:是可靠的传输协议,传输前会采用“三方握手”的方式建立连接,已保证传输的可靠信
UDP:是不可靠的传输协议,既发送出去的数据不一定收到,聊天工具一般采用此种协议
IP地址介绍
互联网上的每一台计算机都有一个唯一标示自己的标记,这个标记就是IP地址。java中用InetAddress来表示IP地址的对象
InetAddress类
InetAddress类主要表示IP地址,这个类有2个子类:Inet4Address和Inet6Address.常用方法如下
getByName(String host)根据主机名称取得InetAddress对象
InetAddress getLocalHost()通过本机取得Inet4Address对象
getHostName()得到IP地址
代码实例--测试InetAddress类
public class Demo {
public static void main(String[] args) throws Exception {
InetAddresslocAdd = null ;
InetAddress remAdd = null ;
locAdd= InetAddress. getLocalHost() ;//得到本机
System. out.println("本机的IP地址:" + locAdd.getHostAddress()) ;
System. out.println("本机是否可达:" + locAdd.isReachable(5000)) ;
}
}
结果:本机的IP地址:192.18.78.1
本机是否可达:true
URL(统一资源定位符)
URL统一资源定位符,可以直接使用此类找到互联网上的资源
常用方法
URL(String spec)根据指定的地址实例化对象
RUL(String protocol,String host,int port,String file)实例化url对象,指定协议主机,端口名称,资源文件
URLConnection openConnection()取得一个URLConnection对象
InputStream openStream()取得输入流
代码实例—读取http://hao.360.cn/的一个子页面资源
import java.net.URL ;
import java.io.InputStream ;
import java.util.Scanner ;
public class Demo{
public static void main(String args[]) throws Exception { //所有异常抛出
URLurl = new URL("http","hao.360.cn" ,80, "brother.html#!tv" ) ;
InputStreaminput = url.openStream() ; //打开输入流
Scannerscan = new Scanner(input); //实例化Scanner类
scan.useDelimiter( "\n") ; //设置读取分隔符
while(scan.hasNext()){
System. out.println(scan.next()) ;
}
}
};
URLConnection对象
是封装访问远程网络资源的一般方法的类,通过他可以建立与远程服务器的连接,检查远程资源的属性
常用方法
int getContentLength()取得内容的长度
String getContentType()取得内容的类型
InputStream getInputStream()取得连接的输入流
代码实例-取得URL的基本信息
public class Demo{
public static void main(String args[]) throws Exception { //所有异常抛出
URLurl = new URL("http://www.sohu.com" ) ;
URLConnectionurlCon = url.openConnection() ; //建立连接
System. out.println("内容大小:" + urlCon.getContentLength()) ;
System. out.println("内容类型:" + urlCon.getContentType()) ;
}
};
结果:
内容大小:-1
内容类型:text/html
TCP程序设计
在java中使用Socket(套接字)完成TCP的程序,使用此类可以方便的建立可靠的,双向的,持续,,点对点的通信连接
在Socket的程序中,服务器端使用ServerSocket等待客户端的连接,对于java的网络程序来说,每一个客户端都使用一个Socket对象
ServerSocket类与Socket类
ServerSocket类主要用在服务器
ServerSocket类常用方法
ServerSocket(int port)创建ServerSocket对象,指定监听的端口
Socket accept() 等待客户端连接
在服务器端运行时都使用accep()方法后等待客户端连接,此方法执行之后服务器进入阻塞状态,知道客户端连接之后程序才可以向下继续执行。此方法的返回值类型是Socket,每一个Socket都表示一个客户端对象
InetAddress getInetAddress()返回服务器IP
close()关闭ServerSocket
Socket类的常用方法
Socket(String host,int port)构造Socket对象,指定主机名称和端口
InputStream getInputStream() 返回套接字输入流
OutputStream getOutputStream() 返回套接字输出流
close()关闭套接字
代码实例---服务器向客户端输出“hello world”
服务器代码
public class HelloServer{
public static void main(String args[]) throws Exception { //所有异常抛出
ServerSocketserver = null ; //定义ServerSocket类
Socketclient = null ; //表示客户端
PrintStreamout = null ; //打印流输出最方便
server= new ServerSocket(8888) ; //服务器在8888端口上监听
System. out.println("服务器运行,等待客户端连接。" ) ;
client= server.accept() ; //得到连接,程序进入到阻塞状态
Stringstr = "hello world" ; //表示要输出的信息
out= new PrintStream(client.getOutputStream()) ;
out.println(str); //向客户端输出信息
client.close();
server.close();
}
};
客户端代码
public class HelloClient{
public static void main(String args[]) throws Exception { //所有异常抛出
Socketclient = null ; //表示客户端
client= new Socket("localhost" ,8888) ;
BufferedReader buf = null ; //一次性接收完成
buf= new BufferedReader( new InputStreamReader(client.getInputStream()));
Stringstr = buf.readLine() ;
System. out.println("服务器端输出内容:" + str) ;
buf.close();
client.close();
}
};
结果:服务器端输出内容:hello world
经典案例——————Echo程序
echo程序是一个网络通信交互的经典案例,成为回应程序。既客户端输入哪些内容,服务器端就会在这些内容前增加“echo:”并将信息发回给客户端
服务端代码
public class EchoServer{
public static void main(String args[]) throws Exception { //所有异常抛出
ServerSocketserver = null ; //定义ServerSocket类
Socketclient = null ; //表示客户端
BufferedReaderbuf = null ; //接收输入流
PrintStreamout = null ; //打印流输出最方便
server= new ServerSocket(8888) ; //服务器在8888端口上监听
boolean f = true ; //定义个标记位
while(f){
System. out.println("服务器运行,等待客户端连接。" ) ;
client= server.accept() ; //得到连接,程序进入到阻塞状态
out= new PrintStream(client.getOutputStream()) ;
//准备接收客户端的输入信息
buf= new BufferedReader(new InputStreamReader(client.getInputStream()));
boolean flag = true ; //标志位,表示可以一直接收并回应信息
while(flag){
Stringstr = buf.readLine() ; //接收客户端发送的内容
if(str==null ||"" .equals(str)){ //表示没有内容
flag= false ; //退出循环
} else{
if("bye" .equals(str)){ //如果输入的内容为bye表示结束
flag= false ;
} else{
out.println( "ECHO : " + str) ; //回应信息
}
}
}
client.close();
}
server.close();
}
};
客户端代码
public class EchoClient{
public static void main(String args[]) throws Exception { //所有异常抛出
Socketclient = null ; //表示客户端
client= new Socket("localhost" ,8888) ;
BufferedReaderbuf = null ; //一次性接收完成
PrintStreamout = null ; //发送数据
BufferedReaderinput = null ; //接收键盘数据
input= new BufferedReader(new InputStreamReader(System.in )) ;
buf= new BufferedReader(new InputStreamReader(client.getInputStream()));
out= new PrintStream(client.getOutputStream()) ;
boolean flag = true ; //定义标志位
while(flag){
System. out.print("输入信息:" ) ;
Stringstr = input. readLine() ; //接收键盘的输入信息
out.println(str);
if("bye" .equals(str)){
flag= false ;
} else{
Stringecho = buf. readLine(); //接收返回结果
System. out.println(echo) ; //输出回应信息
}
}
buf.close();
client.close();
}
};
结果:服务器运行,等待客户端连接。
输入信息:hello
ECHO :hello
UDP简介
TCP的所有操作都必须建立可靠的连接,这样肯定会浪费大量的系统性能。为了减少这种开销,在网络中又提供了另外一种传输协议--UDP,是不可靠的连接,这种协议在各种聊天被广泛的应用。
UDP程序的实现
UDP开发中,使用DatagramPacket类包装一条要发送的信息,之后用DatagramSocket类用于完成信息的发送操作。
DatagramPacket类常用方法
DatagramPacket(byte[] buf ,int length)实例化DatagramPacket对象时指定接收数据的长度
DatagramPacket(byte[] buf ,int length,InetAddress address,int port)实例化DatagramPacket对象时指定接收数据的长度。目标地址,端口
byte[] getData()返回接收的数据
int getLength()返回要发送或接收数据的长度
DatagramSocket类的常用方法
DatagramSocket(int port)创建DatagramSocket对象,并且指定监听的端口
send(DatagramPacket p)发送数据报
receive(DatagramPacket p)接收数据报
要想实现UDP程序,首先应该从客户端编写,在客户端指定要接收的数据的端口和取得数据
代码实例---UDP客户端
public class UDPClient{
public static void main(String args[]) throws Exception{ //所有异常抛出
DatagramSocketds = null ; //定义接收数据报的对象
byte[] buf = new byte[1024] ; // 开辟空间,以接收数据
DatagramPacketdp = null ; //声明DatagramPacket对象
ds= new DatagramSocket(9000) ; //客户端在9000端口上等待服务器发送信息
dp= new DatagramPacket(buf,1024) ; //所有的信息使用buf保存
ds.receive(dp) ; //接收数据
Stringstr = new String(dp.getData(),0,dp.getLength()) + "from " +
dp.getAddress().getHostAddress()+ ":" + dp.getPort() ;
System. out.println(str) ; //输出内容
}
};
服务端代码
public class UDPServer{
public static void main(String args[]) throws Exception{ //所有异常抛出
DatagramSocketds = null ; //定义发送数据报的对象
DatagramPacketdp = null ; //声明DatagramPacket对象
ds= new DatagramSocket(3000) ; //服务端在3000端口上等待服务器发送信息\
Stringstr = "hello World!!!" ;
dp= new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName( "localhost"),9000) ; // 所有的信息使用 buf保存
System. out.println("发送信息。" ) ;
ds.send(dp); //发送信息出去
ds.close();
}
}
小结
1 InetAddress表示IP地址的操作类,可以通过此类指定要连接的主机名称
2 在开发中如果要取得一个网络资源可以使用URL类进行定位,之后使用IO流的方式进行读取
3 ServerSocket主要用在TCP协议的服务器开发上,使用accept()fagfa等待客户端连接,每一个连接的客户端都使用一个Socket表示
4 UDP属于不可靠的连接协议,采用数据报形式,对于服务器发送的东西,客户端不一定能接收到