Java网络编程概述
一、Java网络编程
用Java语言实现计算机间数据的信息传递和资源共享,一个网络应用程序应该包含网路编程、IO流、多线程。
二、网络编程的三要素
生活举例:日常中快递邮寄,发件人和收件人都有确定的地址(IP),快递运输过程需要根据不同的地址找到最合适的快递投放点(端口),收件人到指定的快递投放点取件签字(协议),快递就实现了从一个位置到另一个位置的转换(客户端---服务器)。
1.地址
- 通过域名表示:www.baidu.com
- 通过IP地址表示:201.108.35.206
Public static InetAddress getByName(stringhost):根据主机名或者IP地址的字符串表示得到IP地址对象
Public string getHostName();获取主机名
Public string getHostAddress();获取IP地址
public class InetAddressDemo {
publicstatic void main(String[] args) throws UnknownHostException {
//将一个域名或者IP地址传递给该方法的参数,得到一个inetAddress对象,该对象包含有主机地址域名和IP地址
InetAddressaddress =InetAddress.getByName("192.168.24.106");
//获取InetAddress对象所含的IP地址
Stringip=address.getHostAddress();
//获取InetAddress对象所含的域名
Stringname=address.getHostName();
System.out.println(name+ip);
}
}
2.端口
网络通信使用IP地址表示Internet上的计算机,使用端口号标识服务器上的进程(程序),一个程序占用服务器的一个端口,端口号规定为一个16为的0~65535之间的整数,其中0~1023被预先定义的服务通信占用,除非我们需要访问这些指定服务,否则应该使用1024~65535这些端口中的一个进行通信,以免发生端口冲突。
端口号与IP地址组合得出一个网络套接字,Java中用socket类建立套接字对象,通过socket间的IO进行操作。
Socket的构造方法:Socket(kStringhost,int port) 参数host是服务器IP地址,port是一个端口号。
3.协议
UDP协议:DatagramSocket类,此类表示用来发送和接收数据报包的套接字。
特点:数据打包,大小有限制,不需连接,效率高,不可靠
DatagramPocket类:数据报包
构造方法:public DatagramPacket(byte[] buf, intlength, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
public DatagramPacket(byte[] buf, intlength) 构造 DatagramPacket,用来接收长度为 length 的数据包
发送:
public class SendDemo {
publicstatic void main(String[] args) throws IOException {
//创建发送端socket对象
DatagramSocketds=new DatagramSocket();
//创建数据并把数据打包
byte[]buf="UDP发送端".getBytes();
DatagramPacketdp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.24.106"),10016);
//调用socket对象的发送方法发送数据包
ds.send(dp);
//释放资源
ds.close();
}
}
接收:
public class ReceiveDemo {
publicstatic void main(String[] args) throws IOException {
//创建接收端socket对象,接收指定端口
DatagramSocketds=new DatagramSocket(10016);
//创建一个数据包,作为接收容器
byte[]bys=new byte[1024];
DatagramPacketdp=new DatagramPacket(bys,bys.length);
//调用socket对象的方法接收数据
ds.receive(dp);//阻塞式
//获取对方IP
//InetAddressaddress=dp.getAddress();//得到IP地址对象
Stringip=dp.getAddress().getHostAddress();//得到IP地址名
//解析数据包,并显示在控制台
Strings=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"向你传输数据:"+s);
}
}
运行结果:192.168.24.106 向你传输数据:UDP发送端
TCP协议:Socket此类实现客户端套接字 ServerSocket此类实现服务器套接字
特点:建立数据通道,数据大小无限制,效率低,可靠
客户端
Socket方法:public Socket(String host,int port)创建一个流套接字并将其连接到指定主机上的指定端口号。
public InputStream getInputStream()返回此套接字的输入流。如果此套接字具有关联的通道,则所得的输入流会将其所有操作委托给通道。
public OutputStream getOutputStream()返回此套接字的输出流。如果此套接字具有关联的通道,则得到的输出流会将其所有操作委托给通道。
public class TcpClient {
publicstatic void main(String[] args) throws IOException {
//创建客户端Socket对象
Sockets=new Socket("192.168.24.106", 8888);
//获取输出流
OutputStreamos=s.getOutputStream();
os.write("TCP客户端".getBytes());
//获取输入流反馈
InputStreamis=s.getInputStream();
byte[]bys=new byte[1024];
intlen=is.read(bys);
Stringclient=new String(bys,0,len);
System.out.println("client:"+client);
s.close();
}
}
运行结果:数据已收到
服务器端
ServerSocket类方法:publicServerSocket(int port)创建绑定到特定端口的服务器套接字
public Socketaccept()侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
public class TcpServer {
publicstatic void main(String[] args) throws IOException {
//创建服务器端ServerSocket对象
ServerSocketss=new ServerSocket(8888);
//监听客户端连接返回一个对应的socket对象
Sockets=ss.accept();//阻塞式
//获取输入流,读取数据显示在控制台
InputStreamis=s.getInputStream();
byte[]bys=new byte[1024];
intlen=is.read(bys);
Stringstr=new String(bys,0,len);
//获取客户端的IP地址
Stringip=s.getInetAddress().getHostAddress();
System.out.println(ip+"客户端发来:"+str);
//获取输出流,对客户端给出反馈。
OutputStreamos=s.getOutputStream();
os.write("数据已经收到".getBytes());
s.close();
}
}
运行结果:192.168.24.106客户端发来:TCP客户端
说明:从电脑管家的进程中可以看出,大部分的软件中既包含了UDP协议也包含了TCP协议传输,需要哪种方式要看具体的需求。UDP由于没有建立连接通道,只考虑发送而没有接收反馈,所以传输速度快,比如QQ留言功能,发送短信,新闻推送。TCP有三次握手过程,能够建立安全可靠的连接,保证传输两端的“知情权”,比如打电话。
上一篇: Java 流式编程概述
下一篇: c++定长分割字符串