1. 程式人生 > >IM即時通訊(二) 文字傳輸

IM即時通訊(二) 文字傳輸

服務端

package me.mxzf;

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

/**
 * 
 * @Title: TextServer
 * @Dscription: 服務端
 * @author Deleter
 * @date 2017年3月12日 上午9:14:55
 * @version 1.0
 */
public class
TextServer {
public static void main(String[] args) { try { // 新建一個服務端例項,監聽繫結1234埠 ServerSocket serverSocket = new ServerSocket(1234); // accept阻塞直到有Socket進行握手 Socket socket = serverSocket.accept(); // 用Data輸入輸出流封裝流通道 DataInputStream dis = new
DataInputStream(socket.getInputStream()); DataOutputStream dos = new DataOutputStream( socket.getOutputStream()); // 定義一些變數,用來接收來自"客戶端"的資訊 String content; StringBuilder contents = new StringBuilder(); // 當沒有訊息來之前,readUTF()一直處於阻塞狀態
while ((content = dis.readUTF()) != null) { // 一開始readUTF()是阻塞的,直到有資料來便開始讀入 // 如果readUTF()讀到了流的尾部也就是null // 那麼可以假設資料讀入完整,自動跳出迴圈 contents.append(content); } // 經典的輸出語句,這裡就不多說了 System.out.println(contents.toString()); // 伺服器主動推送資訊 dos.writeUTF("孫子別走,看爺爺打不死你."); // 重新整理緩衝區,防止粘包 dos.flush(); //斷開連線 socket.close(); } catch (IOException e) { //捕捉異常 e.printStackTrace(); } } }

客戶端

package me.mxzf;

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

/**
 * 
 * @Title: TextSocket
 * @Dscription: 客戶端
 * @author Deleter
 * @date 2017年3月12日 上午9:15:08
 * @version 1.0
 */
public class TextSocket {
    public static void main(String[] args) {
        try {
            // 新建Socket例項(伺服器地址,被監聽埠)
            Socket socket = new Socket(InetAddress.getLocalHost(), 1234);
            // 用Data輸入輸出流封裝流通道
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            DataOutputStream dos = new DataOutputStream(
                    socket.getOutputStream());
            // 客戶端向伺服器傳送一條資訊
            // 通訊前,客戶端"必須先"向伺服器傳送訊息
            dos.writeUTF("爺爺,Mdzz");
            // 定義一些變數用來接收,來自"伺服器"的訊息
            String content;
            StringBuilder contents = new StringBuilder();
            // 當沒有訊息來之前,readUTF()一直處於阻塞狀態
            while ((content = dis.readUTF()) != null) {
                // 一開始readUTF()是阻塞的,直到有資料來便開始讀入
                // 如果readUTF()讀到了流的尾部也就是null
                // 那麼可以假設資料讀入完整,自動跳出迴圈
                contents.append(content);
                break;
            }
            //依然是,輸出語句
            System.out.println(contents);
            //斷開連線
            socket.close();
        } catch (IOException e) {
            //捕捉異常
            e.printStackTrace();
        }
    }
}

**注意:

1、先執行服務端,在執行客戶端
2、客戶端一定要先發送訊息,很多孩紙都悶在這步,不曉得哪裡錯了,就是沒有用,也不報錯.**