TCP
三次握手
四次挥手
package com.lu.day14.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
try(Socket socket = new Socket("192.168.32.224",9999);){
OutputStream outputStream = socket.getOutputStream();
String s = """
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\\ = /O
____/`---'\\____
.' \\\\| |// `.
/ \\\\||| : |||// \\
/ _||||| -:- |||||- \\
| | \\\\\\ - /// | |
| \\_| ''\\---/'' | |
\\ .-\\__ `-` ___/-. /
___`. .' /--.--\\ `. . __
."" '< `.___\\_<|>_/___.' >'"".
| | : `- \\`.;`\\ _ /`;.`/ - ` : | |
\\ \\ `-. \\_ __\\ /__ _/ .-` / /
======`-.____`-.___\\_____/___.-`____.-'======
`=---='
""";
outputStream.write(s.getBytes());
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int read;
while ((read = inputStream.read(bytes)) != -1) {
System.out.println(new String(bytes,0,read));
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
package com.lu.day14.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try(ServerSocket serverSocket = new ServerSocket(9999);){
while (true) {
System.out.println("等待客户端连接");
Socket accept = serverSocket.accept();
InputStream inputStream = accept.getInputStream();
byte[] bytes = new byte[1024];
int read;
while ((read = inputStream.read(bytes)) != -1){
System.out.println(new String(bytes,0,read));
}
OutputStream outputStream = accept.getOutputStream();
outputStream.write("你".getBytes());
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
package com.lu.day14.tcp;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.ArrayList;
/**
* 查看自己哪个端口号被占用
*/
public class Test {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 65535; i++) {
try {
ServerSocket serverSocket = new ServerSocket(i);
} catch (IOException e) {
System.out.println(i);
}
}
}
}
日志
1.为什么引入日志技术?
2.日志技术与普通输出语句的区别
3.特点
4.日志体系
jar包是一种文件类型并且是一种压缩文件类型(类似与.zip .rar) 全程java archive (java归档文件)->压缩了很多.class文件
5.LogBack
默认是debug模式
package com.lu.day14.log;
import com.lu.day07.test.Student;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogBackLevel {
private static final Logger LOG = LoggerFactory.getLogger(LogBackLevel.class);
public static void main(String[] args) {
//1.trace追踪级别
LOG.trace("trace");
Student lu = new Student("lu", 100, 100, 100);
//logback可以使用大括号作为对象输出的占位符
LOG.trace("学生信息{}", lu);
//2.debug调试级别->在使用编程工具(idea)debug模式时,输出log应该debug
LOG.debug("debug");
//3.info信息级别->就相当于sout
LOG.info("info");
//4.warn警告级别->一般用于警告用户
LOG.warn("warn");
//5.error错误级别->一般用于错误信息,经常用在异常处理中catch中
LOG.error("error");
//6.fatal致命级别->一般用于系统崩溃,没有对应的方法
}
}
resource/logback.xml会自动识别 这个xml配置文件网上会有可以搜一下(实现原理是多线程加IO)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err-->
<target>System.out</target>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern>
</encoder>
</appender>
<!-- File是输出的方向通向文件的 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志输出路径-->
<file>C:/code/itheima-data.log</file>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>C:/code/itheima-data2-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="DEBUG">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
</configuration>