目录
一.socketAPI中TCP的使用
1.socket中TCP的类和常用方法
(1)服务端使用的ServerSocket类
?(2)socket类
2.使用ServerSocket实现一个简单的客户段与服务端交互
(1)图解思路?
(2)代码实现
(3)运行结果
二.初识TCP协议段
1.认识TCP报头结构
2.TCP的三大特点
一.socketAPI中TCP的使用
1.socket中TCP的类和常用方法
(1)服务端使用的ServerSocket类
常用方法如下:
方法名 | 方法说明 | ServerSocket(int port)? | 创建绑定到指定端口的服务器套接字 | ServerSocket(int port, int backlog) | ?创建服务器套接字并将其绑定到指定的本地端口号,并指定了积压。 | Socket accept() | ?侦听要连接到此套接字并接受它 | bind(SocketAddress endpoint)? | 将ServerSocket绑定到特定地址(IP地址和端口号) | InetAddress getInetAddress() | ?返回此服务器套接字的本地地址 | void close() | 关闭此套接字 | int getLocalPort()? | 返回此套接字正在侦听的端口号 |
注意:在使用TCP协议进行传输的时候,是以字节流进行传输,所以里面会涉及到流的关闭问题。
?(2)socket类
因为serversocket 中accept()相当于从阻塞队列中取一个客户端请求。所以还需要使用socket来配合使用。
方法名 | 方法说明 | Socket(InetAddress address, int port) | 创建流套接字并将其连接到指定IP地址的指定端口号 | Socket(String host, int port) | 创建流套接字并将其连接到指定主机上的指定端口号 | void bind(SocketAddress bindpoint) | ?将套接字绑定到本地地址 | void connect(SocketAddress endpoint) | ?将此套接字连接到服务器 | InetAddress getInetAddress() | ?返回套接字所连接的地址 | InputStream getInputStream() | ?返回此套接字的输入流 | OutputStream getOutputStream()? | 返回此套接字的输出流 |
2.使用ServerSocket实现一个简单的客户段与服务端交互
(1)图解思路?
(2)代码实现
客户端
package javaweb.udptcp2.tcp;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class TCPClient {
Socket socket = null;
public TCPClient(String serverIp, int serverPort) throws IOException {
socket = new Socket(serverIp,serverPort);
}
public void start() {
System.out.println("客户端运行");
//通过控制台输入请求数据
Scanner sc = new Scanner(System.in);
//以字节流进行发送数据,所以使用流进行处理
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))){
while (true) {
String request = sc.nextLine();
//退出客户端
if("exit".equals(request)) {
break;
}
//将请求发送给服务端(以什么格式发送就以什么格式接收(这里包含换行,所以可以使用readLine接收))
bufferedWriter.write(request+"\n");
bufferedWriter.flush();
//接收响应(等待响应的过程中,就阻塞在这里)
String respons = bufferedReader.readLine();
//将响应结果输出到控制台
System.out.println(respons);
}
} catch (IOException e) {
e.printStackTrace();
}
}
//启动客户端
public static void main(String[] args) throws IOException {
TCPClient client = new TCPClient("127.0.0.1", 9090);
client.start();
}
}
服务端
package javaweb.udptcp2.tcp;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
//实现简单的翻译单词功能
public class TCPServer {
ServerSocket serverSocket = null;
HashMap<String, String> words = new HashMap<>();
public TCPServer(int port) throws IOException {
serverSocket = new ServerSocket(port);
words.put("cat","猫");
words.put("dog","狗");
words.put("fish","鱼");
words.put("beef","牛肉");
}
public void start() throws IOException {
System.out.println("服务器启动");
while (true) {
//从阻塞队列中取出一个客户端连接
Socket clientSocket = serverSocket.accept();
//这里使用另一个线程专门进行数据处理(目的是为了提高效率)
Thread t = new Thread(new Runnable() {
@Override
public void run() {
processConnection(clientSocket);
}
});
t.start();
}
}
private void processConnection(Socket clientSocket) {
System.out.printf("[%s:%d] 客户端上线\n",clientSocket.getInetAddress().toString(),clientSocket.getPort());
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()))){
while (true) {
//获取请求
String request = bufferedReader.readLine();
//根据请求计算响应
String respons = process(request);
//将响应发送个客户端
bufferedWriter.write(respons+"\n");
//使用buffer需要刷新缓冲区
bufferedWriter.flush();
System.out.printf("[%s:%d] request:%s;response:%s\n",clientSocket.getInetAddress().toString(),clientSocket.getPort(),request,respons);
}
} catch (IOException e) {
System.out.printf("[%s:%d]客户端下线\n",clientSocket.getInetAddress().toString(),clientSocket.getPort());
}
}
private String process(String request) {
if(words.containsKey(request)) {
return words.get(request);
}
return "没有找到";
}
public static void main(String[] args) throws IOException {
TCPServer server = new TCPServer(9090);
server.start();
}
}
(3)运行结果
?
二.初识TCP协议段
1.认识TCP报头结构
2.TCP的三大特点
- 有连接:在传输数据时需要建立连接。
- 可靠传输:有确认应答机制, 有重传机制; 如果因为网络故障该段无法发到对方, TCP协议层会给应用层返回错误信息。
- 面向字节流:根据字节进行网络传输数据。
|