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、端口號沒有輸入
今天就分享到這裏!共勉!