Socket
服务器:Server
为其他人提供相应服务的电脑
- 硬件:配置要求极极极极极极极极极高的电脑,通常没有显示器;多台服务器的集合叫做服务器集群
- 软件:Linux系统;有一个相关的软件(Tomcat、SVN、数据库…);
网络编程模式
- C/S:Client-Server,客户端-服务器
- B/S:Broswer-Server,浏览器-服务器
Socket属于C/S模式
访问网站的过程
以百度为例
- 访问域名:www.baidu.com
- DNS解析:由DNS解析域名,返回对应的IP地址给浏览器。DNS相当于一座桥,架在访问者与被访问对象之间,提供高效的访问速率。
- 浏览器获得IP地址后,向服务器发送访问请求。
在命令行中使用:ping [域名],可以快速获得对应域名的IP地址(前提是能正常访问服务器)
Socket通信
Socket用到的类:java.net
- Socket类:客户端套接字
- ServerSocket:服务器套接字
套接字:类似于网线两端的接口
服务器
package day20191215;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.Scanner;
public class Server {
public static void main(String[] args) {
ServerSocket server = null;
Socket s = null;
try {
server = new ServerSocket(9999);
//正常情况下,服务器接收一次来自客户端的信息就会自行关闭
//现在使用while(true)使服务器一直接收来自客户端的信息
System.out.println("服务器已开启,等待连接...");
s = server.accept();
System.out.println("已连接,当前客户端:"+s);
//服务器输入当前系统时间给客户端
PrintWriter setTime = new PrintWriter(s.getOutputStream());
setTime.println(new Date());
setTime.flush();
while(true) {
//服务器接收来自客户端的信息
BufferedReader getMsg = new BufferedReader(new InputStreamReader(s.getInputStream()));
String msg = getMsg.readLine();
System.out.println(msg);
//发送信息
Scanner scan = new Scanner(System.in);
PrintWriter sendMsg = new PrintWriter(s.getOutputStream());
sendMsg.println(scan.nextLine());
sendMsg.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//关闭服务器流,Socket本质是IO流
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端
package day20191215;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
try {
/**
* 连接服务器必须要传入两个参数:IP地址+端口
* 本机IP地址统一为127.0.0.1(或者使用localhost)
* 端口不取太小,以免被占用
*/
Socket s = new Socket("localhost", 9999);
//获取从服务器传递过来的信息
BufferedReader getTime = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = getTime.readLine();
System.out.println(str);
while(true) {
//向客户段发送信息
Scanner scan = new Scanner(System.in);
PrintWriter sendMsg = new PrintWriter(s.getOutputStream());
sendMsg.println(scan.nextLine());
sendMsg.flush();
//接收信息
BufferedReader getMsg = new BufferedReader(new InputStreamReader(s.getInputStream()));
String msg = getMsg.readLine();
System.out.println(msg);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
只支持一问一答(客户端先问,服务器再答),如果想做成类似聊天室的功能,可以用线程的相关知识。