package seday08;java
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;linux
/**
* @author xingsir
*簡易聊天室客戶端
*/
public class Client {
/*
* 套接字 java.net.Socket
* Socket封裝了底層TCP協議的通信細節,使用它能夠經過
* TCP協議與服務端創建連接,並以兩條流進行IO操做完成 與服務端的數據交換
*/
private Socket socket;//聲明瞭一個 Socket類型的對象
//構造方法
public Client() {
try {windows
System.out.println("正在鏈接服務器。。。。。。");
socket =new Socket("localhost",33069);//端口範圍0-65535
System.out.println("已成功鏈接服務端!");
} catch (Exception e) {
e.printStackTrace();//輸出錯誤堆棧信息,有助於定位並解決錯誤
}
}
/*
* 客戶端開始工做的方法
*/
public void start() {服務器
try {
OutputStream out = socket.getOutputStream();//客戶端的Socket對象上的getOutputStream方法獲得的輸出流其實就是發送給服務器端的數據。
OutputStreamWriter osw= new OutputStreamWriter(out);//字符轉字節流
BufferedWriter bw=new BufferedWriter(osw);//緩衝流
PrintWriter pw =new PrintWriter(bw,true);//行更新
Scanner scanner=new Scanner(System.in);//控制檯輸入,獲取鍵盤輸入信息
while(true) {//條件爲真
String message=scanner.nextLine();
pw.println(message);
}
} catch (Exception e) {
e.printStackTrace();//輸出錯誤堆棧信息,有助於定位並解決錯誤
}
}
public static void main(String[] args) {
//實例化一個客戶端
Client client = new Client();
//調用啓動方法
client.start();socket
}.net
}server
//===================================================================================對象
package seday08;字符串
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author xingsir
* 服務器端
*/
public class Server {
private ServerSocket server;//聲明瞭一個ServerSocket類型的對象
//構造方法
public Server() {
try{
System.out.println("服務器正在啓動。。。。。。");
server = new ServerSocket(33069);//接受的端口號
System.out.println("服務端啓動完畢!");
}catch (IOException e) {
e.printStackTrace();//輸出錯誤堆棧信息,有助於定位並解決錯誤
}
}
//服務端工做方法
public void start() {
try {
while(true) {
System.out.println("等待客戶端鏈接。。。。。。");
Socket socket =server.accept();//accept():接受客戶端的鏈接請求,並返回一個套接字
System.out.println("一個客戶端連接了!");
/*
* Socket提供的方法:InputStream getInputStream()
* 經過Socket獲取的輸入流讀取的字節是來自 遠端計算機發送過來的字節。
*/
InputStream in = socket.getInputStream();
//將字節轉換爲字符
InputStreamReader isr= new InputStreamReader(in,"UTF-8");
BufferedReader br= new BufferedReader(isr);//塊讀,而且能夠按行讀取字符串get
String message = null;//聲明字符串message,初始化呢爲空
/*
* 經過BufferedReader讀取客戶端發送過來的一行字符串這個操做中,當客戶端斷開鏈接時,
* 因爲 客戶端系統不一樣,服務端這裏的表現也不相同:
* windows客戶端斷開時,readLine方法會直接拋出異常
* linux客戶端斷開鏈接時,readLine方法會返回 爲null
*/
while((message = br.readLine())!=null) {
System.out.println("來自客戶端的消息說:"+message);//控制檯打印消息
}
}
} catch (Exception e) {
e.printStackTrace();//輸出錯誤堆棧信息,有助於定位並解決錯誤
}
}
public static void main(String[] args) {
//實例化一個server端
Server server = new Server();
server.start();//調用方法
}
}