Java通信之服務器生猛上手


Java通信之服務器生猛上手

一、生猛上手前的準備
Java其實是一門網絡編程語言,這是和C語言和C++語言的一大區別,同時也是Java語言的一大特性;通過簡單的Java語言代碼就可以讓多臺計算機之間進連接,實現計算機之間的通信;下面介紹和通信的相關幾個概念
服務器指一個管理資源併爲用戶提供服務的計算機設備簡單的理解爲一臺服務的計算機,這臺計算機掌握着很多的資源和信息;
ip:
網絡之間互連的協議(IP)是Internet Protocol外語縮寫,中文縮寫爲“網協”.
ip地址:每臺連入互聯網的計算機的編號,類似人的身份證號碼,具有唯一性;只要知道ip地址,就知道是哪臺機器;就好比知道你的身份證號,就可以找到那個唯一的你;
端口:"端口"是英文port的意譯,可以認爲是設備與外界通訊交流的出口。你的計算機上運行着無數個程序,服務器怎麼知道該把消息發給這臺計算機的哪個程序呢?端口號就起到標識計算機上每個運行程序的作用;

查詢你計算機的IP地址和啓動系統自帶的客戶端

win+r快捷鍵  在命令框中輸入cmd  在黑色命令行中輸入ipconfig

       


二、Java語言創建服務器的步驟

1、創建服務器對象,並指定端口號;

ServerSocket server= new ServerSocket(9090);

等待客戶端的連接服務器

Socket socket = server.accept();

2、發送和接收消息

獲取輸入輸出流:

InputStream ins = socket.getInputStream();

OutputStream ous = socket.getOutputStream();

3、我們可以對代碼進行封裝:初始化服務器的函數、讀取消息的函數、發送消息的函數

4、多客戶端連服務器

accept的外圍添加一個循環,用於循環接收客戶端的連接

獲取連接後的邏輯代碼,我們得用線程完成


三、服務器生猛上手源代碼:

package com.huaxin.server;

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

public class MyServer {
	public static void main(String[] args) {
		MyServer ms = new MyServer();
		ms.initServer();
	}

	public void initServer() {
		try {
			// 構造一個服務器對象
			ServerSocket server = new ServerSocket(9090);
			System.out.println("服務器已經創建成功,等待客戶端的鏈接.....");
			while (true) {
				// 獲取客戶端的鏈接:套接字,阻塞代碼
				final Socket socket = server.accept();
				System.out.println("有客戶端連上服務器!");
				new Thread() {
					public void run() {
						try {
							// 客戶端連上服務器之後:發送消息和接收消息
							// 獲取輸入流,用於讀取消息
							InputStream ins = socket.getInputStream();
							// 獲取輸出流,用於發送消息
							OutputStream ous = socket.getOutputStream();
							/**發送消息 ***/
							sendMsg(ous);
							/**接收消息 **/
							String msg = readMsg(ins);
							while (!msg.equals("bye")) {
								System.out.println(msg);
								// 讀取客戶端發送過來的一條消息
								msg = readMsg(ins);
							}
							// 關閉流和套接字和服務器
							ous.close();
							ins.close();
							socket.close();
						} catch (Exception e) {
							e.printStackTrace();
						}
					};
				}.start();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 讀取消息的函數
	 */
	public String readMsg(InputStream ins) throws Exception {
		// 讀取第一個字節
		int value = ins.read();
		String str = "";
		// 循環讀取字節內容
		// 當客戶端輸入回車的時候,讀取消息部分會讀取到13(回車)和10(換行)兩個字節
		while (value != 10 && value != -1) {
			// 拼接成一個字符串
			str = str + (char) value;
			value = ins.read();
		}
		// 處理掉字符串後面的回車
		str = str.trim();
		return str;
	}

	/**
	 * 發送消息的函數
	 */
	public void sendMsg(OutputStream ous) throws Exception {
		// 開始發送消息
		String msg = "welcome to our chating room !";
		byte[] bytes = msg.getBytes();
		ous.write(bytes);
		ous.flush();
	}

}



四、運行結果:
測試:win+r快捷鍵  在命令框中輸入cmd  在黑色命令行中輸入telnet localhost 9090啓動系統自帶的客戶端

telnet 指連接到 ip地址爲localhost (本機)端口號爲9090的計算機上;連接到同一WiFi下的計算機只要知道服務器的ip地址到可以連接到該程序


一定要先開啓服務器:

利用localhost連接到服務器:




查看本機ip地址:





連接成功!併發送消息(暫時只能發送英文)




利用ip地址加端口號連接服務器:

因爲是用循環,所以服務器一直在等待接受客戶端的連入,每連入一個,用一個獨立的線程去跑




控制檯顯示客戶端輸入的信息:




客戶端輸入bye,斷開和服務器的鏈接(不要點X按鈕,會出現bug,這個問題到後面解決)



五、總結

通過對服務器的生猛上手,明白了一些簡單的通信的原理和概念,學到了很多小知識;比如查看自己計算機的ip地址,開啓系統自帶的客戶端等;同時,對Java如何創建服務器的過程有了詳細的瞭解;

出現的問題:有時會連接不到服務器

可能原因:

0、沒有啓動telnet服務

1、服務器沒有先開啓

2、telnet 或者localhost英文單詞或者ip地址或者輸入錯誤

3、在輸入telnet後就按下了回車鍵,

4、端口號沒有輸入

今天就分享到這裏!共勉!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章