1. 网络模型
OSI(Open System Interconnection)开发系统互联参考模型
TCP/IP 参与模型1.
- 物理层:主要定义物理设备标准,如网线的接口类型、光纤接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转换为电流强弱来进行传输、到达目的地址后再转化为1、0,也就是我们常说的数模转换和模数转换)。这一层的数据较比特。
- 数据链路层:主要将从物理层接受的数据进行MAC地址(网卡地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。
- 网络层:主要将下层接受到的数据进行IP地址封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫数据包。
- 传输层:定义了一些数据传输的协议和端口号(WWW端口号80等),如TCP、UDP主要将从下层接受的数据进行分段和传输,到达目的地进行重组。常把这一层的数据叫段。
- 会话层:通过传输层(端口号:传输端口和接受端口)建立数据传输的通道。主要在你的系统之间发起会话或者接受会话请求(设备之间需要相互认识可以是IP地址也可以是MAC(或者主机名))。
- 表示层:主要进行对接受的数据进行解释、加密和解密,压缩和解压等。也就是把计算机能够识别的东西转化为人能够是被的东西(如图片、声音等)。
- 应用层:主要是终端的应用,比如FTP、WEE、QQ等。
2.网络通讯要素
2.1 IP地址
网络中设备的标识,不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
jiava中的IP类:InetAddress
2.2 端口号
用于标识进程的逻辑地址,不同进程的标识。
有效端口号:0~65535 , 其中0~1024系统使用或保留端口
2.3 传输协议
通讯的规则:
UDP:用户数据包文协议
- 将数据及元和目的封装到数据包中,不要建立连接
- 每个数据包的大小限制在64k内
- 因无连接是不可靠协议
- 不需要建立连接,速度快
TCP:传输控制协议
- 建立连接,形成传输数据的通道
- 在连接中进行大数据量的传输
- 通过三次握手完成连接,是可靠协议
- 必须建立连接,效率会稍低
2.4 TCP/IP:
Socket套接字:
- Socket就是为网络服务提供一种机制
- 通信的两端都有Socket
- 网络通信其实就是Socket之间的通信
- 数据在两个Socket间通过I/O传输。
2.5 UDP传输:
DatagramerSocket &&DatagramerSocket
Demo1:
发送端:
接收端:
Demo2 基于UDP的聊天程序:
- 发送线程任务:
- 接受端线程任务
- 主函数:
2.6.TCP传输
Demo1:
客户端:
服务端:
Demo2:TCP传输例子
客户端输入字母数据,发送给服务端,服务端把数据打印在控制台上,
并转换成大写发送给服务端,直到客户端输入“over”,转换结束
创建一个英文字母大写转换服务器
分析:有客户端,有服务端,就是TCP传输
- 客户端:
思路:
1、创建客户端Socket;
2、客户端数据源:键盘
3、客户端目的:server
4、接受服务端的数据:源:socket的输入流
5、服务端的数据的目的:目的:控制台 6、都是文本数据
转换客户端:
1、客户端socket服务
2、获取键盘录人
3、将键盘数据发送到socket流中
- 服务端:
分析:
1、创建ServerSocket服务
2、获取客户端的Socket对象
3、源:客户端的来自流的数据
4、目的:打印在控制台上
5、将变换成大写的数据发送给客户端
Demo3:文本文件上传
- 上传文件客户端:
思路:
1、 创建客户端Socket服务;
2、读取客户端文件;
3、获取Socket的输出流;
4、将客户端的文件通过输出流发送到服务端
5、读取服务端的返回的数据;
6、将其打印在控制台上;
7、关闭流.
public class UploadClient {
public static void main(String[] args) throws IOException {
// 1、 创建客户端Socket服务;
Socket s = new Socket("192.168.1.216", 10009);
// 2、读取客户端文件;
BufferedReader bur = new BufferedReader(new FileReader("client.txt"));
// 3、获取Socket的输出流;
PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream(), "utf-8"), true);
// 4、将客户端的文件通过输出流发送到服务端
String line = null;
while ((line = bur.readLine()) != null) {
pw.println(line);
}
s.shutdownOutput();
// 5、读取服务端的返回的数据;
BufferedReader burin = new BufferedReader(new InputStreamReader(s.getInputStream()));
// 6、将其打印在控制台上;
String str = null;
str = burin.readLine();
System.out.println(str);
// 7、关闭流.
s.close();
bur.close();
}
}
- 上传文件服务端:
思路:
1、创建服务端的ServerSocket服务;
2、获取客户端的socket对象;
3、获取客户端的数据并保存在文件中;
4、告诉客户端上传成功;
5、关闭流。
Demo4:mp3文件上传
- 文件上传客户端:
public class UploadpicClient {
public static void main(String[] args) throws UnknownHostException, IOException {
// 1、建立客户端的Socket服务
Socket s = new Socket("192.168.1.216", 10012);
// 2、获取图片资源
BufferedInputStream burin = new BufferedInputStream(
new FileInputStream("F:\\CloudMusic\\罗大佑,黄霑,徐克 - 沧海一声笑.mp3"));
// 3、获取socket输出流
PrintStream pso = new PrintStream(s.getOutputStream(), true);
// 4、将数据写入到输出流
byte[] buff = new byte[1024];
int len = -1;
while ((len = burin.read(buff)) != -1) {
pso.write(buff, 0, len);
}
s.shutdownOutput();
// 5、获取服务端的返回的数据
InputStream is = s.getInputStream();
byte[] buffin = new byte[1024];
int lenth = is.read(buffin);
String str = new String(buffin, 0, lenth);
System.out.println(str);
// 6、关闭流
s.close();
burin.close();
}
}
- 文件上传服务端:
Demo 03:多线程实现服务端
- 线程任务:
public class TaskDemo implements Runnable {
private Socket s;
public TaskDemo(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
int count = 0;
System.out.println(s.getInetAddress().getHostAddress() + "connnected.......");
try {
BufferedInputStream burin = new BufferedInputStream(s.getInputStream());
File file = new File("serve.mp3");
// 如果文件不存在
if (!file.exists())
file.mkdirs();
// 如果文件存在
while (file.exists()) {
file = new File("serve" + (count++) + ".mp3");
}
PrintStream ps = new PrintStream(new FileOutputStream(file), true);
byte[] buff = new byte[1024];
int len = -1;
while ((len = burin.read(buff)) != -1) {
ps.write(buff, 0, len);
}
PrintStream psout = new PrintStream(s.getOutputStream(), true);
psout.println("上传成功");
s.close();
ps.close();
} catch (Exception e) {
// TODO: handle exception
}
}
}
- 调用实例:
public class ServerthreadDemo {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(10069);
while (true) {
Socket s = ss.accept();
new Thread(new TaskDemo(s)).start();
}
}
}