1. 程式人生 > >Java網路程式設計,socket實現一對一全雙工通訊聊天功能

Java網路程式設計,socket實現一對一全雙工通訊聊天功能

本文使用socket的長連線,進行訊息的傳送和接受。

1、兩端

client 端,server端

2、兩執行緒

客戶端、伺服器端,各開兩個執行緒,實現讀寫,可以全雙工通訊,非同步傳送,非同步接受。

3、兩注意

程式等待輸入和一直處於等待訊息發來,所以,用到死迴圈。

讀訊息,用到的是行讀,nextLine()方法,所以,一定要在傳送訊息時,在訊息末尾追加加上換行符,否則讀不到。

程式碼:

1、訊息傳送服務類

package com.socket.newChat;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * Created by Liuxd on 2018-09-15.
 */
public class SendMessageService implements Runnable {
    private Socket socket;
    private String name;

    public SendMessageService(Socket socket, String name) {
        this.socket = socket;
        this.name = name;
    }

    public void run() {
        PrintWriter pWriter = null;
        Scanner scanner = null;
        try {
            pWriter = new PrintWriter(socket.getOutputStream());
            scanner = new Scanner(System.in);
            while (true) {
                String s = scanner.nextLine();
                pWriter.write(name + s + "\n");
                pWriter.flush();
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            scanner.close();
            pWriter.close();
        }

    }
}

2、訊息接受服務類

package com.socket.newChat;

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

/**
 * Created by Liuxd on 2018-09-15.
 */
public class ReceiveMessageService implements Runnable {
    private Socket socket;

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

    @Override
    public void run() {
        Scanner scanner = null;
        try {
            scanner = new Scanner(socket.getInputStream());
            while (scanner.hasNext()) {
                System.out.println(scanner.nextLine());
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            scanner.close();
        }
    }
}

3、服務端

package com.socket.newChat;

/**
 * Created by Liuxd on 2018-09-15.
 */

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


public class TestServer {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8081);

        while (true) {
            Socket socket=serverSocket.accept();

            new Thread(new SendMessageService(socket,"伺服器端:")).start();
            new Thread(new ReceiveMessageService(socket)).start();

            System.out.println("請輸入...");

        }
    }
}

4、客戶端

package com.socket.newChat;

/**
 * Created by Liuxd on 2018-09-15.
 */

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


public class TestClient {

    public static void main(String[] args) {
        try {
            Socket socket = new Socket("127.0.0.1", 8081);

            new Thread(new SendMessageService(socket,"客戶端:")).start();
            new Thread(new ReceiveMessageService(socket)).start();

            System.out.println("請輸入...");

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

    }
}