JAVA Socket编程
2016-03-30 18:15
483 查看
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的技术。
针对网络通信的不同层次,Java提供了不同的API,其提供的网络功能有四大类:
1.InetAddress:用于标识网络上的硬件资源,主要是IP地址
2.URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据
3.Sockets:使用TCP协议实现的网络通信Socket相关的类
4.Datagram:使用UDP协议,将数据保存在用户数据报中,通过网络进行通信。
针对网络通信的不同层次,Java提供了不同的API,其提供的网络功能有四大类:
1.InetAddress:用于标识网络上的硬件资源,主要是IP地址
2.URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据
3.Sockets:使用TCP协议实现的网络通信Socket相关的类
4.Datagram:使用UDP协议,将数据保存在用户数据报中,通过网络进行通信。
InetAddress
package com.maiya; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; public class TestInetAddress { public static void main(String[] args) { try { //使用getLocalHost()静态方法获取InetAddress InetAddress inet=InetAddress.getLocalHost(); //获取主机名 String hostName=inet.getHostName(); //获取主机IP String hostIp=inet.getHostAddress(); //获取主机字节数组形式的IP byte[] ip=inet.getAddress(); System.out.println("InetAddress:"+inet); System.out.println("hostName:"+hostName); System.out.println("hostIp:"+hostIp); System.out.println("byteIp:"+Arrays.toString(ip)); } catch (UnknownHostException e) { e.printStackTrace(); } } }
这是输出信息(Ip这儿用*代替掉): InetAddress:dell/172.16.**.*** hostName:dell hostIp:172.16.**.*** byteIp:[172, 16, **, ***]
URL
package com.maiya; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; public class TestURL { public static void main(String[] args) throws IOException { try { //创建URL URL url=new URL("http://www.baidu.com/s?ie=utf-8&tn=94235251_hao_pg&word=java"); //获取协议名称 String protocal=url.getProtocol(); //获取主机名称 String host=url.getHost(); //获取端口号(如果未设置端口号,则返回 -1) int port=url.getPort(); //获取文件名 String fileName=url.getFile(); //获取文件路径 String filePath=url.getPath(); //获取此 URL 的锚点(#后面的部分) String ref=url.getRef(); //获取此 URL 的查询部分 String query=url.getQuery(); System.out.println("URL:"+url); System.out.println("protocal:"+protocal); System.out.println("host:"+host); System.out.println("port:"+port); System.out.println("fileName:"+fileName); System.out.println("filePath:"+filePath); System.out.println("ref:"+ref); System.out.println("query:"+query); //获取该URL的字节输入流,打印出该URL指向的文件内容 InputStream in=url.openStream(); //将字节流转换成字符流 InputStreamReader isr=new InputStreamReader(in); //为字符流加缓冲 BufferedReader bis=new BufferedReader(isr); String line=null; StringBuffer str=new StringBuffer(); while((line=bis.readLine())!=null){ str.append(line); } System.out.println("输入流内容:"+str); //关闭相应资源 bis.close(); isr.close(); in.close(); } catch (MalformedURLException e) { e.printStackTrace(); } } }
//输出的信息 URL:http://www.baidu.com/s?ie=utf-8&tn=94235251_hao_pg&word=java protocal:http host:www.baidu.com port:-1 fileName:/s?ie=utf-8&tn=94235251_hao_pg&word=java filePath:/s ref:null query:ie=utf-8&tn=94235251_hao_pg&word=java 输入流的内容:<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">..........//太长了,这儿就不显示了
Socket
Socket是使用TCP实现的网络通信,它的核心类为:ServerSocket和Socket,分别代表服务端和客户端的Socket。这儿用一个客户端登录至服务端的例子说明,实现逻辑是:客户端向服务端发送登录信息,服务端接收到信息后打印输出。看代码:package com.maiya; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import sun.print.resources.serviceui; /** * Socket的使用:服务端 * @author WHF */ public class Service { public static void main(String[] args) { try { //创建一个服务端的Socket指定端口号 ServerSocket serverSocket=new ServerSocket(8080); //开始监听客户端连接,此时服务端会处于阻塞状态 Socket socket=serverSocket.accept(); //获取客户端发送的消息,并输出打印 InputStream in=socket.getInputStream(); InputStreamReader reader=new InputStreamReader(in); BufferedReader buffer=new BufferedReader(reader); String info=null; while((info=buffer.readLine())!=null){ System.out.println("我是服务器,客户端说:"+info); } //关闭Socket(直接关闭Socket即可,不用关闭传输流,因为关闭传输流的同时Socket也会随之关闭) socket.close(); serverSocket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
package com.maiya; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; /** * Socket的使用:客户端 * @author WHF * */ public class Client { public static void main(String[] args) { try { //创建Socket,指定服务端主机名和端口号 Socket socket=new Socket("localhost",8080); OutputStream out=socket.getOutputStream(); //将输出流包装成打印流 PrintWriter pw=new PrintWriter(out); pw.write("用户名:maiya;密码:123"); pw.flush(); //关闭socket(直接关闭Socket即可,不用关闭传输流,因为关闭传输流的同时Socket也会随之关闭) socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
UDP
UDP是使用UDP实现的网络通信,其两个核心类为:DatagramSocket 端对端通信、DatagramPacket 数据报包。这儿继续使用客户端登录至服务端的例子说明,看代码:package com.maiya; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; /** * UDP使用:服务端 * @author WHF */ public class UDPService { public static void main(String[] args) { try { //创建服务器端的DatagramSocket,指定端口号 DatagramSocket datagrameSocket=new DatagramSocket(8080); //创建一个字节数组接收数据报 byte[] data=new byte[1024]; //创建数据报,用来接收客户端发送的数据 DatagramPacket packet=new DatagramPacket(data,data.length); //接收客户端发送的数据报(在接收到数据之前处于阻塞状态) datagrameSocket.receive(packet); //读取数据 String info=new String(data,0,packet.getLength()); System.out.println("我是服务器端,客户端说:"+info); //关闭资源 datagrameSocket.close(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
package com.maiya; import java.io.IOException; import a243 java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; /** * UDP使用:客户端 * @author WHF */ public class UDPClient { public static void main(String[] args) { try { //获取主机InetAddress InetAddress address=InetAddress.getByName("localhost"); //创建客户端端的DatagramSocket DatagramSocket datagrameSocket=new DatagramSocket(); //创建一个字节数组发送数据报 byte[] data="用户名:maiya,密码:456".getBytes(); //创建数据报,用来发送的数据,指定要发送数据的字节数组和长度以及服务器的InetAddress和端口号 DatagramPacket packet=new DatagramPacket(data,data.length,address,8080); //发送数据报 datagrameSocket.send(packet); //关闭资源 datagrameSocket.close(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Linux socket 初步
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序