Java socket 多线程编程 示例

参照网上代码:

1.工程:

 

2.代码:

Client.java

package com.my.socket.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

public class Client {

    public static final String CHARCODE = "utf-8";
    
    public static void main(String[] args) {

        Socket socket = null;
        int port = 8821;

        OutputStream socketOut = null;
        BufferedReader br = null;
        try {
            socket = new Socket("localhost", port);
            // 发送消息
            String msg = "wwwwwwwwwwww哈哈w1241243123";
            // base64 编码,防止中文乱码
            msg = Util.encode(msg.getBytes(CHARCODE));
            System.out.println("c1:" + msg);
            System.out.println("c2:" + Util.decode(msg,CHARCODE));

            msg = msg + "\r\n";
            socketOut = socket.getOutputStream();
            socketOut.write(msg.getBytes(CHARCODE));
            socketOut.flush();

            // 接收服务器的反馈
            br = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));
            String res = br.readLine();
            if (res != null) {
                res = Util.decode(res,CHARCODE);
                System.out.println("c3:" + res);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (br != null)
                    br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (socketOut != null) {
                try {
                    socketOut.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

MultiThreadServer.java

package com.my.socket.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadServer {
    private int port = 8821;
    private ServerSocket serverSocket;
    private ExecutorService executorService;
    private final int POOL_SIZE = 10;
    
    public MultiThreadServer() throws IOException {
        serverSocket = new ServerSocket(port);
        executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
                .availableProcessors() * POOL_SIZE);
        System.out.println("服务已启动");
    }

    public void service() {
        while (true) {
            Socket socket = null;
            try {
                socket = serverSocket.accept();
                executorService.execute(new Handler(socket));

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws IOException {
        new MultiThreadServer().service();
    }

}

class Handler implements Runnable {
    
    public static final String CHARCODE = "utf-8";
    
    private Socket socket;

    public Handler(Socket socket) {
        this.socket = socket;
    }

    private PrintWriter getWriter(Socket socket) throws IOException {
        OutputStream socketOut = socket.getOutputStream();
        return new PrintWriter(socketOut, true);
    }

    private BufferedReader getReader(Socket socket) throws IOException {
        InputStream socketIn = socket.getInputStream();
        return new BufferedReader(new InputStreamReader(socketIn));
    }

    public void run() {
        BufferedReader br = null;
        PrintWriter out = null;
        try {
            br = getReader(socket);

            out = getWriter(socket);
            String msg = null;
            while ((msg = br.readLine()) != null) {
                System.out.println("s1:" + msg);
                msg = Util.decode(msg,CHARCODE);
                System.out.println("s2:" + msg);

                String res = "wwwwwwwwwwww哈哈w1241243123";
                res = Util.encode(res.getBytes(CHARCODE));
                System.out.println("s1:" + res);
                System.out.println("s2:" + Util.decode(res,CHARCODE));

                out.println(res);
                out.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (br != null)
                    br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (out != null) {
                out.close();
            }
        }
    }

    
}

 

Util.java 

package com.my.socket.test;

import java.io.IOException;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Util {

	public static String decode(String str, String charCode) {
		try {
			return new String(new BASE64Decoder().decodeBuffer(str), charCode);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static String encode(byte[] bstr) {
		return new BASE64Encoder().encode(bstr);
	}
}

  

posted @ 2015-08-13 09:38  嗨,你的益达~~~  阅读(16320)  评论(1编辑  收藏  举报