发布时间:2022-08-19 13:38
计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台计算机都可以直接通信,因为所有计算机都要遵循同一种网络协议。
网络编程从大的方面就是说对信息的发送接收。
通过操作相应API调度计算机资源硬件,并且利用管道(网线)进行数据交互的过程。
更为具体的涉及:网络模型、套接字、数据包
当我们了解了计算机网络和网络编程之后,为了能够使在同一个网络中的任意两台计算机来实现通信,我们接下来就要使用到Socket。那么Socket是什么呢?首先Socket是一组套接字,由IP地址和端口号组成,端口号小于1024是特权用户,需要管理权限,我们能够使用的端口范围在1024到65535之间。其次一个应用程序可以通过Socket建立一个远程连接,Socket内部通过TCP/IP协议把数据传送至网络。 那么如何使用Socket来进行TCP编程呢?首先在网络协议中TCP协议是一种面向连接、可靠传输、字节流式的协议,而TCP编程又是基于TCP协议实现的,因此在我们进行TCP编程时,我们需要建立一个服务器端和一个客户端,ServerSocket作为服务器端,用来监听指定的端口,当这个端口进行客户端连接时,服务器端进入等待状态,等待客户端连接,而另一个Socket就是我们的客户端,用来连接指定服务器和端口,从而进行连接,实现客户端与服务器端的通信与交互。
服务器端 :
1.创建一个ServerSocket,作为服务器端,用来监听8888端口。
2.运行socket,使服务器端进入等待连接状态。
3.连接到客户端之后,我们就可以获取到客户端的相关信息,并通过输入流读取到客户端的提问。
4.通过我们提前存储到Map集合中的简单对话,我们就可以通过服务器短的输出流将答案发送至客户端。
5.从而实现人机对话系统
部分代码实现如下:
package com.zym.tcp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
public class ChartServer {
public static void main(String[] args) {
Map chatMap = new HashMap(){
{
put("你好", "你好呀");
put("hi", "hi~");
put("hello", "哈喽");
put("吃了吗", "没呢,你呢");
put("孤勇者", "爱你孤身走暗巷");
put("有请潘周聃", "潘周聃,今年29岁,苏黎世理工大学.....");
put("很高兴认识你", "我也是哦");
}
};
try (ServerSocket server = new ServerSocket(8888)) {
while(true) {
//发生客户端连接
Socket client = server.accept();
//获取该客户端的IP地址
String clientIP = client.getInetAddress().getHostAddress();
try(BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));){
//获取该客户端的提问??
String question = reader.readLine();
if(question!=null) {
System.out.println("【服务器】来自客户端" + clientIP + "的提问:" + question);
//获取该问题的答案
String answer = chatMap.get(question);
answer = answer == null?"我不知道你在说什么":answer;
//发送至客户端
writer.write(answer);
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
1.创建一个Socket,作为客户端,用来连接指定服务器和端口。
2.运行socket,进入连接状态,直到找到服务器端,进行连接。
3.连接到服务端之后,客户端通过输出流将提问发送至服务器端。
4.服务器端接收到之后,会通过输出流将答案发送回来,之后我们只需在客户端使用输入流读取该答案即可。
5.从而实现人机对话系统
package com.zym.tcp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class ChatClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建Scoket,连接服务器
try(Scanner input = new Scanner(System.in);){
while(true) {
try(Socket client = new Socket("172.20.10.2",8888);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));){
//获取控制台的输入(问题)
String question = input.nextLine();
if(question.equals("over")) {
break;
}
//发送问题
writer.write(question);
writer.flush();
//暂时关闭本次输出
client.shutdownOutput();
//获取来自服务器的“答案”
String answer = reader.readLine();
System.out.println("【客户端】来自服务器的回答:" + answer);
}
}
System.out.println("Game over!");
}
}
}