要想认识并学习JAVA网络编程首先我们要知道一个概念。什么是Socket?
在开发网络应用程序的时候我们会遇到Socket这个概念;这是一个抽象的概念,一个应用程序通过Socket来建立一个远程连接;而Socket内部通过TCP/IP协议把数据传输到网络。
┌───────────┐ ┌───────────┐
│Application│ │Application│
├───────────┤ ├───────────┤
│ Socket │ │ Socket │
├───────────┤ ├───────────┤
│ TCP │ │ TCP │
├───────────┤ ┌──────┐ ┌──────┐ ├───────────┤
│ IP │<────>│Router│<─────>│Router│<────>│ IP │
└───────────┘ └──────┘ └──────┘ └───────────┘
为什么需要Socket进行网络通信?
因为仅仅通过IP地址进行通信是不够的,同一台计算机同一时间会运行多个网络应用程序;这时如果只有一个IP地址时,他无法判断发送给哪个应用程序,所以操作系统抽象出Socket接口,每个程序需要对应各自的Socket,数据包才能根据Socket正确的发到对应的应用程序。
对服务器来说:可以把Socket是指定的IP地址和指定的端口号;
对客户端来说:他的Socket是它所在计算机的IP地址和一个由操作系统分配的随机端口号;
实例:TCP实现人机交互
客户端:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(true) {
try (//创建Socket,连接服务器
Socket client = new Socket("192.168.254.167",9966);
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);
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("Game over");
}
}
服务器端:
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;
import java.util.prefs.BackingStoreException;
public class Test2 {
public static void main(String[] args) {
Map<String, String> chatMap = new HashMap<String, String>(){
{
put("你好", "你好呀");
put("hi", "hi~");
put("hello", "哈喽");
put("吃了吗", "没呢,你呢");
put("孤勇者", "爱你孤身走暗巷");
put("有请潘周聃", "潘周聃,今年29岁,苏黎世理工大学.....");
put("很高兴认识你", "我也是哦");
}
};
try (ServerSocket server = new ServerSocket(9966)){
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();
System.out.println("【服务器】来自客户端" + clientIP + "的提问" + question);
//获取该问题的答案
String answer = chatMap.get(question);
answer = answer == null ? "我不知道你在说什么":answer;
writer.write(answer);
writer.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果: