之前接手要寫一個(gè)代碼和開發(fā)板聯(lián)調(diào),一臉蒙.對(duì)我來說跟硬件一起開發(fā)真的很頭疼.之前了解過一點(diǎn)socket沒成想這次用上了
開發(fā)板想要跟后臺(tái)聯(lián)調(diào)不能用我們平時(shí)軟件聯(lián)調(diào)用的http協(xié)議,只能用TCP/IP協(xié)議或UDP/IP協(xié)議.這里用socket技術(shù),
有關(guān)TCP/IP,UDP/IP協(xié)議等七層協(xié)議各位可以百度一下,我就不做介紹了,因?yàn)槲乙矝]搞懂.但這并不影響我開發(fā).
第一步搭建一個(gè)Springboot項(xiàng)目在我簡(jiǎn)書里已經(jīng)寫了,地址:
http://www.reibang.com/p/12da23fcc4c2
1.在pom.xml中加載日志Lombok依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>groupId</groupId>
<artifactId>washCarProject</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!--springboot的parent-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
<!--springboot的web支持-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--日志配置,采用這個(gè)日志不用每次都去初始化log變量-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!--Springboot插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.invengo.washCar.WashCarApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.創(chuàng)建一個(gè)服務(wù)器
@Slf4j
public class Server
{
public void getServerDemo() throws Exception
{
ServerSocket server = new ServerSocket(8099);//設(shè)置服務(wù)器端口號(hào)
System.out.println("服務(wù)器開啟,等到客戶端鏈接------------------ ");//服務(wù)器開啟時(shí)控制臺(tái)輸出
while (true) {
Socket socket = server.accept();
new Agent(socket).start();
}
}
class Agent extends Thread
{
Socket socket = null;
public Agent(Socket soc)
{
this.socket = soc;
}
public void run()
{
try {
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
out.write("welcome to Server!\0".getBytes());//給客戶端返回信息告知其鏈接成功
out.flush();
byte[] bytes = null;
while (true){
bytes = new byte[58];//大小可更改
in.read(bytes);
System.out.println("客戶端來消息"+ Arrays.toString(bytes));//由于這里是跟開發(fā)板做鏈接所以全部都必須輸入輸出為二進(jìn)制才可以,所以無論傳輸?shù)氖鞘裁炊家D(zhuǎn)換成二進(jìn)制的形式
log.info(Arrays.toString(bytes)); //將客戶的消息記錄日志
}
} catch (Exception e) {
System.err.println(e);//也可以寫成e.printStackTrace();
}
}
}
}
3.在開啟類中調(diào)用Socket類
@Slf4j
@SpringBootApplication
public class SocketrApplication extends SpringBootServletInitializer
{
public static void main(String[] args)
{
SpringApplication.run(SocketrApplication.class, args);
Server server = new Server();
try {
server.getServerDemo();//調(diào)用開啟服務(wù)器
} catch (Exception e) {
log.error(e.getMessage());//記錄日志
// e.printStackTrace();
}
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder)
{
return builder.sources(this.getClass());
}
}
4.這樣可以開啟程序運(yùn)行一下,服務(wù)器開啟,控制臺(tái)輸出
5.打開TPC/IP調(diào)試工具鏈接服務(wù)器,這個(gè)工具大家可以去網(wǎng)上搜,我的是我們硬件同事給我的所以沒有連接
記得要選擇TCP Client這個(gè)選項(xiàng)來創(chuàng)建客戶端
上圖可見自己的ip和服務(wù)器端口.點(diǎn)擊連接,開始連接服務(wù)器,連接成功后可以再數(shù)據(jù)提示框看到服務(wù)器發(fā)送過來的的信息
這樣就連接成功了
然后在數(shù)據(jù)發(fā)送框中輸入測(cè)試數(shù)據(jù)點(diǎn)擊發(fā)送
發(fā)送成功會(huì)在數(shù)據(jù)提示 窗口中看到自己發(fā)送的數(shù)據(jù)
并且在服務(wù)器的控制臺(tái)可以看到服務(wù)器接收到的數(shù)據(jù)
這樣就表示連接成功了,至于開發(fā)板當(dāng)中的程序是硬件同事寫的所以我就不知道了,這部分調(diào)試通了后硬件同事用socket技術(shù)在他那邊寫好程序燒在板子上連接IP和端口就可以向服務(wù)器發(fā)送消息了.
一般這種使用情況會(huì)放在一個(gè)特定的服務(wù)器,所以需要你把項(xiàng)目部署在其他的服務(wù)器,那么可以有如下
首先把項(xiàng)目打包因?yàn)槌绦蚴呛?jiǎn)單的jar包所以
打包以后利用Xshell和Xftp放置在服務(wù)器的某個(gè)目錄下
然后在服務(wù)器的終端里輸入命令
由于我在代碼中設(shè)置了其默認(rèn)端口是8094,服務(wù)器端口號(hào)8095,所以首先需要確認(rèn)這兩個(gè)端口在你部署的服務(wù)器中沒有被占用.
如果被占用則需要更改,服務(wù)器的端口在代碼中更改,程序的默認(rèn)在配置application.properties中更改
這里面把配置server.port=8094后面的端口在即改,改完后在打包
沒有被占用的話就可以先用命令
cd /jar包所在目錄
然后運(yùn)行jar包三種方式
1.java -jar xxxx.jar 這種方式實(shí)時(shí)監(jiān)控但是退出時(shí)程序自動(dòng)關(guān)閉
2.java -jar xxxx.jar & 這種方式不實(shí)時(shí)監(jiān)控退出時(shí)程序不會(huì)關(guān)閉
3..java -jar xxxx.jar>socket.log & 這種方式不實(shí)時(shí)監(jiān)控,日志輸出到日志socket.log中可以再這里查看
查看日志的幾種方式
1.cat xxx.log 從第一行查看
2.tail -f xxx.log 最后十行實(shí)時(shí)查看,這個(gè)比較適合我們單片機(jī)這邊查看調(diào)試.---------------推薦
這里如果運(yùn)行java -jar xxx.jar出現(xiàn)問題參考鏈接:
http://www.reibang.com/p/db5f7b130501
我在這里整理了我遇到的問題如果,你還有別的問題請(qǐng)留言提出,我們共同探討
這里插播一個(gè)日志的配置
這里我用的配置是lombok
這里需要先安裝插件(因?yàn)槲疫@里已經(jīng)安裝了所以搜索有,沒有的先在Browse repositories里面搜索lombok進(jìn)行安裝)
安裝完成后重啟idea然后在pom.xml中加入依賴
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
<scope>provided</scope>
</dependency>
然后在你需要記錄日志的類前加入@Slf4j
這樣你在代碼中就直接可以調(diào)用log不用聲明變量了.
log.info(日志內(nèi)容);
log.error(日志內(nèi)容);