Java Socket 通信之多線程


一、簡單的客戶端與服務器交互(客戶端向服務器發送數據,服務器將數據再返回給客戶端)

服務端

* 1、創建服務器 指定端口 ServerSocket(int port)
* 2、接收客戶端連接 阻塞時
* 3、發送數據
* 接收多個客戶端

Mulityserver.java

package cn.Tcp;
/*
 * 服務端
 * 1、創建服務器 指定端口   ServerSocket(int port)
 * 2、接收客戶端連接   阻塞時
 * 3、發送數據
 * 接收多個客戶端
 */
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Mulityserver {
    public static void main(String[] args) throws IOException {
        //1、創建服務器 指定端口   ServerSocket(int port)
        ServerSocket server=new ServerSocket(8488);
        //2、接收客戶端連接   阻塞時
        while(true) {  //死循環  一個accept() 一個客戶端
            Socket socket=server.accept();
            System.out.println("一個客戶端建立連接");
            //3、發送數據
            String msg="歡迎使用";
            //輸出流
            
            DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}

客戶端

Client.java

package cn.Tcp;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        //1、創建客戶端 必須指定服務器+端口 此時就在連接
        Socket client=new Socket("localhost",8488);
        //2、接收數據
        DataInputStream dis =new DataInputStream(client.getInputStream());
        String     echo=dis.readUTF();
        System.out.println(echo);
        
    }
}

效果:

二、多線程實現客戶端與服務器端交互(客戶端不斷的發送,服務器不斷的返回)

1)關閉流的方法

CloseUtil.java

package chatdemo02;

import java.io.Closeable;
import java.io.IOException;

/*
 * 關閉流的方法
 */
public class CloseUtil {
    public static void closeAll(Closeable... io) {
        for(Closeable temp:io) {
                try {
                    if(null!=temp) {
                    temp.close();
                } 
                }    catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                
            }
        }
    }
}

2)發送數據的線程

Send.java

package chatdemo02;

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

/*
 * 發送數據  線程 
 */
public class Send implements Runnable {
    //控制台輸入流
    private BufferedReader console;
    //管道輸出流
    private DataOutputStream dos;
    //控制線程
    private boolean isRunning=true;
    
    public Send() {
        console=new BufferedReader(new InputStreamReader(System.in));
        
    }
    public Send(Socket client) {
        this();
        try {
            dos=new DataOutputStream(client.getOutputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            isRunning=false;
            CloseUtil.closeAll(dos,console);
        }
    }
    
    private String getMsgFromConsole() {
        try {
            return console.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "";
    }
/*
 * 1、從控制台接收數據
 * 2、發送數據
 */
    public void send() {
        String msg=getMsgFromConsole();
        if(null!=msg&&  !msg.equals("")) {
            try {
                dos.writeUTF(msg);
                dos.flush();   //強制刷新
            } catch (IOException e) {
                // TODO Auto-generated catch block
                isRunning=false;
                CloseUtil.closeAll(dos,console);

            }
        }
    }
    @Override
    public void run() {
        // 線程體
        while(isRunning) {
            send();
        }
    }

}

3)接收數據的線程

Receive.java

package chatdemo02;
/*
 * 接收線程
 */

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

public class Receive implements Runnable {
    //輸入流
    private DataInputStream dis;
    //線程標識
    private boolean isRunning=true;
    
    public Receive() {
        
    }

    public Receive(Socket client) {
        try {
            dis=new DataInputStream(client.getInputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            isRunning=false;
            CloseUtil.closeAll(dis);
        }
    }
    
    /*
     * 接收數據
     */
    public String receive() {
        String msg="";
        try {
            msg=dis.readUTF();
            
        } catch (IOException e) {
            //e.printStackTrace();
            isRunning=false;
            CloseUtil.closeAll(dis);
            
        }
        return msg;
    }

    @Override
    public void run() {
        //線程體
        while(isRunning) {
            System.out.println(receive());
        }
    }

}

4)服務端

Server.java

package chatdemo02;

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

/*
 * 創建服務器
 * 寫出數據 :輸出流
 * 讀取數據:輸入流
 */
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server=new ServerSocket(9999);
        Socket client=server.accept();
        
        //寫出數據
        //輸入流
        DataInputStream dis=new DataInputStream(client.getInputStream());
        String msg=dis.readUTF();
        System.out.println(msg);
        
        //輸出流    
        DataOutputStream dos=new DataOutputStream(client.getOutputStream());
        dos.writeUTF("服務器----->"+msg);
        dos.flush();
    }
}

5)客戶端

Client.java

package chatdemo02;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

/*
 * 創建客戶端  :發送數據+接收數據
 * 寫出數據 :輸出流
 * 讀取數據:輸入流
 * 輸入流輸出流在同一個線程內應該獨立處理
 * 
 * 
 * 
 */
public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket client=new Socket("localhost",9984);
        //控制台輸入流
        new Thread(new Send(client)).start();   //一條路徑
        new Thread(new Receive(client)).start(); 
        
    }
    
}

運行 Server.java    Client.java   效果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM