<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 310, comments - 6939, trackbacks - 0, articles - 3
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    多線程Java Socket編程示例

    Posted on 2007-10-15 12:37 詩特林 閱讀(92557) 評論(25)  編輯  收藏 所屬分類: Socket
                                                     多線程Java Socket編程示例

    這篇做為學(xué)習(xí)孫衛(wèi)琴<<Java網(wǎng)絡(luò)編程精解>>的學(xué)習(xí)筆記吧.其中采用Java 5的ExecutorService來進行線程池的方式實現(xiàn)多線程,模擬客戶端多用戶向同一服務(wù)器端發(fā)送請求.

    1.服務(wù)端
    package sterning;

    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.*;
    import java.util.concurrent.*;

    public class MultiThreadServer {
        
    private int port=8821;
        
    private ServerSocket serverSocket;
        
    private ExecutorService executorService;//線程池
        private final int POOL_SIZE=10;//單個CPU線程池大小
        
        
    public MultiThreadServer() throws IOException{
            serverSocket
    =new ServerSocket(port);
            
    //Runtime的availableProcessor()方法返回當前系統(tǒng)的CPU數(shù)目.
            executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
            System.out.println(
    "服務(wù)器啟動");
        }

        
        
    public void service(){
            
    while(true){
                Socket socket
    =null;
                
    try {
                    
    //接收客戶連接,只要客戶進行了連接,就會觸發(fā)accept();從而建立連接
                    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{
        
    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 String echo(String msg){
            
    return "echo:"+msg;
        }

        
    public void run(){
            
    try {
                System.out.println(
    "New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
                BufferedReader br
    =getReader(socket);
                PrintWriter pw
    =getWriter(socket);
                String msg
    =null;
                
    while((msg=br.readLine())!=null){
                    System.out.println(msg);
                    pw.println(echo(msg));
                    
    if(msg.equals("bye"))
                        
    break;
                }

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

            }

        }

    }

    2.客戶端
    package sterning;

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

    public class MultiThreadClient {
        
        
    public static void main(String[] args) {
            
    int numTasks = 10;
            
            ExecutorService exec 
    = Executors.newCachedThreadPool();

            
    for (int i = 0; i < numTasks; i++{
                exec.execute(createTask(i));
            }


        }


        
    // 定義一個簡單的任務(wù)
        private static Runnable createTask(final int taskID) {
            
    return new Runnable() {
                
    private Socket socket = null;
                
    private int port=8821;

                
    public void run() {
                    System.out.println(
    "Task " + taskID + ":start");
                    
    try {                    
                        socket 
    = new Socket("localhost", port);
                        
    // 發(fā)送關(guān)閉命令
                        OutputStream socketOut = socket.getOutputStream();
                        socketOut.write(
    "shutdown\r\n".getBytes());

                        
    // 接收服務(wù)器的反饋
                        BufferedReader br = new BufferedReader(
                                
    new InputStreamReader(socket.getInputStream()));
                        String msg 
    = null;
                        
    while ((msg = br.readLine()) != null)
                            System.out.println(msg);
                    }
     catch (IOException e) {                    
                        e.printStackTrace();
                    }

                }


            }
    ;
        }

    }


    從而實現(xiàn)了多個客戶端向服務(wù)器端發(fā)送請求,服務(wù)器端采用多線程的方式來處理的情況.再結(jié)合我之前的例子---Java基于Socket文件傳輸示例,就可以實現(xiàn)多線程文件的傳輸了

    評論

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2007-11-10 14:25 by xiongzeng
    請問作者:
    可不可以利用服務(wù)端主動發(fā)信?

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2007-12-07 13:12 by qifen
    膏藥帖~~

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2008-01-07 22:19 by java綜合網(wǎng)
    很好!不錯!

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2008-03-14 11:36 by fgfdg
    dgdfggfdgdf

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2008-05-28 17:14 by 鐘僥
    我也是參照孫的書,可是運行不能得到正確的結(jié)果!很是郁悶啊
    [code]
    package com.zz.socket;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;

    public class EchoServer {

    private int port = 8000;
    private ServerSocket ss;

    public EchoServer() throws IOException {
    ss = new ServerSocket(port);
    System.out.println("server is starting....");
    }

    private String echoString(String msg){
    return "echo:" + msg;
    }
    public static void main(String[] args) {
    try {
    new EchoServer().service();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    private void service(){
    while(true){
    Socket s = null;
    try{
    s = ss.accept();
    System.out.println("a client is coming......");
    BufferedReader br = this.getReader(s);
    PrintWriter pw = this.getWriter(s);
    String msg = null;
    while((msg = br.readLine()) != null){
    System.out.println(msg);
    pw.println(this.echoString(msg)+"\n");
    pw.flush();
    if(msg.equals("bye")) break;
    }
    }catch(IOException e ){

    }
    }
    }

    private PrintWriter getWriter(Socket s) throws IOException {
    return new PrintWriter(s.getOutputStream());
    }

    private BufferedReader getReader(Socket s) throws IOException {
    return new BufferedReader(new InputStreamReader(s.getInputStream()));
    }

    }



    [/code]

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2008-05-28 17:15 by 鐘僥
    package com.zz.socket;

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

    public class EchoClient {
    private String host = "localhost";
    private int port = 8000;
    private Socket socket;

    private EchoClient() throws IOException {
    socket = new Socket(host, port);
    }

    public void talk() throws IOException {
    try {
    BufferedReader br = getReader(socket);
    PrintWriter pw = getWriter(socket);
    BufferedReader localReader = new BufferedReader(
    new InputStreamReader(System.in));
    String msg = null;
    while ((msg = localReader.readLine())!= null) {
    pw.println(msg+"\n");
    pw.flush();
    System.out.println(br.readLine());
    if (msg.equals("bye"))
    break;
    }
    } catch (IOException e) {
    } finally {
    try {
    socket.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

    private PrintWriter getWriter(Socket s) throws IOException {
    return new PrintWriter(s.getOutputStream());
    }

    private BufferedReader getReader(Socket s) throws IOException {
    return new BufferedReader(new InputStreamReader(s.getInputStream()));
    }

    /**
    * @param args
    * @throws IOException
    */
    public static void main(String[] args) throws IOException {
    new EchoClient().talk();

    }

    }

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2008-06-16 23:04 by 有貓相伴的日子
    這個代碼有很多問題,如請求處理,怎么封裝請求對象,把請求對象放一隊列

    從服務(wù)器端怎么發(fā)消息到客戶端.....

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2009-04-27 10:22 by fei
    貌似整體思想可以,但是,程序的問題就比較多了...

    # re: 多線程Java Socket編程示例[未登錄]  回復(fù)  更多評論   

    2009-05-07 15:38 by jh
    第三方殺毒

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2009-05-07 17:14 by OverKill
    如果多個線程對同一資源進行讀取,能保證資源的原子性嗎?應(yīng)該對資源加鎖

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2009-05-17 15:52 by 點水點點
    正找這樣的文章 多謝

    # re: 多線程Java Socket編程示例[未登錄]  回復(fù)  更多評論   

    2009-08-23 19:12 by Mark
    如何設(shè)定超時的問題呢?

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2010-05-09 13:48 by 詩特林fans
    我是java網(wǎng)絡(luò)編程的初學(xué)者很想加 詩特林 為好友向你請教些問題。我的qq826463574

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2010-05-09 14:05 by 詩特林fans
    服務(wù)器端:
    public class MultiThreadServer {
    private int port=8821;
    private ServerSocket serverSocket;
    private ExecutorService executorService;//線程池
    private final int POOL_SIZE=10;//單個CPU線程池大小

    public MultiThreadServer() throws IOException{
    serverSocket=new ServerSocket(port);
    //Runtime的availableProcessor()方法返回當前系統(tǒng)的CPU數(shù)目.
    executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
    System.out.println("服務(wù)器啟動");
    }

    public void service(){
    while(true){
    Socket socket=null;
    try {
    //接收客戶連接,只要客戶進行了連接,就會觸發(fā)accept();從而建立連接
    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{
    private Socket socket;
    public Handler(Socket socket){
    this.socket=socket;
    }
    /*private DataOutputStream dos(Socket socket) throws IOException{
    OutputStream socketOut=socket.getOutputStream();
    return new DataOutputStream(socketOut);
    }
    private DataInputStream dis(Socket socket) throws IOException{
    InputStream socketIn=socket.getInputStream();
    return new DataInputStream(socketIn);
    }*/

    public void run(){
    try {
    System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
    OutputStream os = socket.getOutputStream();
    DataOutputStream dos = new DataOutputStream(os);

    InputStream is = socket.getInputStream( );
    DataInputStream dis=new DataInputStream(is);
    new myserverread(dis).start();
    new myserverwite(dos).start();


    } catch (IOException e) {
    e.printStackTrace();
    }/*finally{
    try {
    if(socket!=null)
    socket.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }*/
    }
    }
    class myserverread extends Thread{
    private DataInputStream dis;
    public myserverread (DataInputStream dis){
    this.dis=dis;
    }
    public void run(){
    String info;
    try{
    while(true)
    {
    info=dis.readUTF();
    System.out.println("對方說"+info);
    if (info.equals("bye")){
    System.out.println("對方下線,程序退出");
    System.exit(0);}
    }
    }
    catch (Exception e){e.getStackTrace();}

    }
    }

    class myserverwite extends Thread{
    private DataOutputStream dos;
    public myserverwite (DataOutputStream dos){
    this.dos=dos;
    }
    public void run(){
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    String info;
    try{
    while(true)
    {
    info=br.readLine();
    dos.writeUTF(info);
    if (info.equals("bye")){
    System.out.println("自己下線,程序退出");
    System.exit(0);}
    }
    }
    catch (Exception e){e.getStackTrace();}

    }
    }



    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2010-05-09 14:06 by 詩特林fans
    客戶端:


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



    public class MultiThreadClient {

    public static void main(String[] args) {
    int ID=Info.i;

    ExecutorService exec = Executors.newCachedThreadPool();

    /* for (int i = 0; i < numTasks; i++) {
    exec.execute(createTask(i));
    }
    */
    System.out.println("客戶端線程"+ID+"已啟動~~");
    exec.execute(createTask(ID));
    Info.i=ID++;

    }

    // 定義一個簡單的任務(wù)
    private static Runnable createTask(int taskID) {
    // this.taskID=taskID;
    return new Runnable() {
    private Socket socket = null;
    private int port=8821;

    public void run() {

    // System.out.println("Task " + taskID + ":start");
    try {
    socket = new Socket("localhost", port);
    // 發(fā)送關(guān)閉命令
    InputStream is = socket.getInputStream( );
    DataInputStream dis=new DataInputStream(is);

    OutputStream os = socket.getOutputStream();
    DataOutputStream dos = new DataOutputStream(os);

    new myclientread(dis).start();
    new myclientwite(dos).start();

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

    };
    }
    }
    class myclientread extends Thread{
    private DataInputStream dis;
    public myclientread (DataInputStream dis){
    this.dis=dis;
    }
    public void run(){
    String info;
    try{
    while(true)
    {
    info=dis.readUTF();
    System.out.println("對方說"+info);
    if (info.equals("bye")){
    System.out.println("對方下線,程序退出");
    System.exit(0);}
    }
    }
    catch (Exception e){e.getStackTrace();}

    }
    }

    class myclientwite extends Thread{
    private DataOutputStream dos;
    public myclientwite (DataOutputStream dos){
    this.dos=dos;
    }
    public void run(){
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    String info;
    try{
    while(true)
    {
    info=br.readLine();
    dos.writeUTF(info);
    if (info.equals("bye")){
    System.out.println("自己下線,程序退出");
    System.exit(0);}
    }
    }
    catch (Exception e){}

    }
    }

    這個程序我想實現(xiàn)多用戶與服務(wù)器的連接交互問題,但是能過連接上但是不能實現(xiàn)交互,這是為什么呢?我是java網(wǎng)絡(luò)編程初學(xué)者謝謝您的指教急待您的回復(fù)!

    # re: 多線程Java Socket編程示例[未登錄]  回復(fù)  更多評論   

    2010-08-19 16:52 by zheng
    學(xué)習(xí)了

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2012-04-01 16:54 by 安安
    你好,這樣不會出現(xiàn)中文亂碼嗎?

    # re: 多線程Java Socket編程示例[未登錄]  回復(fù)  更多評論   

    2013-06-03 20:55 by 孫杰
    求 超市收銀系統(tǒng) 用XML Socket 和多線程 做的 有的發(fā)我郵箱 769566815@qq.com

    # re: 多線程Java Socket編程示例[未登錄]  回復(fù)  更多評論   

    2013-06-03 20:58 by 孫杰
    跪求 急用 6月5號交上去

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2014-04-30 10:37 by 126
    @鐘僥
    while(true){
    Socket s = null;

    每次s都是null

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2014-04-30 10:42 by 126
    看錯了,

    s = ss.accept();

    你那個代碼變量名太差了吧!看都看不清!

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2014-05-22 16:29 by momo128
    請問您知不知道哪里有socket的學(xué)習(xí)視頻啊?因為手頭資料實在有限,有好多不懂的地方。如果有的話請發(fā)到我的郵箱960696649@qq.com,麻煩您了~

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2014-07-30 22:02 by 月小升
    很不錯的socket教程

    # re: 多線程Java Socket編程示例  回復(fù)  更多評論   

    2014-11-18 16:42 by 一個好人
    @有貓相伴的日子
    項目中正打算使用這段代碼的,看你的品論才發(fā)現(xiàn) 確實沒有用到隊列,如果并發(fā)數(shù)量超過線程數(shù)會出現(xiàn)什么情況?
    主站蜘蛛池模板: 亚洲AV无码一区二区三区性色| 亚洲视频在线观看免费视频| 亚美影视免费在线观看| 国产免费一级高清淫曰本片| 免费永久看黄在线观看app| 亚洲av色香蕉一区二区三区| 国产网站在线免费观看| 免费精品视频在线| 国产亚洲人成A在线V网站| 黄色网址在线免费| 亚洲欧洲日产v特级毛片| 男人的好看免费观看在线视频| 亚洲精品天堂在线观看| 麻豆成人精品国产免费| 免费人成再在线观看网站 | 亚洲精品在线免费观看| 在免费jizzjizz在线播| 亚洲中文无码卡通动漫野外| 国产v片免费播放| japanese色国产在线看免费| 国产成人亚洲综合色影视| 最近免费中文在线视频| 亚洲三级在线观看| 亚洲人成影院在线观看 | a级黄色毛片免费播放视频| 亚洲精品免费在线观看| 毛片基地免费观看| 一个人看的hd免费视频| 久久亚洲精品无码VA大香大香| 最新中文字幕电影免费观看| 一级毛片完整版免费播放一区| 亚洲大成色www永久网站| 久久久久国色AV免费观看性色| 深夜A级毛片视频免费| 亚洲专区先锋影音| 国产精品久久免费视频| 久久成人免费电影| 自拍偷自拍亚洲精品偷一| 亚洲AV无码一区东京热| 日韩在线视频免费看| 免费一级毛片无毒不卡|