无网不欢
1、什么是网络编程?
书上是这么描述的,网络编程是指物理上位于两台计算机的两个进程之间实现网络通信的编程。其实就是计算机通过Java程序实现资源共享和信息传递。
网络通信主要由三个要素组成:IP地址、端口号、协议。
/TCP/IP协议/
2、IP地址
IP地址用于标示某一天计算机,类似于计算机的身份证。
IP地址的组成:网络号段+主机号段
A类:第一号段为网络号段+后三段的主机号段
B类:前二号段为网络号段+后二段的主机号段
C类:前三号段为网络号段+后一段的主机号段
IP地址的分类:
A类 1.0.0.1---127.255.255.254
(1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址)
(2)127.X.X.X是保留地址,用做循环测试用的。
B类 128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。
C类 192.0.0.1---223.255.255.254 192.168.X.X是私有地址
D类 224.0.0.1---239.255.255.254
E类 240.0.0.1---247.255.255.254
Java提供了InetAddress类来获取IP相关内容,该类没有构造方法。
常用方法:
// 在给定主机名的情况下确定主机的 IP地址
static InetAddress getByName(String host)
// 返回 IP地址字符串(以文本表现形式)
String getHostAddress()
// 获取此 IP地址的主机名
String getHostName()
3、端口
端口号是标示计算机上某个应用程序的,也就是用于标识进程的逻辑地址。
有效端口:0-65535,0-1024系统使用或保留端口。
4、协议
1.UDP协议
无连接的传输协议,利用UDP协议进行数据传输时,先要将传输的数据定义成数据报,在数据报中指明数据所要到达的端点,然后再将数据报发送出去。无连接、速度快、不可靠。
2.TCP协议
端点之间建立连接,建立连接后发送端将发送的数据以字节流的方式发送出去;接收端则对数据按序列顺序将数据整理好,数据在需要时可以重新发送。有连接、速度慢、可靠,三次握手协议。
##5、Socket编程
Socket套接字:网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
1.UDP协议下的Socket编程
//发送端
public class UdpSend {
public static void main(String[] args) throws IOException {
// 生成发送端socket对象
DatagramSocket ds = new DatagramSocket();
// 设置socket包裹
// 设置发送端数据
String str = "hello world java";
byte[] c = str.getBytes();
DatagramPacket packet = new DatagramPacket(c, c.length,
InetAddress.getByName("127.0.0.1"), 10087);
//发送数据包
ds.send(packet);
ds.close();
}
}
//接收端
public class UdpReceive {
public static void main(String[] args) throws IOException{
// 创建接收端的Socket对象
DatagramSocket ds=new DatagramSocket(10087);
//设置接收的包裹
byte[] b=new byte[1024];
DatagramPacket packet=new DatagramPacket(b, b.length);
//接收数据
ds.receive(packet);
//解析数据
String line =new String (packet.getData());
//获得发送端的IP
String ip=packet.getAddress().getHostAddress();
System.out.println(ip+"--->"+line);
//127.0.0.1--->hello world java
//释放资源
ds.close();
}
}
2.TCP协议下的Socket编程
//发送端
public class TcpClient {
public static void main(String[] args) throws IOException{
//生成socket对象
Socket s=new Socket("127.0.0.1", 10086);
//封装通道对象
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//设置发送的数据
String line="hello world";
bw.write(line);
bw.newLine();
bw.flush();
//禁用此套接字的输出流
s.shutdownOutput();
//获取服务端的反馈信息
InputStream stream=s.getInputStream();
byte[] b=new byte[1024];
stream.read(b);
String str=new String(b);
System.out.println(str);//上传成功了!!!
//释放资源
//bw.close();
s.close();
}
}
//接收端
public class TcpServer {
public static void main(String[] args) throws IOException{
//生成服务端socket对象
ServerSocket ss=new ServerSocket(10086);
//设置监听事件
Socket s=ss.accept();//阻塞式
//封装通道流
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
//hello world
}
//向客户端给出反馈
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bw.write("上传成功了!!!");
bw.newLine();
bw.flush();
//释放资源
s.close();
//ss.close();
}
}
6、URL编程
URL网络资源定位符。
URL的基本表示格式:
protocol://hostnameport/resourcename#anchor
protocol:协议,http、ftp等
hostname:主机名
port:端口号
resourcename:资源名,主机上能访问到的目录或文件
anchor:锚点标记,指定文件中的特定标记位置
常用类:
URL:类URL代表一个统一资源定位符,它是指向互联网“资源”的指针。
常用方法:
// 获取此 URL的协议名称
String getProtocol()
// 获取此 URL的主机名
String getHost()
// 获取此 URL的路径部分
String getPath()
// 获取此 URL的端口号
int getPort()
// 获取此 URL的文件名
String getFile()
// 获取此 URL的锚点
String getRef()
// 返回一个URLConnection对象,它表示到 URL所引用的远程对象的连接
URLConnection openConnection()
// 打开到此URL的连接并返回一个用于从该连接读入的InputStream
InputStream openStream()
URLConnection:抽象类,它代表应用程序和URL之间的通信链接。此类的实例可用于读取和写入此URL引用的资源。
常用方法:
// 将读超时设置为指定的超时值,以毫秒为单位
void setReadTimeout(int timeout)
// 返回连接超时设置
int getConnectTimeout()
// 添加由键值对指定的一般请求属性
void addRequestProperty(String key, String value)
// 返回写入到此连接的输出流。
OutputStream getOutputStream()
// 返回从此打开的连接读取的输入流
InputStream getInputStream()
try {
//网络资源定位对象
URL url = new URL("http://www.baidu.com");
//打开连接 生成连接对象
URLConnection connection = url.openConnection();
//设置超时时间
connection.setConnectTimeout(5000);
//获取输入流
InputStream inputStream = connection.getInputStream();
//字节流转成字符流 并设置编码方式
InputStreamReader reader = new InputStreamReader(inputStream, "utf-8");
//高效流
BufferedReader bufferedReader = new BufferedReader(reader);
String str;
while ((str = bufferedReader.readLine()) != null) {
System.out.println(str);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
注:更多方法查看API