网络编程
网络通信的介绍
- 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据
- 两台电脑连在一起就组成了一个计算机网络。我们通过光纤连接到电信的网关,中国电信通过海底光缆和美国电信网关连接,你就是和全世界的在线用户连着
如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数?
TCP/IP 协议
1.三次握手
2.TCP/IP协议
- TCP协议是一种以固连线为基础的协议,它提供两台计算机之间可靠的数据传送。
- TCP可以保证从一端数据传至连接的另一端时,数据能够确实送达。
- TCP协议适合可靠性比较高的场合,就像拨打电话。
接下来我们用简单的例子来介绍从服务器段下载文件;通信流程如下:
- 客户端创建Socket
- 服务端创建ServerSocket
- 客户端绑定服务器ip地址和Socket端口
- 服务端绑定服务器端口
- 客户端请求服务器链接
- 服务端阻塞监听客户端请求
- 客户端连接
- 服务端连接成功返回Socket
- 客户端输入输出流通信
- 服务端通过输入输出流通信
- 客户端关闭流
- 服务端关闭流
- 客户端关闭Socket
- 服务端关闭Socket和ServerSocket
首先我们建立服务端
package server;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Smain {
public static void main(String[] args) {
try {
//1.服务端创建ServerSocket
ServerSocket ssk = new ServerSocket(9090);
while (true) {
//2.服务端阻塞监听客户端请求
Socket ck = ssk.accept();
//3.创建输入输出流
DataInputStream din = new DataInputStream(ck.getInputStream());
DataOutputStream dout = new DataOutputStream(ck.getOutputStream());
//读取客户端发送的信息
int key = din.readInt();
String fname = "03.mp4";
switch (key) {
case 1:
fname = "01.mp4";
break;
case 2:
fname = "02.mp4";
break;
}
//读取服务器上对应的mp4文件并用输出流发送给客户端
FileInputStream fin = new FileInputStream(fname);
byte[] data = new byte[1024*5];
while (true) {
int len = fin.read(data);
if(len == -1) {
break;
}
dout.write(data, 0, len);
}
dout.close();
fin.close();
din.close();
ck.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
建立客户端
package client;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Cmain {
public static void main(String[] args) {
try {
Scanner input = new Scanner(System.in);
//1.建立客户端Socket
Socket ck = new Socket("192.168.31.13", 9090);
//让客户端选择服务器对应的MP4文件编号
System.out.println("请输入对应的MP4文件编号:1) 01.mp4;2) 02.mp4; 3)03.mp4;");
int key = input.nextInt();
//让客户输入下载地址和保存的文件名
System.out.println("请输入保存地址以及文件名:");
String path = input.next();
String name = input.next();
DataOutputStream dout = new DataOutputStream(ck.getOutputStream());
DataInputStream din = new DataInputStream(ck.getInputStream());
//选择的MP4文件编号发送给服务端
dout.writeInt(key);
//建立文件输入流保存在本地
FileOutputStream fout = new FileOutputStream(path+"/"+name);
byte[] data = new byte[1024*5];
while(true) {
int len = din.read(data);
if(len == -1) {
break;
}
System.out.println("len:"+len);
fout.write(data, 0, len);
}
fout.close();
din.close();
dout.close();
ck.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这样我们可以实现简单的从服务器上下载文件的操作