Java學習筆記 TCP中的Socket與ServerSocker

我們先來看看源代碼,這裏有兩個類,分別是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對象的輸出流,從而,服務端便獲得了這個輸入流,得到了客戶端輸入的消息

具體圖片如下:


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