Java的TCP網絡編程


服務端代碼:

package socket;

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 小明
 *
 */
public class Server {
    /**
     * 運行在服務端的ServerSocket主要有兩個作用:
     * 1:向系統申請服務端口,客戶端就是通過這個端口與服務端建立連接的。
     * 2:監聽服務端口,一旦客戶端與服務端建立連接,就會
     * 自動創建一個Socket,並通過該Socket與建立連接的
     * 客戶端進行交互。
     * 
     */
    private ServerSocket server;
    
    public Server()
    {
        try{
            /**
             * 實例化ServerSocket的同時要指定向系統申請的服務端口。注意,該端口
             * 不能與當前系統其它應用程序申請的端口號一致,
             * 否則會拋出端口被占用的異常。
             */
            System.out.println("正在啟動服務端...");
            server = new ServerSocket(8088);
            System.out.println("服務端啟動完畢!");
        }catch(Exception e){
            
        }
    }
    
    public void start()
    {
        try {
            System.out.println("等待客戶端連接");
            Socket socket = server.accept();
            /**
             * 准備接受客戶端連接
             * 
             * 這是一個阻塞方法。
             *一旦調用accpet()方法,服務端阻塞在這里,等着客戶端連接了。
             *這時當我們啟動客戶端時,客戶端實例化socket,通過IP找到應用程序。
             *這時accpet()馬上就會有反應。accpet()方法執行完就返回一個socket。
             *通過這個socket就可以與剛建立連接的這個客戶端進行通訊了。
             *客戶端創建一個socket,服務端通過accept()接收一個socket。
             *這時候就可以進行溝通了。
             * 需要處理異常。
             */
            InputStream in = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(in);
            BufferedReader br = new BufferedReader(isr);
            String message = br.readLine();
            System.out.println("客戶端說:" + message);
            
            System.out.println("一個客戶端連接了");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
    public static void main(String[] args) {
        Server server = new Server();
        server.start();
    }
    
}

需要先啟動服務器端,客戶端才啟動。

服務端運行后,accept()方法hi引起程序的阻塞。

客戶端代碼:

package socket;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 聊天室客戶端
 * @author 小明
 *
 */
public class Client {
    /**
     * 套接字
     * 封裝了TCP協議的通信細節,讓我們可以簡單地使用它完成TCP通訊
     * Socket連接后提供了兩條流,通過兩條流的讀寫操作完成與遠端計算機的數據連接
     * 完成與遠端計算機的數據交換。
     */
    private Socket socket;
    /**
     * 用來初始化客戶端
     */
    public Client()
    {
        try {
            /**
             * 實例化Socket時需要傳入兩個參數:
             * 1:服務端的IP地址
             * 2:服務端的端口號
             * 通過IP地址可以找到服務端所在的計算機
             * 通過端口可以找到運行在服務端計算機上的
             * 服務端應用程序
             * 注意,實例化Socket的過程就是連接的過程,若
             * 連接失敗就會拋出異常。
             */
            System.out.println("正在連接服務端...");
            socket = new Socket("localhost", 8088);
            System.out.println("與服務端建立連接!");
            
            /**
             * 有兩個參數,一個是IP地址,一個是端口號
             */
            /**
             * 所有應用程序在使用網絡的時候都要和操作系統申請一個網絡端口
             * 
             */
            /**
             * 異常要我們自己進行處理,不要拋出
             */
        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
    /**
     * 寫程序時不要過度依賴main方法
     * 客戶端開始工作的方法
     */
    public void start()
    {
        try{
            //socket.getOutputStream();
            PrintWriter pw = new PrintWriter(
            new BufferedWriter(
            new OutputStreamWriter(
            socket.getOutputStream())), true);
            //pw.write("你好服務端");
            //使用上面這條語句是錯的,要使用具有自動行刷新的方法
            //不要再下意識地寫上面那條語句了
            pw.println("你好服務端!");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        Client client = new Client();
        
        client.start();
        
    }
}

 

建立第二個服務端時,發信息給服務端時沒有反應。

因為只調用了一次accept()方法,所以接收不到信息。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM