1. 程式人生 > >java socket網路通訊

java socket網路通訊

1.客戶端給伺服器傳送1句話

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class ClientSocket1 {
    public static void main(String[] args) throws IOException, InterruptedException {
        Socket socket = new Socket("127.0.0.1", 9999);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write("hello word");
        bw.newLine();
        bw.flush();
    }
}



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

/**
 * 客戶端給服務端傳送1條資料
 */
public class ServerScoket1 {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999);
        Socket socket = serverSocket.accept();
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        while (true){
            String s = br.readLine();
            System.out.println(s);
        }
    }
}

2.客戶端給伺服器傳送n句話

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class ClientSocket2 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 9999);
        //建立字元輸出流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        Scanner scanner = new Scanner(System.in);
        //迴圈往伺服器寫資料
        String str;
        while (!(str=scanner.nextLine()).equalsIgnoreCase("close")){
            bw.write(str);
            bw.newLine();//必須加上換行,這樣伺服器就能讀出一行資料
            bw.flush();
        }
        //釋放資源
        bw.close();
        socket.close();

    }
}



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

/**
 * 客戶端給服務端傳送無限多資料
 * 當客戶端輸入close(不區分大小寫)時,通訊結束
 */
public class ServerSocket2 {
    public static void main(String[] args) throws IOException {
        //獲取客戶端連線
        ServerSocket serverSocket = new ServerSocket(9999);
        Socket socket = serverSocket.accept();
        //建立字元輸入流,
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //迴圈讀資料
        String str ;
        while ((str = br.readLine())!=null){
            System.out.println(str);
        }
        //關流
        br.close();
        socket.close();
    }
}

3.伺服器和1個客戶端相互發送資料

package com.itheima.test;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class ClientSocket3 {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        //建立客戶端socket
        Socket socket = new Socket("127.0.0.1", 9999);
        //接收資料的方法
        Runnable myRunReceive = new Runnable() {
            @Override
            public void run() {
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String str;
                    //這個地方等待服務端關閉傳送資料流,關閉之後就跳出迴圈
                    while ((str=br.readLine())!=null){
                        System.out.println(str);
                    }
                    //關流
                    br.close();
                    socket.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

        //傳送資料的方法
        Runnable myRunSend = new Runnable() {
            @Override
            public void run() {
                //建立字元輸出流
                try {
                    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                    //傳送資料,當輸入close時,結束
                    String str=null;
                    while (!(str=scanner.nextLine()).equalsIgnoreCase("close")){
                        bw.write(str);
                        bw.newLine();
                        bw.flush();
                    }
                    //跳出迴圈時,關流
                    bw.close();
                    socket.close();
                } catch (Exception e) {

                }
            }
        };

        //開啟1個執行緒執行接收資料
        new Thread(myRunReceive).start();
        //開啟1個執行緒執行傳送資料
        new Thread(myRunSend).start();

    }
}





package com.itheima.test;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 * 客戶端,服務端雙方相互通訊,有1方輸入close,結束通訊
 */
public class ServerSocket3 {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        //等待客戶端
        ServerSocket serverSocket = new ServerSocket(9999);
        Socket socket = serverSocket.accept();
        //向客戶端傳送資料方法
        Runnable myRunSend = new Runnable() {
            @Override
            public void run() {
                //建立字元輸出流
                try {
                    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                    //傳送資料,當輸入close時,結束
                    String str=null;
                    while (!(str=scanner.nextLine()).equalsIgnoreCase("close")){
                        bw.write(str);
                        bw.newLine();
                        bw.flush();
                    }
                    //跳出迴圈時,關流
                    bw.close();
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };

        //從客戶端接收資料方法
        Runnable myRunReceive = new Runnable() {
            @Override
            public void run() {
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String str;
                    //這個地方等待客戶端關閉傳送資料流,關閉之後就跳出迴圈
                    while ((str=br.readLine())!=null){
                        System.out.println("客戶端:"+str);
                    }
                    //關流
                    br.close();
                    socket.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        //開啟執行緒傳送資料
        new Thread(myRunSend).start();
        //開啟執行緒 ,接收資料
        new Thread(myRunReceive).start();
    }
}

4.伺服器和多個客戶端收發資料,客戶端還用上面的ClientSocket3

package com.itheima.test;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 伺服器可以接收多個客戶端
 * 客戶端,服務端雙方相互通訊,有1方輸入close,結束通訊
 */
public class ServerSocket4 {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        //
        ServerSocket serverSocket = new ServerSocket(9999);
        //建立執行緒池
        ExecutorService executorPool = Executors.newCachedThreadPool();
        ArrayList<Socket> sockets = new ArrayList<>();

        Runnable myRunSend = new Runnable() {
            @Override
            public void run() {
                System.out.println("執行緒開啟");
                try {
                    while(true){
                        String str = scanner.nextLine();//這裡要等以下,因為是多執行緒,如果sockets裡沒內容,這個執行緒直接結束了,所以這個地方卡在輸入這
                        for (Socket socket : sockets) {
                            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                            //這個是給所有客戶端發個小說
                            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("/Users/liudawei/Documents/develop/javaweb/day19_project/src/com/itheima/test/aa.txt")));
                            String str3 = null;
                            while ((str3=br.readLine())!=null){
                                bw.write(str3);
                                bw.newLine();
                                bw.flush();
                            }
//                             這個是傳送一行短的語句
//                            bw.write("伺服器:"+str);
//                            bw.newLine();
//                            bw.flush();
                        }
                    }

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

        executorPool.execute(myRunSend);


        //接收客戶端資料
        while (true) {
            Socket socket = serverSocket.accept();
            sockets.add(socket);
            //從客戶端接收資料方法
            Runnable myRunReceive = new Runnable() {
                @Override
                public void run() {
                    try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        String str;
                        //這個地方等待客戶端關閉傳送資料流,關閉之後就跳出迴圈
                        while ((str = br.readLine()) != null) {
                            String str1 = "客戶端" + Thread.currentThread().getName() + ":" + str;
                            System.out.println(str1);
                            //這裡向每一個客戶端傳送資料,包括自己
                            for (Socket socket1 : sockets) {
                                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket1.getOutputStream()));
                                bw.write(str1);
                                bw.newLine();
                                bw.flush();
                            }
                        }
                        //關流
                        br.close();
                        sockets.remove(socket);
                        Thread.sleep(2000);
                        socket.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            executorPool.execute(myRunReceive);
        }

    }
}

涉及到多執行緒,沒有用執行緒同步,也可以實現需求