一.什么是Socket?
- 通信链路的端点就被称为套接字,英名文为’Socket’
- 是提供给应用程序的接口,类似我们日常生活中的快递点
- Socket的底层机制比较复杂,java平台提供了一些简单的API,可更简单有效的使用Socket开发而无需了解底层机制
- 所在包为java.net包中
二.Socket通信模型
- 1.基于TCP协议的Socket网络通信–>用来实现双向安全连接网络通信
- 2.Socket通信模型
- 进行网络通信时Socket需要借助数据流来完成数据的传递工作,如下:
![数据流传递](https://i-blog.csdnimg.cn/blog_migrate/afaf54576c913ba38ab88a0b19d36328.png)
三.Socket编程步骤
- 建立连接–>网络编程模型:客户端/服务器
- 打开Socket关联的输入输出流
- 数据流中读写信息
- 关闭所有的数据流和Socket
客户端向服务端提交请求的交互过程
- 1.Server端开放端口:
ServerSocket ss=new ServerSocket(6000);
- 2.Server端监听端口:
Socket s=s = ss.accept();
- 3.client端连接server端端口:
Socket s = new Socket("127.0.0.1",6000);
- 4.client端获取输出流–>在输出流中写入数据:
OutputStream os = s.getOutputStream();
- 5.server端监听到client端的数据传输,server端获取输入流–>读取输入流的数据:
InputStream is = s.getInputStream();
- 6.依次关闭client端和server的流和socket对象
四.demo:实现一个客户发出请求,服务端向客户端响应的交互过程
1)服务器端:
package net;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TestServer {
public static void main(String[] args)throws Exception {
while (true) {
ServerSocket ss = new ServerSocket(6000);
System.out.println("服务器启动,等待客户端!");
Socket s = ss.accept();
InputStream is = s.getInputStream();
byte[] b = new byte[is.available()];
is.read(b);
char[] c = new char[b.length];
for (int i = 0; i < b.length; i++) {
c[i] = (char) b[i];
}
String rst = String.valueOf(c);
System.out.println(rst);
String a = "I am server";
OutputStream os = s.getOutputStream();
os.write(a.getBytes());
os.close();
is.close();
s.close();
ss.close();
}
}
}
2)客户端:
package net;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TestClient {
public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1",6000);
OutputStream os = s.getOutputStream();
String str ="hello,I am client No.1 for test";
os.write(str.getBytes());
InputStream is = s.getInputStream();
int temp;
StringBuffer sb = new StringBuffer();
while ((temp=is.read())!=-1){
sb.append((char)temp);
}
System.out.println(sb.toString());
is.close();
os.close();
s.close();
}
}
五.交互效果如下:
- 1.服务器端:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f10cd1ec9b964b84bee0c567e57efeb8.png)
- 2.客户端:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f2596c913d6fbb018bb16de77ee8ea55.png)