网络编程
也称为Soket编程,套接字编程
三要素:
1)找到IP地址
2)必须有端口
3)必须有协议
协议分为TCP协议和UDP协议
TCP协议(客户端和服务器端的交互)
1)建立连接通道(通道内的流:最基本的字节流)
2)是可靠协议
3)服务器端需要等待客户端连接,执行效率低
4)可发送大量数据,文件大小无限制
UDP协议(发送端和接收端)
1)无需建立连接通道(数据报包的形式发送数据)
2)不可靠协议
3)执行效率高
4)大小限制
UDP协议
发送端:
1)创建Socket对象
2)创建数据报包(将数据发送到接收端)
3)调用发送端发送的方法
4)关闭资源
package prac01;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*发送端*/
public class Send {
public static void main(String[] args) throws IOException {
// 创建了UDP协议的Socket对象
DatagramSocket ds = new DatagramSocket();
// 要发送的话
String s = "i love study";
byte[] byt = s.getBytes();
int length = byt.length;
InetAddress address = InetAddress.getByName("10.10.10.1");
// 指定端口号:0-65535是有效端口号
int port = 10;
// 创建数据报包对象
// public DatagramPacket(byte[] buf, int length ,InetAddress address,int port)
DatagramPacket dp = new DatagramPacket(byt, length, address, port);
// 发送方法
ds.send(dp);
ds.close();
}
}
接收端:
1)创建接收端Socket对象
2)创建一个数据报包接收数据
3)接收数据,调用DatagramSocket类中的接收方法
4)解析数据报包里的实际数据,显示在控制台上
5)关闭
package prac01;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*接收端*/
public class Receive {
public static void main(String[] args) throws IOException {
// 创建Socket对象
DatagramSocket ds = new DatagramSocket(10);
// 2)创建数据报包:DatagramPacket,来接收发送端发送来的数据
// public DatagramPacket(byte[] buf,int length)构造 DatagramPacket,用来接收长度为
// length 的数据包。
byte[] buf = new byte[1024];
int length = buf.length;
DatagramPacket dp = new DatagramPacket(buf, length);
// 接收数据
ds.receive(dp);
// 解析发送过来的实际数据
// byte[] getData() 返回数据缓冲区。
// int getLength() 返回将要发送或接收到的数据的长度。
byte[] byt = dp.getData();
int len = dp.getLength();
String s = new String(byt, 0, len);
// 获取到ip字符串表现形式
// public InetAddress getAddress():首先通过数据报包得到一个Ip地址对象:InetAddress
InetAddress address = dp.getAddress();
// 可以通过getHostAddress()得到ip地址的文本形式
String ip = address.getHostAddress();
System.out.println(ip + "发送了:" + s);
ds.close() ;
}
}
TCP协议
客户端:
1)创建客户端的Socket对象(客户端套接字流形式)
2)获取通道内的流(输出流)
3)使用输出流对象写数据
4)关闭
package prac01;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
/*客户端*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket s = new Socket("10.10.10.1", 10010) ;
//获取通道的流
OutputStream out = s.getOutputStream() ;
//写数据
out.write("i love studying".getBytes());
//关闭
s.close();
}
}
服务器端:
1)创建Socket对象,指定端口
2)监听客户端链接(请求等待)
3)获取通道输入流对象
4)将数据获取并显示到控制台
5)关闭
package prac01;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/*服务器端*/
public class Server {
public static void main(String[] args) throws IOException {
//创建绑定到特定端口的服务器套接字
ServerSocket ss = new ServerSocket(10010) ;
System.out.println("等待客户端连接...");
//监听客户端的连接:请求等待介入
Socket s = ss.accept() ;
System.out.println("客户端已经连接...");
//获取通道内输入流对像
InputStream in = s.getInputStream() ;
//4)将客户端发送的数据显示到控制台上
byte[] byt=new byte[1024];
int len=in.read(byt);
String s1=new String(byt,0,len);
//获取IP地址的文本形式
InetAddress address = s.getInetAddress() ;
//在通过ip地址对象getHostName();
String ip = address.getHostAddress() ;
System.out.println(ip+"给您发送了:"+s1);
s.close();
}
}