TCP编程基础知识
创建两端
- 服务器端创建:ServerSocket 指定固定的端口
- 客户端创建:Socket 构建方法里面直接填写服务器端的IP和端口
读写消息
- 读取消息:BufferReader -> readLine
- 写入消息:BufferWriter -> write
其中Buffer叫作缓冲区(类似于菜鸟驿站)
作用:高效地进行收发消息
TCP 既有发送缓冲区,又有接收缓冲区
UDP 没有发送缓冲区,只有接收缓冲区(因为无连接的特性)
TCP编程实操
服务器端
实现步骤:
- 启动服务器,设置服务器端口号
用ServerSocket来构建服务器,传入端口号的参数 - 等待客户端链接
用accept方法来接收客户端 - 收发信息
BufferedReader和BufferedWriter创建读取对象和写入对象
然后reader读取收到客户端的消息,writer发送消息给客户端
(因为TCP有发送缓冲区,所以需要用flush直接进行发送)
注意:
声明BufferedReader和BufferedWriter每次用完后都需要关闭的
在jdk1.7后,可以定义try(){ }
()中声明之后需要关闭的对象,{ } 中执行相应的逻辑
在程序执行完毕后,会自动帮你处理()中的内容进行关闭处理
package tcptest;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
* Description:服务器端
* User: starry
* Date: 2021 -04 -16
* Time: 16:20
*/
public class TCPServer {
//端口号
private static final int port = 9002;
static Map<String,String> map = new HashMap<>();
static {
map.put("星星","star");
map.put("星空","starry");
map.put("骑士","knight");
map.put("大树","tree");
map.put("亮光","light");
}
public static void main(String[] args) throws IOException {
//1.启动服务器,设置服务器端口号
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("服务器已启动");
//2.等待客户端链接
Socket socket = serverSocket.accept();
//执行到这一步后,就有客户端连接上了,输出打印客户端信息
System.out.println(String.format("客户端的ip地址为:%s,端口号为:%d",
socket.getInetAddress().getHostAddress(),
socket.getPort()));
//3.收发信息
try(
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())
)
){
while(true) {
//接收客户端的消息
String msg = reader.readLine();
//非空效验
if(msg != null && !msg.equals("")) {
System.out.println("客户端:"+msg);
//给客户端反馈一个消息
String serMsg = transform(msg);
writer.write(serMsg+"\n"); //\n不能省略(因为读取的时候是按行读取)
//发送缓冲区刷新操作(执行此步骤意味着立马将缓冲区的消息发送出去)
writer.flush();
}
}
}
}
private static String transform(String msg) {
String cn = map.get(msg);
return cn == null? "未知":cn;
}
}
这里用hashmao进行汉英键值对的写入,这样不是理想的汉译英版本
如果有小伙伴会python爬虫,
则可以爬取所有中英文对照表信息 并且 添加到你的数据库中,
然后通过TCP服务器端实现翻译和展示
客户端
实现步骤:
- 启动客户端 并 连接到服务器端
直接声明Socket并传入服务器的ip和端口号就可以完成启动并连接 - 收发消息
同样是用到了BufferedReader和BufferedWriter进行收发消息
package tcptest;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:客户端
* User: starry
* Date: 2021 -04 -16
* Time: 17:17
*/
public class TCPClient {
//服务器端口号
private static final int port = 9002;
//服务器ip地址
private static final String ip = "127.0.0.1";
public static void main(String[] args) throws IOException {
//1.启动客户端 并 连接到服务器端
Socket socket = new Socket(ip,port);
//2.收发消息
try(
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
Scanner scanner = new Scanner(System.in);
){
while (true) {
//给服务器端发送消息
System.out.print("->");
//构建消息
String msg = scanner.nextLine();
//发送消息
writer.write(msg+"\n");
//即刻发送
writer.flush();
//接收服务器端的消息
String serMsg = reader.readLine();
//非空效验
if(serMsg != null && !serMsg.equals("")) {
System.out.println("服务器端:"+serMsg);
}
}
}
}
}
服务器端部署到云服务器
- 如果你之前有打包过别的项目,先清除掉
- 然后把这个删掉
接下来的步骤参考这篇文章的部署服务器
https://blog.csdn.net/starry1441/article/details/115721011
我们启动云服务器后
把本地客户端连接的服务器ip改为云服务器ip地址
private static final String ip = "82.156.229.239";
最后我们启动客户端,输入中文,就有相应的英文
这样我们的翻译功能就实现啦!!!