网络编程
在网络通信协议下,实现网络互联的不同计算机上运行的程序间可以进行数据交换
网络编程三要素:
IP地址(找到网络中的计算机)
端口(识别程序)
协议(数据传输需要遵循的连接和通信的规则,常见UDP、TCP协议)
IP地址
IPV4:32位地址,
IPV6 :128位地址,8组16进制;
特殊地址:127.0.0.1;(代表本机地址)
InetAddress类
方法:getHostName() 获取本机名
getHostAddress()获取本机IP地址
代码实例:
public static void main(String[] args) throws UnknownHostException {
// 其他
InetAddress addr = InetAddress.getLocalHost();
System.out.println("Local HostAddress:"+addr.getHostAddress());
String hostname = addr.getHostName();
System.out.println("Local host name: "+hostname);
}
传输协议
UDP无连接通信协议,面向无连接的通信,发送不确认、接收不会反馈(广泛用于视频、广播)不能保证数据的完整性
TCP协议:面向连接的通信协议,会先建立逻辑连接然后发送信息,每次连接的创建都要做三次握手,保证连接的可靠;(上传文件,下载文件,浏览网络)
UDP通信协议
Datagram Socket来实现UDP的发送和接收数据
步骤:
1、创建发送端对象
2、创建数据并打包
3、调用datagram对象并发送
发送端实例:
package UDP;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
public class send {
public static void main(String[] args) throws IOException {
// 创建发送端端Socket对象
DatagramSocket ds = new DatagramSocket();
BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
String line;
while ((line = br.readLine()) != null) {
if ("886".equals(line)) {
break;
}
// 创建数据
byte[] bys = line.getBytes();
DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("127.0.0.1"), 12345);
// 调用DatagramSocket对象端方法发送数据
ds.send(dp);
}
ds.close();
}
}
接收端实例:
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class receive {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(12345);
while (true){
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys,bys.length);
ds.receive(dp);
System.out.println("number is :"+ new String((dp.getData()),0,dp.getLength()));
}
// ds.close();
}
}
TCP通信协议
在通信的两端形成网络虚拟链路,分为客户端和服务器端;
通过socket产生IO流来进行通信;
发送步骤:
1、创建客户端的socket对象
2、获取输出流写数据;
3、释放资源;
代码实例:
客户端:
package biancheng;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class client {
public static void main(String[] args) throws IOException {
// 创建客户端的Scoket对象
Socket s = new Socket("127.0.0.1",10000);
// 获取输出流,写数据
OutputStream os = s.getOutputStream();
os.write("hello,it's me".getBytes());
// 接收服务器返回
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String data = new String(bys,0,len);
System.out.println("客户端"+data);
// 释放资源
s.close();
}
}
服务器端:
package biancheng;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class server {
public static void main(String[] args) throws IOException {
// 创建服务器端对象
ServerSocket ss = new ServerSocket(10000);
// 监听客户端连接
Socket s = ss.accept();
// 获取输入流、读数据,并把数据显示在控制台
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String data = new String(bys,0,len);
System.out.println("服务器"+data);
// 给出反馈
OutputStream os = s.getOutputStream();
os.write("数据已经收到".getBytes());
// 释放资源
ss.close();
}
}
这里注意:
客户端是先输出数据再读数据;
服务端是先读数据再输出数据;
是相互对应的;