Java网络编程
来源:互联网 发布:c语言fabs函数确定精读 编辑:程序博客网 时间:2024/05/21 16:59
1.网络编程基础知识:
网络编程是直接或间接通过网络协议与其他计算机进行通讯。 网络编程中有两个问题:如何精准找到网络上要通讯的主机;在找到主机后如何进行数据传输。 在TCP/IP协议中,IP层主要负责网络主机的定位,数据传输的路由,由IP地址唯一确定网络上的一台主机; 而TCP层则提供面向应用的可靠或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层如何处理数据。
2.传输协议:TCP/UDP
尽管TCP/IP协议中名称只有TCP这个协议名,但是在TCP/IP的传输层同时存在TCP和UDP这两个协议。 在建立连接后,可以进行大数据量的传输。通过TCP协议传输时,发送方和接收方的成对的两个 socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个Socket(通常是Server Socket) 等待连接时,另一个Socket可以要求连接,一旦这两个Socket连接起来,它们就可以进行双向数据传输, 双方都可以进行数据的发送和接收操作。这种通讯和我们日常生活中打电话通讯十分类似。UDP(User Datagram Protocol):是一种面向无连接的传输协议,这种通讯和我们日常生活中邮寄信件非常类似, 将数据、数据源以及目的地封装成数据包中进行传输,由于不需要建立连接,所以传输效率会稍微高点, 但是无法保证数据包会一定到达目的地、数据的可靠性、以及时间上的次序,是一种不可靠的协议。 使用UDP传输数据时是有大小限制的,每个数据包的大小限制在64k内。
3.java网络编程
java中的网络编程其实就是指Socket编程,Socket是为网络服务提供的一种机制,在通信两端都有Socket,数据在两个Socket间进行IO传输。
3.1. IP地址:IP地址是网络中设备的标识,用来定位网络主机,在java中IP地址被封装成InetAddress对象。
static InetAddress[] getAllByName(String host); 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。static InetAddress getByAddress(byte[] addr); 在给定原始 IP 地址的情况下,返回 InetAddress 对象。static InetAddress getByAddress(String host ,byte[] addr); 根据提供的主机名和 IP 地址创建 InetAddressstatic InetAddress getByName(String host); 在给定原始 IP 地址的情况下,返回 InetAddress 对象。static InetAddress getLocalHost(); 返回本地主机String getHostAddress(); 返回 IP 地址字符串(以文本表现形式)String getHostName(); 获取此 IP 地址的主机名byte[] getAddress(); 返回此 InetAddress 对象的原始 IP 地址
3.2. 使用UDP建立Socket服务进行传输数据
1)使用到的对象: DatagramSocket: 用来发送和接收数据报包的套接字 DatagramPacket: 数据报包 使用UDP协议发送数据: 步骤:a.建立UDPSocket服务; b.提供数据,并将数据封装到数据报中; c.通过Socket服务的发送功能,将数据报发送出去; d.关闭资源; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpSendDemo{ public static void main(String[] args) throws Exception { //1.创建UDP服务,端口号有系统指定 DatagramSocket ds = new DatagramSocket(); //2.确定数据,并封装成数据报,将数据发送到本机,用端口号10000处理 byte[] buf = "使用UDP发送数据".getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length ,InetAddress.getLocalHost() , 10000); //3.使用socket服务将数据报发送出去 ds.send(dp); //4.关闭资源 ds.close(); } }使用UDP协议接收数据import java.net.DatagramPacket;import java.net.DatagramSocket;public class UdpReceiveDemo { public static void main(String[] args)throws Exception { //1.创建UDP服务,监听端口号10000 DatagramSocket ds = new DatagramSocket(10000); //2.创建接收数据的数据报 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); //3.通过socket服务接收数据存入定义好的数据报中,receive()方法是阻塞式的 ds.receive(dp); //4.通过数据报获取数据 System.out.println("IP: " + dp.getAddress().getHostAddress() + " 端口号 " + dp.getPort() + " 内容: " + new String(dp.getData()).trim()); //5.关闭资源 ds.close(); }}
3.3使用TCP传输数据:
1).使用到的对象: Socket: 实现客户端套接字 ServerSocket: 实现客户端套接字//客户端代码 import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;public class TcpClientDemo { public static void main(String[] args)throws Exception { //1.创建Socket服务,并指定要连接的地址和端口 Socket socket = new Socket(InetAddress.getLocalHost() , 10000); //2.获取输入流,写入数据,发送到服务端 OutputStream os = socket.getOutputStream(); os.write("Socket客户端使用Tcp发送数据".getBytes()); //3.获取输出流,读取服务端发送过来的数据 InputStream is = socket.getInputStream(); byte[] buf = new byte[1024]; int len = is.read(buf); System.out.println(new String(buf ,0 , len)); //4.关闭资源 socket.close(); }}//服务端代码import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;public class TcpServerDemo { public static void main(String[] args) throws Exception{ //1.建立服务端socket ServerSocket ss = new ServerSocket(10000); //2.接收客户端Socket, 该方法是阻塞式的 Socket s = ss.accept(); //3.读取客户端发送的数据 InputStream is = s.getInputStream(); byte[] buf = new byte[1024]; int len = is.read(buf); System.out.println(new String(buf,0 , len)); //4.给客户端发送数据 OutputStream os = s.getOutputStream(); os.write("服务端发送数据到客户端".getBytes()); //5.关闭服务 s.close(); ss.close(); }}
4.基于URL高层次的Java网络编程
URL代表统一资源定位符,它表示Internet上某一资源的地址。
使用URL连接网络上的资源 URL url = new URL("http://www.baidu.com"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); // 设置请求方式为get方式 conn.setReadTimeout(5000); //设置读取时间为5s conn.setConnectTimeout(5000); //设置连接超时时间 conn.connect(); // 开始连接 if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){ // 根据返回码判断是否连接成功 byte[] buf = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); InputStream in = conn.getInputStream(); while((len= in.read(buf)) != -1){ bos.write(buf , 0 , len); } System.out.println(bos.toString()); bos.close(); } conn.disconnect(); //断开连接
参考博客:http://www.cnblogs.com/linjiqin/archive/2011/06/10/2077237.html
1 0
- 【网络编程】JAVA网络编程
- java网络编程:网络基本概念
- Java网络编程-UDP编程
- Java 高层网络编程
- Java网络编程2
- Java网络编程3
- Java网络编程4
- Java网络服务器编程
- java网络编程1
- java网络编程2
- JAVA网络编程
- Java网络服务器编程
- java网络编程
- Java 高层网络编程
- Java 高层网络编程
- Java网络服务器编程
- Java网络编程
- JAVA网络编程
- jsp 翻页代码
- 通过pycharm的database设置进行数据库的可视化
- HTML详解
- 交换瓶子
- 下一代广播电视音频解决方案:MPEG-H
- Java网络编程
- mapper映射器中if标签的应用
- LeetCode 104. Maximum Depth of Binary Tree
- 算法20:两个排序数组merge后的中值
- yum安装的PHP卸载
- R on Spark
- Appium Doctor iOS Could not detect Mac OS X Version from sw_vers output: '10.12 '解决方法
- NP2
- JavaScript笔记-->基本语法