客户端:

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的更多相关文章

  1. Java的多线程+Socket 后台 Ver 2.0

    package com.wulala; import java.io.IOException;import java.net.ServerSocket;import java.net.Socket; ...

  2. Java的多线程+Socket 后台

    打包好可执行的jar文件之后, 用ftp上传到服务器, 用nohup命令, 让这个服务器在后台运行, 并将输出重定向到log文件中, 命令是: #nohup java -jar MTSServer.j ...

  3. Java多线程 Socket使用

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  4. Java中多线程服务中遇到的Redis并发问题?

    背景: 一个中小型H5游戏 核心错误信息: (1): java.lang.ClassCastException: [B cannot be cast to java.lang.Long at redi ...

  5. java基础-多线程应用案例展示

    java基础-多线程应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.两只熊,100只蜜蜂,蜜蜂每次生产的蜂蜜量是1,罐子的容量是30,熊在罐子的蜂蜜量达到20的时候 ...

  6. Java学习---多线程的学习

    基础知识 每个正在系统上运行的程序都是一个进程(process).每个进程包含一到多个线程(thread).进程也可能是整个程序或者是部分程序的动态执行. 线程是一组指令的集合,或者是程序的特殊段,它 ...

  7. 用Java实现多线程服务器程序

    一.Java中的服务器程序与多线程 在Java之前,没有一种主流编程语言能够提供对高级网络编程的固有支持.在其他语言环境中,实现网络程序往往需要深入依赖于操作平台的网络API的技术中去,而Java提供 ...

  8. java网络编程socket\server\TCP笔记(转)

    java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅     1 TCP的开销 a ...

  9. Java网络多线程开发:java.io.EOFException

    Java网络多线程开发:java.io.EOFException 在实现韩顺平Java的多用户即使通信系统实战项目中: 对于客户端线程的停止,老韩是向服务器端发送一个消息对象,提示服务器端进行资源释放 ...

随机推荐

  1. convert Timestamp to Real time

    select r.ring_buffer_address, r.ring_buffer_type, dateadd (ms, r.[timestamp] - sysinfo.sqlserver_sta ...

  2. 常用公共的css的样式

    html{-webkit-text-size-adjust:none; /*解决chrome浏览器下字体不能小于12px*/} body{overflow-x: hidden; font-size:1 ...

  3. Mysql-5.6.30卸载

    Mysql-5.6.30卸载 一.删除相关文件 rm  -rf  /var/lib/mysql/mysql   (删除数据文件) rm  -f  /root/.mysql_secure    (删除缺 ...

  4. NPOI 导入,导出EXCEL

    代码: public static class NPOIExcelHelper { /// <summary> /// DataTable导出到Excel文件 /// </summa ...

  5. mysqld_multi部署mysql单机多实例

    1.安装gcc-c++.ncurses依赖包 # yum install gcc-c++ ncurses-devel 2.安装cmake,用来编译mysql # tar -xvf cmake-3.2. ...

  6. Java基础之创建窗口——使用网格布局管理器(TryGridLayout)

    控制台程序. 网格布局管理器可以在容器的矩形网格中布局组件. import javax.swing.*; import java.awt.*; import javax.swing.border.Et ...

  7. Angular.js 学习笔记

    AngularJS 通过新的属性和表达式扩展了 HTML. AngularJS 可以构建一个单一页面应用程序. <!-- ng-app 指令定义一个 AngularJS 应用程序. ng-mod ...

  8. js方法和prototype

    JS中的方法可以分为三类 1.对象方法 2.类方法 3.原型方法 例: function People(name) { this.name=name; //对象方法 this.Introduce=fu ...

  9. Summary: Merge Sort of Array && 求逆序对

    常用算法(后面有inplace版本): package ArrayMergeSort; import java.util.Arrays; public class Solution { public ...

  10. 3D语音天气球(源码分享)——创建可旋转的3D球

    开篇废话: 在9月份时参加了一个网站的比赛,比赛的题目是需要使用第三方平台提供的服务做出创意的作品. 于是我选择使用语音服务,天气服务,Unity3D,Android来制作一个3D语音天气预报,我给它 ...