title: Java中的网络支持Socket应用 date: 2019-05-04 14:00:00
Java中的网络支持Socket应用
单机的程序终究会被淘汰的,所以还是要让你的程序软件赋予联网通信的能力,恰恰Java提供了Socket这种功能强大的类,方便Java程序员进行网络应用开发。
首先你得先学一下网络的基础知识,IP地址,端口,网络协议
IP地址:
Java软件?为了实现网络中不同计算机之间的通信,每台机器都必须有一个唯一的标识---IP地址。IP地址格式:数字型。如192.168.0.1,想深入学习可以看看《探索Linux的网络世界》
端口:
用于区分不同应用程序;端口号范围为0~65535,其中0~1023为系统所保留,常见端口:http:80 ;ftp:21; telnet: 23
网络协议:
socket编程,IP地址和端口号组成所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础
理解完上述的网络知识的基础,我们来学一下Java中的网络支持,针对网络通信的不同层次Java提供的网络功能有四大类:
InetAddress:
用于标识网络上的硬件资源,通俗来说,用来标识IP地址的
URL:
Java socket?统一资源定位符,通过URL可以直接读取或写入网络上的数据
Socket:
使用TCP协议实现网络通信的Socket相关的类
Datagram:
使用UDP协议,将数据保存在数据报中,通过网络进行通信
Java编程、简单的说了一下Java提供的网络功能有四大类的通俗解析,下面我们看一下他们的用,话不多说,我贴上代码,代码实现简单,编程开发中遇到建议查看Java文档中具体介绍
public class demo1{ /* *java中InetAddress的应用 */ public static void main(String[]args)throws Unknow HostException{//获取本机的InetAddress实例InetAddress address=InetAddress.getLocalHost();System.out.println("计算机名"+address.getHostName());System.out.println("IP地址"+address.getHostAddress());//获取字节数组形式的IP地址byte [] bytes=address.getaddress();System.out.println("字节数组形式的IP"+Arrays.toString(bytes));//直接输出InetAddress对象System.out.println(address);//根据机器名获取InetAddress实例InetAddresss address2=InetAddress.getByName("hkq");System.out.println("计算机名"+address2.getHostName());System.out.println("IP地址"+address2.getHostAddress()); //根据IP获取InetAddress实例InetAddresss address2=InetAddress.getByName("1.1.1.10");System.out.println("计算机名"+address2.getHostName());System.out.println("IP地址"+address2.getHostAddress());} }
public class demo2{ /* *java中URL的应用 *URL由两部分组成:协议名称和资源名称,中间用冒号隔开 *在1java.net包中提供了URL类来表示URL */ public static void main(String[]args)throws Unknow HostException{try{//创建一个URL实例URL baidu=new URL("http://www.baidu.com");//?后面表示参数,#后面表示锚点URL url=new URL(baidu,"/index.html?username=hkq#test");System.out.println("协议: "+url.getProtocol()); System.out.println("主机: "+url.getHost());//如果未指定端口号,则使用默认的端口号,此时getPort()方法返回值为-1 System.out.println("端口:"+ url.getPort());System.out.println("文件路径"+url.getPath());System.out.println("文件名"+url.getFile());System.out.println("相对路径"+url.getRef());System.out.println("查询字符串"+url.getQuery()); /**使用URL读取网页内容*通过URL对象的openStream()方法可以得到指定资源的输入流*通过输入流可以读取、访问网络上的数据*///创建一个URL实例URL url=new URL("http:hongkaiqing.cn");//通过URL的openStream方法获取URL对象所表示的资源的字节输入流InputStream is =url.openStream();//将字节输入流转换为字符InputStreamReader isr=new InputStreamReader(is,"utf-8"); //为字符输入流添加缓冲,添加读取的效率BufferedReader br=new BufferedReader(isr);//定义string类型的data接收读取数据String datta =br.readLine();//循环读取数据 while(data!=null){//输出数据System.out.println(data);//再读取下一行数据data=br.readLine();}//关闭资源br.close();isr.close();is.close(); }cath (MalformedURLException e){e.printStackTrace();}cath (MalformedURLException e){e.printStackTrace();} } }
刚才有说,Socket是使用TCP协议实现网络通信的Socket相关的类,那啥是TCP呢?欢迎你百度一下,其实TCP协议是面向连接、可靠的、有序的......Socket通信是以字节流方式发送数据基于TCP协议实现网络通信的类,客户端的Socket类;服务器端的ServerSocket类,具体流程嘛?我们上图介绍一下:
what?看到这种流程,感觉是蒙圈的,通俗来说,其实这个类是用于客户端和服务器端通信的,我想想怎么理解这个呢!!!客户端和服务器端是什么意思啊?我也是接触了才想明白这个知识点,客户端通俗来说就是你电脑浏览的网页页面,用到的软件,例如:微信、QQ...
服务器端通俗来说就是一台远程的电脑,一台不会关机的电脑,它提供了两个IP供你访问,一个公网IP,一个内网IP(这个暂时不用管),公网IP是你登录这台远程电脑的唯一标识...其他你不懂就百度吧,我不想打字了
java.net.socket。我怎么扯远了,哎,我们谈回这个Socket类,我们用一个登录的小案例,尝试理解这个Socket类
实现登录小案例:通俗来说就是客户端发送账号密码等用户信息给服务器端,服务器端根据客户端请求进行响应,
服务器端实现步骤;
1.创建ServerSocket对象,绑定监听端口
2.通过accept()方法监听客户端请求
java有哪些应用、3.连接建立后,通过输入流读取客户端发送的请求信息
4.通过输出流向客户端发送响应信息
5.关闭相关资源
客户端实现步骤;
1.创建Socket对象,指明需要连接的服务器的地址和端口号
java socket编程例子,2.连接建立后,通过输出流读取服务器端发送请求信息
3.通过输入流获取服务器端响应信息
4.关闭相关资源
大概实现的步骤就这些了....,下面贴上我实现的简陋代码,servert类代表实现服务器端代码,client类代表客户端实现代码...
package SinginScoket; import java.io.BufferedReader; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /**** 基于TCP协议的Socket,实现用户登录* 服务器端* @author hkq**/ public class Servert {public static void main(String[] args) {try {//1.创建一个服务器端的Socket,即ServerSocket,指定绑定的端口,并监听此端口ServerSocket serverSocket=new ServerSocket(8088);//2.调用accept()方法开始监听,等待客户端的连接System.out.println("服务器端启动,等待客户端连接");Socket socket= serverSocket.accept();//3.获取字节输入流,并读取客户端信息InputStream is=socket.getInputStream();//4.将字节流装换为字符流,好处是提高读取的效率InputStreamReader isr=new InputStreamReader(is);//5.搭配使用,为字符输入流添加缓冲BufferedReader br=new BufferedReader(isr);//6.定义String类型的info,循环读取客户端信息并在控制台输出String info=null;while ((info=br.readLine())!=null) {System.out.println("服务器端接收到客户端数据为:"+info); }//7.关闭socket输入流socket.shutdownInput();//8.获取输出流,响应客户端的请求OutputStream os =socket.getOutputStream();//将字节输出流转换为打印输出流PrintWriter pw=new PrintWriter(os);//服务器端向客户端发送响应信息pw.write("登录成功,欢迎你");//调用flush()方法刷新缓存pw.flush();//9.关闭资源pw.close();os.close();br.close();isr.close();is.close();socket.close();serverSocket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} } }
客户端:
package SinginScoket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; /**** 客户端* @author hkq**/ public class Client { public static void main(String[] args) {try {//1.创建客户端Socket,指定`服务器地址和端口Socket socket=new Socket("127.0.0.1", 8088);//2.连接建立后,通过获取字节输出流读取服务器发送信息OutputStream os =socket.getOutputStream();//将字节输出流转换为打印输出流PrintWriter pw=new PrintWriter(os);//向服务器端发送用户信息请求pw.write("用户名: admin;密码: 123");//刷新缓存pw.flush();//关闭scoket的输出流socket.shutdownOutput();//获取输入流,并读取服务器端的响应信息InputStream is=socket.getInputStream();//将字节流装换为字符流,好处是提高读取的效率InputStreamReader isr=new InputStreamReader(is);//搭配使用,为字符输入流添加缓冲BufferedReader br=new BufferedReader(isr);//定义String类型的info,循环读取服务器信息响应并在控制台输出String info=null;while ((info=br.readLine())!=null) {System.out.println("客户端接收到服务器端数据为:"+info); }//关闭所有资源br.close();is.close();pw.close();os.close();socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} } }
Java编程软件?运行的时候,一定是服务器端的代码先运行,因为客户端的代码先运行会因为找不到服务器端的出现错误提示.....
使用UDP协议,将数据保存在数据报中,通过网络进行通信。什么是UDP协议?百度给的解析:UDP协议(用户数据报协议)是无连接、不可靠、无序的,以数据报作为数据传输的载体进行数据传输时,首先需要将要传输的数据定义成数据报,在数据报中指明数据所达到的Socket(主机地址和端口号),然后再将数据报发出去...什么鬼啊?我通俗不了啊,算了,我们还是先看这个Datagram类的用法吧,它提供了两个相关操作类:
DatagramPacket: 表示数据报包
DatagramSocket:进行端到端通信的类
我们还是用一个登录案例了解一下这个Datagram类所使用的UDP编程
Java技术?服务器端实现步骤:
1.创建DatagramSocket,指定端口号
2.创建DatagramPacket
3.接收客户端发送的数据信息
4.读取数据
package UDPsingin; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; /**** 服务器端,实现UDP的用户登录* @author hkq**/ public class UDPserver { public static void main(String[] args) throws IOException {/**** 服务器端接收客户端发送的数据*///1.创建服务端DatagramSocket,指定端口DatagramSocket socket=new DatagramSocket(8082);//2.创建数据报,用于接收客户端发送的数据//创建字节数组,指定接收数据包的大小byte [] data=new byte[1024];DatagramPacket packet=new DatagramPacket(data, data.length);System.out.println("服务器端已启动,等待客户端连接");//3.接收客户端发送的数据//此方法在接收到数据报之前会一直阻塞socket.receive(packet);//4.读取数据String info=new String(data,0,packet.getLength());System.out.println("这里是服务器,客户端对我说:"+info);/**** 服务器端向客户端响应数据*///1.定义客户端的地址、端口、数据InetAddress address=packet.getAddress();int port=packet.getPort();byte[]data2="登录成功".getBytes();//2.创建数据报,包含响应的数据信息DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, port);//3.响应客户端,发送数据报socket.send(packet2);//4.关闭资源socket.close();} }
java应用在哪些方面。客户端实现步骤:
1.定义发送信息(服务器地址,端口号)
2.创建DatagramPacke数据报t,包含将要发送的信息
3.创建DatagramSocket对象,实现数据发送
4.发送数据
package UDPsingin; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; /**** 客户端,实现UDP的用户登录* @author hkq**/ public class UDPClient {/**** 向服务器端发送数据* @param args* @throws IOException*/public static void main(String[] args) throws IOException {//1.定义服务器的地址、端口号、数据InetAddress address=InetAddress.getByName("127.0.0.1"); int port=8082;byte []data="用户名: admin;密码: 456".getBytes();//2.创建数据报,包含发送的数据信息DatagramPacket packet=new DatagramPacket(data, data.length, address, port);//3.创建DatagramSocket对象DatagramSocket socket=new DatagramSocket();//4.向服务器发送数据报socket.send(packet);/**** 接收服务器端响应的数据**///1.创建数据报,用于接收服务器端响应的数据byte[] data2=new byte[1024];DatagramPacket packet2=new DatagramPacket(data2, data2.length);//2.接收服务器端响应的数据socket.receive(packet2);//3.读取数据String reply=new String(data2, 0, packet2.getLength());System.out.println("这里是客户端,服务器反馈信息:"+reply);//关闭资源socket.close();} }
java程序源码、运行的时候,一定是服务器端的代码先运行,因为客户端的代码先运行会因为找不到服务器端的出现错误提示…..
重点掌握:
Socket通信原理,基于TCP的Socket通信
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态