目录
1. OSI七层模型、TCP/IP五层模型示意图
2.每层对应的协议
3.Socket
3.1 概念
3.2 通信模型(TCP)
3.2.1 单线程
3.2.2 线程池
3.3 通信模型--UDP
3.3.1 示意图
3.3.2 代码
1. OSI七层模型、TCP/IP五层模型示意图
2.每层对应的协议
3.Socket
3.1 概念
在计算机通信领域,socket被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。即通过socket种种约定,一台计算机可以接受其他计算机的数据,也可以向其他计算机发送数据。
3.2 通信模型(TCP)
先启动服务器端,在启动客户端,通过客户端输入的信息能够发送到服务器端。
3.2.1 单线程
public class TCPServer {
public static void main(String[] args) throws Exception {
final int PORT = 9999;//端口
//创建ServerSocket,指定端口
ServerSocket server = new ServerSocket(PORT);
System.out.println("服务器启动成功...");
boolean f = true;
while(f) {
//监听端口,等待客户端请求
Socket socket = server.accept();
//解析--获取传输信息,读传输信息(编码要求utf-8),设置缓冲区
InputStream stream = socket.getInputStream();
InputStreamReader in = new InputStreamReader(stream, "utf-8");
char[] buffer = new char[64];
//in.read()==-1 表示信息已被读完
while(in.read(buffer)!=-1) {
String line = new String(buffer);
System.out.println(line);
//清空buffer
Arrays.fill(buffer, (char)0);
}
System.out.println();
}
server.close();
}
}
public class TCPClient {
public static void main(String[] args) throws Exception {
final int PORT = 9999;//端口
final String HOST = "127.0.0.1";//ip地址
Scanner sc = new Scanner(System.in);
Socket socket = new Socket(HOST, PORT);
while(true) {
System.out.println("请输入:");
String s = sc.nextLine();
//输入流--写入传输信息
OutputStream out = socket.getOutputStream();
OutputStreamWriter ow = new OutputStreamWriter(out);
ow.write(s);
ow.flush();//强制数据输出
}
}
}
执行结果如下所示:
3.2.2 线程池
public class TCPServerThread {
public static void main(String[] args) throws Exception {
final int PORT = 9999;
//创建ServerSocket,指定端口
ServerSocket server = new ServerSocket(PORT);
System.out.println("服务器端启动成功....");
//线程池
final Executor threadPool = Executors.newFixedThreadPool(10);
boolean f = true;
while(f) {
//监听端口,等待客户端请求
Socket socket = server.accept();
//线程池开启线程
threadPool.execute(()->{
//解析
try {
InputStreamReader in =
new InputStreamReader(socket.getInputStream(),"utf-8");
char[] buffer = new char[64];
while(in.read(buffer)!=-1) {
String line = new String(buffer);
System.out.println(line);
//清空buffer
Arrays.fill(buffer, (char)0);
}
System.out.println();
OutputStream out = socket.getOutputStream();
out.write(1);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
});
}
server.close();
}
}
public class TCPClientThread {
public static void main(String[] args) throws Exception {
final int PORT = 9999;
final String HOST = "127.0.0.1";
Scanner sc = new Scanner(System.in);
Executor threadPool = Executors.newSingleThreadExecutor();
while(true) {
Socket socket = new Socket(HOST, PORT);
System.out.println("请输入:");
String s = sc.nextLine();
Thread.sleep(1000);
//向服务器写入数据
threadPool.execute(()->{
try {
OutputStreamWriter ow =
new OutputStreamWriter(socket.getOutputStream());
ow.write(s);
ow.flush();
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
}
执行结果如下图所示:
3.3 通信模型--UDP
目录
1. OSI七层模型、TCP/IP五层模型示意图
3.3.1 示意图
3.3.2 代码
public class UDPServer {
public static void main(String[] args) throws Exception {
final int PORT = 9999;
DatagramSocket socket = new DatagramSocket(PORT);
System.out.println("接收端启动.....");
byte[] buffer = new byte[1024];
//打包
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String msg = new String(packet.getData());
System.out.println("[接收端]接收数据>>>"+msg);
socket.close();
}
}
public class UDPClient {
public static void main(String[] args) throws Exception {
final int PORT = 9999;
final String HOST = "127.0.0.1";
DatagramSocket socket = new DatagramSocket();
String msg = "测试发送端发送一条信息";
byte[] buffer = msg.getBytes();
DatagramPacket packet =
new DatagramPacket(buffer, buffer.length,
InetAddress.getByName(HOST), PORT);
System.out.println("[发送端]发送信息.........");
socket.send(packet);
socket.close();
}
}
执行结果如下图所示:



