Java的多线程+Socket
客户端:
package com.wulala;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
Client client = new Client();
client.run();
}
public void run() {
Socket client;
try {
client = new Socket("127.0.0.1", 9999);
// 2.打开socket的流信息,准备下面的操作
OutputStream os = client.getOutputStream();
// 3.写信息
os.write(("xxxxasdf12233").getBytes());
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
括号可能不完整, 不重要.
客户端没啥可说的, 就是打开一个目标服务器一个IP, 跟端口, 然后outputsteam一些东西进去, 模拟回头STM32通过GPRS连接服务器后通过串口透传发送数据.
服务器端:
package com.wulala;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class MultiSocketServer {
public static void main(String args[]) {
MultiSocketServer multiSocketServer = new MultiSocketServer();
try {
multiSocketServer.startServer();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
public void startServer() throws IOException {
ServerSocket ss = null;
try {
ss = new ServerSocket(9999);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while (true) {
// 1.打开socket连接
// 等待客户端的请求
final Socket server = ss.accept();
System.out.println("服务-----------请求开始start");
// 2.打开socket的流信息,准备下面的操作
final InputStream is = server.getInputStream();
byte b[] = new byte[1024];
int readCount = is.read(b);
String str = new String(b);
str = str.trim();
final String serverFileName = str;
if (readCount > 0) {
new Thread() {
@Override
public void run() {
System.out.println("线程" + Thread.currentThread().getName() + "启动");
// 3.对流信息进行读写操作
System.out.println("客户端传过来的信息是:" + serverFileName);
ExecuteDML edml = new ExecuteDML();
try {
edml.initParam("dbconfig.properties");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int insertResult = 0;
String deviceID = "";
int activate = 0;
if (serverFileName.length() > 9) {
deviceID = serverFileName.substring(0, 8);
activate = Integer.valueOf(serverFileName.substring(8));
}
try {
//insertResult = edml.insertWXData("aaaa", 113);
insertResult = edml.insertWXData(deviceID, activate);
System.out.println("Total "+insertResult+" result been changed");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
is.close();
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return;
}
}.start();
}
System.out.println("服务-----------请求结束over");
}
}
}
简单来说, 一有数据过来, 就起一个线程, 在这个项目里面, 通常发一个字符串过来就完事, 判断字符串的前8位为设备名, 后面就是激活数.或者别的什么.
以后要进行接收数据的校验, 分析什么的, 迟点重构吧.
还有一个写数据库的类:
package com.wulala;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.Properties;
import java.util.UUID;
public class ExecuteDML {
private String driver;
private String url;
private String user;
private String password;
public void initParam(String paramFile) throws Exception {
Properties props = new Properties();
props.load(new FileInputStream(paramFile));
driver = props.getProperty("driverClassName");
url = props.getProperty("url");
user = props.getProperty("user");
password = props.getProperty("password");
}
public int insertData(String data) throws Exception {
Class.forName(driver);
try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement()) {
return stmt.executeUpdate("INSERT INTO MEMS_REC (ID,X,Y, CREATE_TIME) VALUES ('" + UUID.randomUUID().toString() + "','1','" + data
+ "', now());");
}
}
public int insertWXData(String deviceID,int activate) throws Exception {
Class.forName(driver);
try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement()) {
return stmt.executeUpdate("INSERT INTO WANG_XIN (ID,DEVICE_ID,ACTIVATE) VALUES ('" + UUID.randomUUID().toString() + "','"+deviceID+"'," + activate
+ ");");
}
}
// public static void main(String[] args) throws Exception {
//
// ExecuteDML edml = new ExecuteDML();
// edml.initParam("dbconfig.properties");
// int result = edml.insertData("3");
// System.out.println("Total " + result + " record been add");
// }
}
Java的多线程+Socket的更多相关文章
- Java的多线程+Socket 后台 Ver 2.0
package com.wulala; import java.io.IOException;import java.net.ServerSocket;import java.net.Socket; ...
- Java的多线程+Socket 后台
打包好可执行的jar文件之后, 用ftp上传到服务器, 用nohup命令, 让这个服务器在后台运行, 并将输出重定向到log文件中, 命令是: #nohup java -jar MTSServer.j ...
- Java多线程 Socket使用
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- Java中多线程服务中遇到的Redis并发问题?
背景: 一个中小型H5游戏 核心错误信息: (1): java.lang.ClassCastException: [B cannot be cast to java.lang.Long at redi ...
- java基础-多线程应用案例展示
java基础-多线程应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.两只熊,100只蜜蜂,蜜蜂每次生产的蜂蜜量是1,罐子的容量是30,熊在罐子的蜂蜜量达到20的时候 ...
- Java学习---多线程的学习
基础知识 每个正在系统上运行的程序都是一个进程(process).每个进程包含一到多个线程(thread).进程也可能是整个程序或者是部分程序的动态执行. 线程是一组指令的集合,或者是程序的特殊段,它 ...
- 用Java实现多线程服务器程序
一.Java中的服务器程序与多线程 在Java之前,没有一种主流编程语言能够提供对高级网络编程的固有支持.在其他语言环境中,实现网络程序往往需要深入依赖于操作平台的网络API的技术中去,而Java提供 ...
- java网络编程socket\server\TCP笔记(转)
java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04| 分类: Socket | 标签:java |举报|字号 订阅 1 TCP的开销 a ...
- Java网络多线程开发:java.io.EOFException
Java网络多线程开发:java.io.EOFException 在实现韩顺平Java的多用户即使通信系统实战项目中: 对于客户端线程的停止,老韩是向服务器端发送一个消息对象,提示服务器端进行资源释放 ...
随机推荐
- 初涉MySQL
本文要点: MySQL基础 安装MySQL 配置MySQL 使用MYSQL 一.MySQL基础 MySQL 由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一个开源的关系型数据 ...
- 入手Intel 750
要装虚拟机,入了块intel750 测速: C盘闪迪至尊超级速ssd,保修10年 D盘 intel 750,保修5年 E盘 西数2T红盘 呵呵,还没有装intel驱动,就用的win10自带的nvme驱 ...
- 3D Modeling using GDI+
https://code.msdn.microsoft.com/3D-Modeling-using-GDI-b93937b9 Introduction Most of us use OpenGL/ D ...
- 一个WebService Demo
1.建立一个Asp.net Web网站,添加新项Web服务MyMath.asmx.编写如下代码: using System; using System.Collections.Generic; usi ...
- Vue.2.0.5-Render 函数
基础 Vue 推荐使用在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 templa ...
- 分布式环境下限流方案的实现redis RateLimiter Guava,Token Bucket, Leaky Bucket
业务背景介绍 对于web应用的限流,光看标题,似乎过于抽象,难以理解,那我们还是以具体的某一个应用场景来引入这个话题吧. 在日常生活中,我们肯定收到过不少不少这样的短信,“双11约吗?,千款….”,“ ...
- HTML语言的一些元素(三)
本章节主要介绍:<div>和<span> 可以通过 <div> 和 <span> 将 HTML 元素组合起来. HTML <div> 元素是 ...
- CSS 中文字体的英文名称
宋体 SimSun 黑体 SimHei 微软雅黑 Microsoft YaHei 微软正黑体 Microsoft JhengHei 新宋体 NSimSun 新细明体 PMingLiU 细明体 Ming ...
- HTML基础-- 标签、表格
<html> --开始标签 <head> 网页上的控制信息 <title>页面标题</title> </head> <body& ...
- for穷举
穷举:把所有可能的情况都走一遍,使用if条件筛选出来满足的条件的情况.(把所有的可能性都列举一边) 迭代:从初始情况按照规律不断求解中间情况,最终推导出结果.f foreach 专为数组定义的一种命 ...