1.网络通讯名词简介
- IP:Internet Protocol,即互联网协议。IP现在通用的版本是IPv4,。地址是四个 byte 的数字,用点分开。正在实施的IPv6地址会复杂得多。每个机器都有一个IP地址。IP地址又分内网和外网地址,就像是我们的小名和官方大名。只有外网地址才能用来外网通讯
- port:端口。和 IP 地址一起,可以唯一的确定一个网络连接的目的地。计算机的端口是用无符号的16个 bit 表示的,所以端口的范围是 0-65535,不能超过这个范围
- Socket:套接字,就好像插座,可以服务不同的目的。我们经常说的连到什么机器的什么端口,建立的就是这个Socket连接
- Socket 包含本地的(IP 地址 + 端口)以及远程的(IP 地址 + 端口)
- 服务器:处理客户端网络请求的机器。监控本机某个端口,等着客户端使用服务器的IP + 端口来建立网络连接。连接建立起来之后,就可以进行数据的交换了。服务器要先启动,否则客户端连接就会失败。
- 客户端:通过指定IP 和 端口,连接到服务器端,客户端和服务器的数据交换是独立的,可以同时进行数据的输入和输出
- 域名和DNS(Domain Name System):一般服务器都会使用域名让客户端连接,DNS 可以将域名翻译成IP地址
- 我们平时说的上网就是通过域名,连接服务器的80端口,读取内容,并让浏览器帮我们去渲染,生成千姿百态的网页,80端口默认的http 协议的端口
- http 协议 Hyper Text Teansfer Protocol,就是我们平时上网的协议
2.使用 Socket 实现通讯
public class MyChat {
private String from;
private String greeting;
private Socket s;
public MyChat(String from, String greeting, Socket s) {
this.from = from;
this.greeting = greeting;
this.s = s;
}
public void chatting(){
Scanner in = new Scanner(System.in);
try(
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), MyServer.MY_COMM_CHARSET));
PrintWriter pr = new PrintWriter(new OutputStreamWriter(s.getOutputStream(),MyServer.MY_COMM_CHARSET))
) {
if (greeting != null){
pr.println(greeting);
pr.flush();
}
while (true){
String line = br.readLine();
if (line != null){
if (MyServer.BYE.equals(line)){
pr.println(MyServer.BYE);
break;
}else {
System.out.println(from+":"+line);
String myWord = in.nextLine();
pr.println(myWord);
pr.flush();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class MyServer {
public static final Charset MY_COMM_CHARSET = StandardCharsets.UTF_8;
public static final int MY_SERVER_PORT = 54321;
public static final String BYE = "88";
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(MY_SERVER_PORT);
Socket s = ss.accept();
MyChat myChat = new MyChat("客户端","你已经连接上服务端了",s);
myChat.chatting();
}
}
public class MyClient {
public static void main(String[] args) {
try (
Socket socket = new Socket("localhost", MyServer.MY_SERVER_PORT);
) {
MyChat myChat = new MyChat("服务端", null, socket);
myChat.chatting();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
先启动server,然后启动client,在控制台输入信息