网络编程
网络分层
由于结点之间联系很复杂,在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。
端口
端口是虚拟的概念,并不是说在主机上真的有若干个端口。通过端口,可以在一个主机上运行多个网络应用程序。可以类比为:IP 相当于公司,端口相当于公司各部门,URL,相当于各部门的人员
//1) 、获取对象InetSocketAddress(Stringhostname, intport)
InetSocketAddress(InetAddressaddr, intport)
//2) 、方法
getAddress() //返回 InetAddress 对象
getPort() //返回端口
getHostName() //返回域名
URL
URL全称是Uniform Resource Location,也就是统一资源位置。实际上,URL就是一种特殊的URI,它除了标识一个资源,还会为资源提供一个特定的网络位置,客户端可以通过它来获取URL对应的资源。
protocol://userInfo@host:port/path?query#fragment 协议://用户信息@主机名:端口/路径?查询#锚点
协议
TCP:TCP(transfer control protocol) 打电话面向连接、安全、可靠,效率低UDP:UDP(UserDatagramProtocol ) 发送短信非面向连接、不安全、数据可能丢失、效率高
UDP
UserDatagramProtocol,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。其特点为:非面向连接;传输不可靠;数据可能丢失。
服务端示例
public class Server {
public static void main(String[] args) throwsException {
DatagramSocket ds=new DatagramSocket(8999);
byte[] b=new byte[1024];
DatagramPacket dp=new DatagramPacket(b,b.length);
ds.receive(dp); //阻塞式方法
String string = new String(dp.getData(),0,dp.getLength());
//dp.getLength()返回实际收到的数据的字节数
System.out.println(string);
ds.close();
}
}
客户端示例
public class Client {
public static void main(String[] args) throwsException {
// 创建要发送数据报包的工具,我本身占用9000端口向外面机器发数据包
DatagramSocket ds = new DatagramSocket(9000);
byte[] b="aaaa".getBytes();
//必须告诉数据包要发到哪里去,封装数据时才指定目标电脑以及端口
DatagramPacket dp = new DatagramPacket(b,b.length,newInetSocketAddress("localhost",8999));
ds.send(dp);
ds.close(); }}
TCP
服务器端示例
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/*
tcp实现: 服务器端
1.定义我是服务端 ServerSocket ServerSocket(int port) 创建一个服务器套接字绑定到指定端口。
2.阻塞式监听 Socket accept() 监听连接套接字并接受它。
3.通过IO读入数据
4.处理数据
5.关闭
*/
public class TCPServer02 {
public static void main(String[] args) throws Exception {
//1.定义我是服务端
ServerSocket server = new ServerSocket(9999);
System.out.println("--------------Server-----------------");
//2.阻塞式监听
Socket client = server.accept();
System.out.println("一个客户端已经连接成功....");
//3.获取输入流
DataInputStream is = new DataInputStream(new BufferedInputStream(client.getInputStream()));
//4.读入 数据
String msg = is.readUTF();
System.out.println(msg);
//5.关闭
is.close();
client.close();
server.close();
}
}
客户端示例
import java.io.*;
import java.net.Socket;
/*
tcp实现: 客户端
1.定义我是一个客户端 Socket
2.通过IO操作发送数据
3.刷出
4.关闭
*/
public class TCPClient01 {
public static void main(String[] args) throws Exception {
//1.定义我是一个客户端 Socket
Socket client = new Socket("localhost",9999);
System.out.println("------------------Client--------------");
//2.获取输出流 getOutputStream()
DataOutputStream os = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
//3.写出字符串
os.writeUTF("哈哈哈");
//4.刷出
os.flush();
//5.关闭
os.close();
client.close();
}
}