我們先來看看源代碼,這裏有兩個類,分別是TCPServer和TCPClient,看名字就知道意思了吧,我不用解釋了;
//服務器類,用於監聽客戶端傳來的消息;
import java.net.*;
import java.io.*;
import java.util.*;
public class TCPServer {
public static void main(String[] args){
new TCPServer().service();
}
public void service() {
ServerSocket ss = null;
Socket s = null;
BufferedReader reader = null;
String str = null;
while(true) {
try {
ss = new ServerSocket(8888);
s = ss.accept();
System.out.println("客戶端上線");
reader=new BufferedReader(new InputStreamReader(s.getInputStream()));//獲得s的輸入流,從而得到信息
while(!"bye".equals(str)) {
str = reader.readLine();
System.out.println(str+"\t"+new Date());
}
System.out.println("客戶端下線");
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
s.close();
ss.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
這個類裏面有一個service()方法,在這個方法中,我們new 了一個new ServerSocket(8888);通過文檔,我們知道他的作用是創建一個綁定到8888端口的服務器套接字。一旦有Socket訪問了8888端口,就可以通過accept()獲得是哪一個Socket對象,獲得該Socket對象。我在這裏通過s.getInputStream()獲得該Socket對象的輸入流,從而,我們可以獲得該輸入流裏面的信息;
//客戶端類,用於傳送消息給服務器;
import java.net.*;
import java.io.*;
public class TCPClient {
public static void main(String[] args){
new TCPClient().service();
}
public void service() {
Socket s =null;
BufferedReader reader = null;
BufferedWriter writer = null;
try {
s = new Socket("127.0.0.1",8888);
reader = new BufferedReader(new InputStreamReader(System.in));
writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String str =null;
while(!"bye".equals(str)) {
str =reader.readLine();
writer.write(str);
writer.newLine();
writer.flush();
}
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
s.close();
reader.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
}
同樣,在客戶端中我們實例化了一個Socket對象,通過文檔,我們傳入一個ip地址以及對應的端口號,也就是時說,一旦s = new Socket("127.0.0.1",8888)執行,服務器端的ss.accpet()變接受到這個實例化的對象,便可以打印出
"客戶端上線",因爲服務端始終處於accpet(),後面語句被堵塞。然後,我實例化了一個BufferedReader,用於獲得從鍵盤上取得的字符,並且將這個字符寫入Socket對象的輸出流,從而,服務端便獲得了這個輸入流,得到了客戶端輸入的消息
具體圖片如下: