Java的多线程+Socket 后台 Ver 2.0

package com.wulala;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class JavaThreadCreationAndRun {

public static void main(String[] args) {

JavaThreadCreationAndRun jtca = new JavaThreadCreationAndRun();
        jtca.startServer();

}

public void startServer() {
        ServerSocket ss = null;
        try {
            ss = new ServerSocket(9999);
        } catch (IOException e) {
            e.printStackTrace();
        }
        UpdateMySQL updateMySQL;
        while (true) {
            Socket socket = null;
            try {
                socket = ss.accept();
                updateMySQL = new UpdateMySQL(socket);
                Thread thread = new Thread(updateMySQL);
                thread.start();

} catch (IOException e1) {
                System.out.println("client disconnected");
                try {
                    socket.close();
                } catch (IOException e) {
                    System.out.println("close socket false: " + e.getMessage());
                }

}
        }

}
    //请无视下面这个内部类.
    static class Helper implements Runnable {
        private final String message;

public Helper(String _message) {
            this.message = _message;
        }

private void doSomething(String meesage) {
            System.out.println("The doSomethig method was executed by thread:" + Thread.currentThread().getName());
            System.out.println("Do something with " + message);
        }

@Override
        public void run() {
            for (int i = 0; i < 2; i++) {
                doSomething(message);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

}
}

把进程的继承类独立出来了:

package com.wulala;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class UpdateMySQL extends Thread {
    private InputStream is = null;
    byte b[] = new byte[1024];
    int readCount = 0;
    ExecuteDML edml;

public UpdateMySQL(Socket socket) {
        edml = new ExecuteDML();
        try {
            edml.initParam("dbconfig.properties");
        } catch (Exception e2) {
            System.out.println("init deml fail: " + e2.getMessage());
        }
        try {
            is = socket.getInputStream();
        } catch (IOException e1) {
            System.out.println("getInputStream exception: " + e1.getMessage());
        }
        try {
            readCount = is.read(b);
            System.out.println("readCount is " + readCount);

} catch (IOException e1) {
            System.out.println("readCounter fail: " + e1.getMessage());
        } catch (Exception e) {
            try {
                is.close();
            } catch (IOException e1) {
                System.out.println("is close exeption: " + e1.getMessage());
            }
            // pw.close();
            try {
                socket.close();
            } catch (IOException e1) {
                System.out.println("socket close exeption: " + e1.getMessage());
            }
            System.out.println("socket exeption: " + e.getMessage());
        }

}

@Override
    public void run() {
        String str;
        str = new String(b);
        str = str.trim();
        System.out.println("Client Socket Message:" + str);

String deviceID = "";
        int activate = 0;
        if (str.length() > 8 && (str.length() < 15)) {
            int insertResult = 0;
            // ExecuteDML edml = new ExecuteDML();
            deviceID = str.substring(0, 8);
            activate = Integer.valueOf(str.substring(8));
            try {
                insertResult = edml.insertWXData(deviceID, activate);
            } catch (Exception e) {
                System.out.println("insert problem" + e.getMessage());
            }

// System.out.println("deviceID: " + deviceID + " activate: " +
            // activate);
        }

try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            System.out.println("sleep problem..");
        }

}

}

重新把多线程看了一下, 现在基本知道怎么监控线程的情况了, 可惜还是没有在Cent OS上面安装Java SDK(公司网速慢成狗), 所以没法在生产用服务器上用jstack监控, 回头想办法把jdk的rpm倒腾到生产服务器上去, 试试监控.

现在主要是用netstat跟ps看状态了, ps看到的总是没问题的, 进程还在, netstat -an|grep 9999看到的如果是一堆的WAIT_TO_CLOSE什么的, 就嗝了.

继续观察吧.

时间: 2024-12-09 04:22:22

Java的多线程+Socket 后台 Ver 2.0的相关文章

Java UDP使用Socket进行网络通信(0)

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39300293 下面演示一个程序,用客户端给服务器发送一条信息,服务器收到后,打印在控制面板上. 1)客户端,给服务器发送数据 2)服务器,收到数据后,打印在控制面板上 一.客户端,主要步骤: 1)创建udp服务.通过DatagramSocket对象. 2)创建数据,并封装成数据包. 3)通过Socket服务,将已有数据包发送出去.通过send方式. 4)关闭资源. 客户端

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(S

Java多线程之后台线程

将线程设置成后台线程Daemons 主线程结果后,后台线程将自动结果. package wzh.test; import java.util.concurrent.TimeUnit; class SimpleDaemons implements Runnable{ @Override public void run() { try { while (true) { TimeUnit.MILLISECONDS.sleep(100); System.out.println(Thread.curren

Java千百问_02基本使用(012)_如何编写多线程Socket程序

点击进入_更多_Java千百问 1.如何编写多线程Socket程序 了解Socket看这里:Socket是什么 多线程Socket与单线程类似,只是使用了多线程的方式来管理连接,主线程负责接收连接,在接到连接后变创建新的线程,每个线程负责与自己的客户端进行通信. 了解单线程Socket看这里:如何编写单多线程Socket程序 与单线程Socket例子相比来说,服务端可以与多个客户端进行通信了,不过多线程频繁的创建与销毁便会带来很大的资源开销,而系统的网络资源等都是有限的.因此一般会引入线程池,可

Java多线程之后台线程不执行finally

后台线程不执行finally package wzh.daemon; import java.util.concurrent.TimeUnit; class ADaemon implements Runnable { @Override public void run() { try { System.out.println("Starting ADaemon"); TimeUnit.SECONDS.sleep(1); } catch (Exception e) { System.ou

IntelliJ IDEA 启动tomcat 报错: idea Unable to open debugger port (127.0.0.1:58233): java.net.SocketException &quot;socket closed&quot;

debug启动项目弹出提示 Error running omp: Unable to open debugger port (127.0.0.1:50812): java.net.SocketException "socket closed" 错误.导致tomcat服务器无法启动. 1.根据端口号"80"查找进程号netstat -ano|findstr "80"TCP    0.0.0.0:80             0.0.0.0:0  

解决idea启动项目报错:Unable to open debugger port(127.0.0.1:60157):java.net.SocketException&quot;socket closed

1.问题描述: 工作当中免不了要重启服务,debug模式下偶尔启动项目,却启动失败报错: Unable to open debugger port (127.0.0.1:60157): java.net.SocketException "socket closed" 2.原因分析 出现这个报错的原因是因为端口被占用导致的 3.解决方法 解决方法主要两种:修改端口配置(推荐).关闭占用端口的进程(不推荐). 方式一:修改端口配置(推荐)   被占用的端口可能是本地端口,也可能是JMX端口

Java TCP/UDP socket 编程流程总结

最近正好学习了一点用java socket编程的东西.感觉整体的流程虽然不是很繁琐,但是也值得好好总结一下. Socket Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据.就像通过一个文件的file handler就可以都写数据到存储设备上一样.根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的. 对socket的本身组成倒是比较好理解.既然是应用通过socket通信,肯定就有一个服务器端和一个客户端.

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

java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接协商三次握手,c->syn->s,s->syn ack->c, c->ack->s b  关闭协商四次握手,c->fin->s, s->ack-c,s->fin->c,c->ack->s c  保持数据有序,响应确认等计算开销 d