TCP學習筆記-實現客戶端、服務端
需求:建立一個文本轉換服務客戶端給服務器發送文本,服務端將文本轉換成大寫在返回給客戶端。
而且客戶端可以不斷的進行文本轉換。當客戶端輸入over時,轉換結束
分析:
客戶端:既然是操作設備上的數據,那麼就可以使用io技術,並按照io的操作規律來思考。
源:鍵盤錄入目的:網絡設備,網絡輸出流。而且操作的是文本數據。可以選擇字符流。
步驟
1,建立服務。
2,獲取鍵盤錄入。
3,將數據發送給服務端。
4,服務端返回大寫數據。
5,結束,關閉資源。
都是文本數據,可以使用字符流進行操作,同時提高效率,加入緩衝。
import java.io.*;
import java.net.*;
//創建一個客戶端
class TransClient{
public static void main(String[] args) throws Exception{
Socket s = new Socket("192.168.1.9",10005);
//定義讀取鍵盤數據的流對象
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//定義目的,將數據寫入到socket輸出流。發送給服務端
BufferedWriter bufout =new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//定義一個socket讀取流,讀取服務端返回的大寫信息。
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;while((line = bufr.readLine())!=null)
{
if("over".equals(line))
break;bufout.write(line);
//刷新緩衝區的數據
bufout.newLine();bufout.flush();
String str = bufIn.readLine();
System.out.println("server"+str);
}
bufr.close();s.close();
}
}
源:socket讀取流
目的:socket輸入流
都是文本,裝飾。
//服務端:
class TransServer{
public static void main(String [] args) throws Exception{
ServerSocket ss = new ServerSocket(10005);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
//讀取socket 讀取流中的數據源
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
//目的 socket輸出流,將大寫數據寫入到socket輸出流,併發送給客戶端
BufferedWriter bufout =new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line = null;
//需要讀到回車符,讀到就把數據刷新出來
//阻塞式方法
while((line = bufIn.readLine())!=null){
System.out.println(line);
bufout.write(line.toUpperCase());
bufout.newLine();bufout.flush();
//三句變一句
//out.println(line);
}
s.close();ss.close();
}
}
/*該例子出現的問題現象:客戶端和服務端都在等待原因:因爲客戶端和服務端都有阻塞式方法。這些方法沒有讀到結束標記,那麼一直等.而導致兩端,都在等*/