<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    多線程Java Socket編程示例

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

    這篇做為學習孫衛琴<<Java網絡編程精解>>的學習筆記吧.其中采用Java 5的ExecutorService來進行線程池的方式實現多線程,模擬客戶端多用戶向同一服務器端發送請求.

    1.服務端
    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()方法返回當前系統的CPU數目.
            executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
            System.out.println(
    "服務器啟動");
        }

        
        
    public void service(){
            
    while(true){
                Socket socket
    =null;
                
    try {
                    
    //接收客戶連接,只要客戶進行了連接,就會觸發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));
            }


        }


        
    // 定義一個簡單的任務
        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);
                        
    // 發送關閉命令
                        OutputStream socketOut = socket.getOutputStream();
                        socketOut.write(
    "shutdown\r\n".getBytes());

                        
    // 接收服務器的反饋
                        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();
                    }

                }


            }
    ;
        }

    }


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

    評論

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

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

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

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

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

    2008-01-07 22:19 by java綜合網
    很好!不錯!

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

    2008-03-14 11:36 by fgfdg
    dgdfggfdgdf

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

    2008-05-28 17:14 by 鐘僥
    我也是參照孫的書,可是運行不能得到正確的結果!很是郁悶啊
    [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編程示例  回復  更多評論   

    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編程示例  回復  更多評論   

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

    從服務器端怎么發消息到客戶端.....

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

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

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

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

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

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

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

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

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

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

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

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

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

    2010-05-09 14:05 by 詩特林fans
    服務器端:
    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()方法返回當前系統的CPU數目.
    executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
    System.out.println("服務器啟動");
    }

    public void service(){
    while(true){
    Socket socket=null;
    try {
    //接收客戶連接,只要客戶進行了連接,就會觸發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編程示例  回復  更多評論   

    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++;

    }

    // 定義一個簡單的任務
    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);
    // 發送關閉命令
    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){}

    }
    }

    這個程序我想實現多用戶與服務器的連接交互問題,但是能過連接上但是不能實現交互,這是為什么呢?我是java網絡編程初學者謝謝您的指教急待您的回復!

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

    2010-08-19 16:52 by zheng
    學習了

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

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

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

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

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

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

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

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

    每次s都是null

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

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

    s = ss.accept();

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

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

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

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

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

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

    2014-11-18 16:42 by 一個好人
    @有貓相伴的日子
    項目中正打算使用這段代碼的,看你的品論才發現 確實沒有用到隊列,如果并發數量超過線程數會出現什么情況?
    主站蜘蛛池模板: 亚洲乱码一区二区三区国产精品| 精品国产免费一区二区| 中文亚洲成a人片在线观看| 亚洲AV无码专区在线观看成人| 日韩免费一区二区三区在线播放| 2022年亚洲午夜一区二区福利| 日本免费久久久久久久网站| 亚洲av无码专区在线播放| 免费网站看av片| 亚洲福利一区二区| 久久久久国色AV免费看图片| 全部免费毛片在线播放| 亚洲第一视频网站| 人妻无码久久一区二区三区免费| 国外亚洲成AV人片在线观看| 韩国免费A级毛片久久| 午夜亚洲福利在线老司机| 亚洲色成人网一二三区| 久久免费看黄a级毛片| 久久精品国产亚洲AV高清热| 8x成人永久免费视频| 亚洲国产精品无码久久久| 日本妇人成熟免费中文字幕 | 亚洲国产精品久久人人爱| 暖暖日本免费中文字幕| 亚洲一级二级三级不卡| 三年片免费高清版 | 亚洲av极品无码专区在线观看| 久久免费高清视频| 免费大黄网站在线观| 一个人免费观看日本www视频| 亚洲欧洲一区二区三区| a级黄色毛片免费播放视频| 曰韩亚洲av人人夜夜澡人人爽| 不卡视频免费在线观看| 国产亚洲精aa成人网站| 456亚洲人成影院在线观| 青青视频观看免费99| 美女无遮挡拍拍拍免费视频| 亚洲综合免费视频| 亚洲男人天堂2020|