复习完JavaSE以后,终于开始了Java Web的学习生涯。
利用通信线路和设备可以将两台不同的电脑连接在一起,以完善的网络软件来实现资源共享和信息传递,这就构成了计算机网络。
既然说是两台不同的电脑,那么肯定可以可以通过某一些标记来进行区分,这个区分的标志就是IP地址。通过不同的IP地址可以区分不同的电脑。
电脑上面有很多不同的软件,每一个软件都有可能进行信息的传递,那么这些软件又怎么去区分呢?可以通过端口号来区分。
因此我们看到的一般是192.168.0.11:8080
,就是IP:端口
的形式来访问一个应用程序。
IP地址分为IPv4和IPv6,IPv4类似于192.168.0.11
,四组数字,每一个占8个字节,也就是00000000.00000000.00000000.00000000。但IPv4现在其实已经被用完了,因此就需要更多的表述方式,于是有了IPv6。
Ps : 在终端输入:ipconfig.exe
可以查看自己的IPv4 和IPv6地址。
两种不同的传输层协议:TCP和UDP
通过Socket可以实现两台电脑的通信,它支持TCP和UDP。要实现Socket通信需要通常需要写创建一个信息发送者和一个数据接收者,也就是客户端和服务端,需要先启动服务端,来等待客户端的链接。
//服务端
public static void main(String[] args) {
try (ServerSocket server = new ServerSocket(8080)){ //将服务端创建在端口8080上
System.out.println("正在等待客户端连接...");
Socket socket = server.accept(); //当没有客户端连接时,线程会阻塞,直到有客户端连接为止
System.out.println("客户端已连接,IP地址为:"+socket.getInetAddress().getHostAddress());
}catch (IOException e){
e.printStackTrace();
}
}
//客户端
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 8080)){
System.out.println("已连接到服务端!");
}catch (IOException e){
System.out.println("服务端连接失败!");
e.printStackTrace();
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try (Socket socket = new Socket("localhost", 8080)) {
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(socket.getOutputStream());
System.out.println("请输入你想输入的信息:");
outputStreamWriter.write(sc.nextLine() + "\n");
outputStreamWriter.flush();
System.out.println("数据已发送!等待服务端确认...");
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("收到服务端响应:" + reader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 信息端
public class Server {
public static void main(String[] args) {
try (ServerSocket server = new ServerSocket(8080)) {
System.out.println("正在等待客户端连接...");
Socket socket = server.accept();
System.out.println("客户端已连接,IP地址为:" + socket.getInetAddress().getHostAddress());
BufferedReader buffer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(buffer.readLine());
OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
writer.write("收到\n");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
手动关闭单向的流
socket.shutdownOutput(); //关闭输出方向的流
socket.shutdownInput(); //关闭输入方向的流
如果我们不希望服务端等待太长的时间,我们可以通过调用setSoTimeout()
方法来设定IO超时时间:
socket.setSoTimeout(3000);
首先进入到谷歌浏览器,输入http://localhost:8080(端口号)
,然后运行代码
public static void main(String[] args) {
try(ServerSocket server = new ServerSocket(8080)){ //将服务端创建在端口8080上
System.out.println("正在等待客户端连接...");
Socket socket = server.accept();
System.out.println("客户端已连接,IP地址为:"+socket.getInetAddress().getHostAddress());
InputStream in = socket.getInputStream(); //通过
System.out.println("接收到客户端数据:");
while (true){
int i = in.read();
if(i == -1) break;
System.out.print((char) i);
}
}catch (Exception e){
e.printStackTrace();
}
}
因为代码并没有内容所以是没有响应的,浏览器会一直加载,所以我们需要给他一个响应码:HTTP/1.1 200 Accepted
,下面是相应内容:
public static void main(String[] args) {
try (ServerSocket server = new ServerSocket(8080)) {
Socket socket = server.accept();
OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
writer.write("HTTP/1.1 200 Accepted\r\n\r\n");
writer.write("访问成功");
writer.flush();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}