IM即時通訊(二) 文字傳輸
阿新 • • 發佈:2018-12-28
服務端
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、客戶端一定要先發送訊息,很多孩紙都悶在這步,不曉得哪裡錯了,就是沒有用,也不報錯.**