网络编程
OSI参考模型(图网上找的)
网络:将不同区域计算机连接到一起(局域网,互联网)
地址:确定网络上一个绝对位置(例如房子的地址)
端口号:区分计算机软件(例如房子的房门 两个字节0-65535)
在同一个协议下端口号不能重复,不同协议下可以重复
1024以下的端口号一般都已经被大厂预定了 80->http
资源定位:URL 统一资源定位符 URI:统一资源
数据传输:1、协议:Tcp和UDP协议
Tcp(transfer:类似于电话 面向安全不过效率低下
UDP:短信 非面向链接 效率高 传输不可靠
2、传输
先封装 后拆封
类:1、InetAddress封装DNS及IP
方法:
InetAddress.getHouseAddress(); InetAddress.getHouseName("ip地址");
getHouseAddress()返回ip地址 getHouseName()返回域名|本机为计算机
InetSocketAddress封装端口
方法:
InetSocketAddress.getHouseAddress(String hostname,int port);
InetSocketAddress.getHouseAddress(InetAddress addr ,int port);
2、URL
创建:URL(String spec) 绝对路径构建 URL(URL connect,String spec) 相对路径构建
URL url=new URL("www.baidu.com:80/xxxxx");//绝对路径构建
url=new URL(url,"/b.txt");//相对路径构建
3、TCP:ServerSocket Socket
4、UDP:以数据为中心 非面向链接 不安全but效率高
(1) 客户端:
创建客户端 DatagramSocket类-》准备数据 字节数组-》打包 DatagramPacket+服务器地址及端口-》发送-》释放资源
(2)服务器端:
创建服务器DatagramSocket+指定窗口 -》准备接受容器 封装DatagramPacket-》包 接收数据-》分析-》释放资源
DatagramSocket
//构造方法,创建数据报套接字并将其绑定到本地主机上的指定端口
DatagramSocket socket = new DatagramSocket(0);
DatagramPacket
DatagramPacket(byte[] buf,int offset,InetAddress address,int port);//建立要发送的UDP包
BS和CS的区别以及优缺点
BS:客户端电脑负荷简化,减轻了系统维护、升级的支出成本,降低了用户的总体成本
要求有操作系统和浏览器就行,与操作系统平台无关,对设备要求较低。
CS:交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据
一般只用于局域网 对设备要求高
总结:CS响应速度快,安全性强,一般应用于局域网中,但是开发维护成本高;BS可以实现跨平台,客户端零维护,但是个性化能力低,响应速度较慢。日常办公应用BS,在实际生产中使用CS结构。
TCP通信
客户端:
public class ChatClient {
private String host = "localhost";
private int port = 8189;
public ChatClient() {
}
public ChatClient(String host, int port) {
this.host = host;
this.port = port;
}
public void chat() {
try {
Socket socket = new Socket(host, port);
try {
DataInputStream in = new DataInputStream(socket
.getInputStream());
DataOutputStream out = new DataOutputStream(socket
.getOutputStream());
Scanner scanner = new Scanner(System.in);
while (true) {
String send = scanner.nextLine();//读取控制台输入的内容
System.out.println("客户端:" + send);//输出键盘输出内容提示 ,也就是客户端向服务器端发送的消息
// 把从控制台得到的信息传送给服务器
out.writeUTF("客户端:" + send);//将客户端的信息传递给服务器
String accpet = in.readUTF();// 读取来自服务器的信息
System.out.println(accpet);//输出来自服务器的信息
}
} finally {
socket.close();//关闭Socket监听
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ChatClient().chat();
}
}
服务器端:
public class ChatServer {
private int port = 8189;
public ChatServer() {
}
// 创建指定端口的服务器
public ChatServer(int port) {//构造方法
this.port = port;
}
public void service() {
try {// 建立服务器连接
ServerSocket server = new ServerSocket(port);//创建 ServerSocket
Socket socket = server.accept();// 等待客户连接
try {
DataInputStream in = new DataInputStream(socket
.getInputStream());// 读取客户端传过来信息
DataOutputStream out = new DataOutputStream(socket
.getOutputStream());// 向客户端发送信息
Scanner scanner = new Scanner(System.in);//从键盘接受数据
while (true) {
String accpet = in.readUTF();// 读取来自客户端的信息
System.out.println(accpet);//输出来自客户端的信息
String send = scanner.nextLine();//nextLine方式接受字符串
System.out.println("服务器:" + send);//输出提示信息
out.writeUTF("服务器:" + send);//把服务器端的输入发给客户端
}
} finally {// 建立连接失败的话不会执行socket.close();
socket.close();//关闭连接
server.close();//关闭
}
} catch (IOException e) {//捕获异常
e.printStackTrace();
}
}
public static void main(String[] args) {//主程序方法
new ChatServer().service();//调用 service方法
}
}
两篇端口代码转载自这大佬写的
主要还没完全学明白,,,,,理解并按照步骤一步一步敲的。。。。。
tps:运行前建立两个控制台窗口。