一、网络基础
1.计算机网络
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
2.通信协议
网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。而TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际互连协议)是Internet中最基本的协议,是指能够在多个不同网络间实现信息传输的协议簇。
3.参考模型
4.网络结构
客户端/服务器(C/S): 服务器:始终运行并监听端口,等待客户请求并做出响应 客户:需要服务时向服务器发出请求 浏览器 /服务器(B/S): 服务器:不用实时监听端口,客户请求后把响应结果返回 客户:需要服务时向服务器发出请求
5.IP地址和端口号
6.TCP和UDP区别
- TCP是面向连接的,UDP是面向无连接的
- UDP程序结构较简单
- TCP基于字节流,UDP基于数据报
- TCP保证数据正确性,UDP可能丢包
- TCP保证数据顺序,UDP不保证
二、基于TCP的Socket
1.创建步骤
服务器一般步骤:
- 基于端口创建ServerSocket(套接字服务)
- 等待客户端连接
- 获取客户端的输入流
- 使用客户端的输入流(写出到文件或者输出等)
- 告知客户端,服务器接收完毕
- 关闭资源,断开连接
客户端一般步骤:
- 基于服务器的IP地址和端口创建Socket(套接字)连接
- 创建一个输出流
- 向输出流中写入数据(文件或文本等)
- 告知服务器,客户端发送完毕
- 关闭资源,断开连接
2.代码示例
服务器:
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(6666);
Socket clientSocket = serverSocket.accept();
InputStream is = clientSocket.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("server.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer,0,len);
}
System.out.println("server.jpg-->下载完成");
clientSocket.shutdownInput();
OutputStream os = clientSocket.getOutputStream();
os.write("服务器已经接收完,可以断开连接了".getBytes());
clientSocket.shutdownOutput();
fos.close();
is.close();
clientSocket.close();
serverSocket.close();
}
}
客户端:
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 6666);
OutputStream os = socket.getOutputStream();
FileInputStream fis = new FileInputStream(new File("client.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer,0,len);
}
socket.shutdownOutput();
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[1024];
int len2;
while ((len2 = is.read(buffer2)) != -1) {
baos.write(buffer2,0,len2);
}
System.out.println(baos.toString());
socket.shutdownInput();
baos.close();
is.close();
fis.close();
os.close();
socket.close();
}
}
3.运行结果
先启动服务器,再启动客户端,不然会连接失败
三、基于UDP的Socket
1.创建步骤
发送方的一般步骤:
- 创建DatagramSocket(数据报套接字)
- 基于接收方的IP和端口,创建InetSocketAddress(IP套接字地址)
- 创建数据包
- 发送数据包
- 关闭资源,断开连接
接收方的一般步骤:
- 基于发送方的端口,创建DatagramSocket(数据报套接字)
- 接收数据包
- 获取数据包中的数据,并使用
- 关闭资源,断开连接
2.代码示例
接收方(监听线程):
public class Listen implements Runnable {
private DatagramSocket socket =null;
private int fromPort;
private String fromName;
public Listen(int fromPort,String fromName) {
this.fromPort = fromPort;
this.fromName = fromName;
}
@Override
public void run() {
try {
socket = new DatagramSocket(fromPort);
while (true) {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);
String receiveData = new String(packet.getData(), 0, packet.getLength());
System.out.println(this.fromName + ":" + receiveData);
if (receiveData.equals("bye")) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
socket.close();
}
}
}
发送方(发送线程):
public class Talk implements Runnable {
private DatagramSocket socket = null;
private InetSocketAddress socketAddress = null;
private int toPort;
private String toHostName;
public Talk(String toHostName, int toPort) {
this.toPort = toPort;
this.toHostName = toHostName;
}
@Override
public void run() {
try {
socket = new DatagramSocket();
socketAddress = new InetSocketAddress(toHostName,toPort);
while (true) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String data = reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas,0,datas.length, this.socketAddress);
socket.send(packet);
if ("bye".equals(data)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
socket.close();
}
}
}
学生启动两个线程
public class Student {
public static void main(String[] args) {
new Thread(new Talk("localhost",6666)).start();
new Thread(new Listen(8888,"老师")).start();
}
}
教师启动两个线程
public class Teacher {
public static void main(String[] args) {
new Thread(new Talk("localhost",8888)).start();
new Thread(new Listen(6666,"学生")).start();
}
}
3.运行结果
|