这部分为大家介绍套接字的实现。分为三部分:1.介绍一些网络模型 2. 介绍一些基础常识 3.书写小demo
一、网络模型:
7层网络模型:
1》应用层:提供给操作系统或者应用程序,用来进行网络通信的标准接口
2》表示层:不同的pc机拥有不同的编码方式,需要在这里进行转换,转换成网络通信中采用的标准表现形式
3》会话层:负责在不同的PC的不同进程之间建立或者拆除连接,另外,还有插入同步点的机制(保证断线重新从这个位置传输)
4》传输层:负责两个主机之间的端对端的数据连接&传输
5》网络层:选择合适的路由,职责就是正确的找着目的站
6》数据链路层:负责在两个相邻的节点之间准确的传输数据(以帧为单位,每一帧:数据+控制信息)
7》物理层:让原始的数据比特流能在物理介质上传输
IP层在传输层哪个,UDP和TCP在会话层,使用java的套接字,主要针对的是会话层编程,实现连接和通信。
二:基础知识:
1. IP:标记每天主机在互联网上的地址,每4组数表示一个IP地址,每一组数在0-255之间。
2. 端口号:端口可以认为是计算机设备和外界通讯交流的出口。目前一台电脑有65536个端口,端口号在0-65535之间,其中0-1024为已用的端口号。
3. DNS解析服务器:我们访问一台服务器,有两种方式访问,一种是通过ip,第二种就是域名。那么域名如何定位到要寻找的IP呢?这就需要我们用的DNS服务器来讲域名和IP一一对应。所以说,最本质还是通过互联网上唯一的IP进行访问。
三:java的互联网编程:
1. Udp编程:
UDP 是User Datagram Protocol的简称,中文名是用户数据报协议。基于流的。不建立连接,不可靠;传输速率相对较高;需要对数据进行封包,每个包不超过64K。---适用于要求速度而不要求可靠性的场景---视频聊天、直播。
发送端和接收端:DatagramSocket、DatagramPacket
Demo 案例:使用UDP实现单人聊天:
importjava.net.DatagramPacket;
importjava.net.DatagramSocket;
import java.net.InetSocketAddress;
importjava.util.Scanner;
public class ChatExer {
publicstatic void main(String[] args) {
newThread(new Receiver()).start();
newThread(new Sender()).start();
}
}
class Sender implements Runnable {
privateDatagramSocket ds;
privateDatagramPacket dp;
@SuppressWarnings("resource")
@Override
public voidrun() {
try{
//创建套接字对象
ds= new DatagramSocket();
Scanners = new Scanner(System.in);
while(true) {
//读取数据
Stringmsg = s.nextLine();
//将数据封包
dp= new DatagramPacket(msg.getBytes(), msg.getBytes().length,
newInetSocketAddress("255.255.255.255", 8080));
//发送数据
ds.send(dp);
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
class Receiver implements Runnable {
privateDatagramSocket ds;
privateDatagramPacket dp;
@Override
public voidrun() {
try{
//创建套接字对象,绑定端口号
ds= new DatagramSocket(8080);
//准备数据包
dp= new DatagramPacket(new byte[1024], 1024);
while(true) {
//接受数据
ds.receive(dp);
//解析数据
System.out.println(dp.getAddress()+ ":");
System.out.println(newString(dp.getData(), 0, dp.getLength()));
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
2. 基于TCP实现:
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。基于流的。建立连接,经过三次握手,可靠。传输速率相对较慢。理论上不限制数据大小。
Demo 案例:使用tcp发送和接收数据
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
public class TCPClientDemo {
publicstatic void main(String[] args) throws Exception {
//创建客户端的套接字对象
Sockets = new Socket();
//发起连接
s.connect(newInetSocketAddress("localhost", 8080)); // 阻塞
//获取输出流
OutputStreamout = s.getOutputStream();
//写出数据
out.write("hello,服务器端~~~".getBytes());
//通知服务器端数据全部写出完毕
s.shutdownOutput();
//读取服务器端打回的消息
InputStreamin = s.getInputStream();
byte[]bs = new byte[1024];
intlen = -1;
while((len = in.read(bs)) != -1) {
System.out.println(newString(bs, 0, len));
}
s.shutdownInput();
//关流
s.close();
}
}
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServerDemo {
public static void main(String[]args) throws Exception {
// 创建服务器端的套接字对象,监听指定的端口号
ServerSocket ss = newServerSocket(8080);
// 接受连接
Socket s = ss.accept();// 阻塞
// 获取输入流
InputStream in =s.getInputStream();
// 读取数据
byte[] bs = newbyte[1024];
int len = -1;
while ((len =in.read(bs)) != -1) {
System.out.println(newString(bs, 0, len));
}
// 通知客户端数据已经读取完毕
s.shutdownInput();
// 服务器端向客户端打回消息
OutputStream out =s.getOutputStream();
out.write("注册成功~~~".getBytes());
s.shutdownOutput();
// 关流
ss.close();
}
}