閱讀599 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Socket用法,簡單模擬一對一聊天

https://blog.csdn.net/touch_2011/article/details/6914739

1、socket和serverSocket通信簡單介紹如下,注意客戶端與服務器端是怎麼交換數據的

 

 

2、模擬qq聊天功能,實現客戶端與服務器(一對一)的聊天功能

服務器端代碼:

package demo.net;

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

/**
 * 模擬qq聊天功能: 實現客戶端與服務器(一對一)的聊天功能,客戶端首先發起聊天,輸入的內容在服務器端和客戶端顯示,
 * 然後服務器端也可以輸入信息,同樣信息也在客戶端和服務器端顯示
 */

// 服務器類
public class ChatServer {
	private int port = 8189;// 默認服務器端口

	public ChatServer() {
	}

	// 創建指定端口的服務器
	public ChatServer(int port) {
		this.port = port;
	}

	// 提供服務
	public void service() {
		try {// 建立服務器連接
			ServerSocket server = new ServerSocket(port);
			// 等待客戶連接
			Socket socket = server.accept();
			try {
				// 讀取客戶端傳過來信息的DataInputStream
				DataInputStream in = new DataInputStream(socket
						.getInputStream());
				// 向客戶端發送信息的DataOutputStream
				DataOutputStream out = new DataOutputStream(socket
						.getOutputStream());
				// 獲取控製台輸入的Scanner
				Scanner scanner = new Scanner(System.in);
				while (true) {
					// 讀取來自客戶端的信息
					String accpet = in.readUTF();
					System.out.println(accpet);
					String send = scanner.nextLine();
					System.out.println("服務器:" + send);
					// 把服務器端的輸入發給客戶端
					out.writeUTF("服務器:" + send);
				}
			} finally {// 建立連接失敗的話不會執行socket.close();
				socket.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new ChatServer().service();
	}
}


 

客戶端代碼:

package demo.net;

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

/**
 * 注意用到的輸入輸出流DataInputStream和DataOutputStream,成對出現,最好用字節流
 */
// 客戶端類
public class ChatClient {
	private String host = "localhost";// 默認連接到本機
	private int port = 8189;// 默認連接到端口8189

	public ChatClient() {

	}

	// 連接到指定的主機和端口
	public ChatClient(String host, int port) {
		this.host = host;
		this.port = port;
	}

	public void chat() {
		try {
			// 連接到服務器
			Socket socket = new Socket(host, port);

			try {
				// 讀取服務器端傳過來信息的DataInputStream
				DataInputStream in = new DataInputStream(socket
						.getInputStream());
				// 向服務器端發送信息的DataOutputStream
				DataOutputStream out = new DataOutputStream(socket
						.getOutputStream());

				// 裝飾標準輸入流,用於從控製台輸入
				Scanner scanner = new Scanner(System.in);

				while (true) {
					String send = scanner.nextLine();
					System.out.println("客戶端:" + send);
					// 把從控製台得到的信息傳送給服務器
					out.writeUTF("客戶端:" + send);
					// 讀取來自服務器的信息
					String accpet = in.readUTF();
					System.out.println(accpet);
				}

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

	public static void main(String[] args) {
		new ChatClient().chat();
	}
}


 

運行結果:

          

注意運行的時候要先開服務器,再開客戶端,聊天由客戶端發起。運行結果中綠色的字表示輸入。


最後更新:2017-04-03 19:13:18

  上一篇:go java多線程總結一:線程的兩種創建方式及優劣比較
  下一篇:go 基於SMTP的郵件發送客戶端