【代碼練習5】使用套接字實現客戶端和服務器的數據傳輸

套接字練習

服務器端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;


public class ServerTest {
    public static void main(String[] args) throws IOException {
        // 創建綁定到特定端口的服務器套接字,ServerSocket類基於請求執行某些操作;
        ServerSocket ss = new ServerSocket(6666/*接受端口,與發送端端口一致*/);
        System.out.println("等待連接。。。。。。");

        for (;;){
            //偵聽並接收此套接字的連接,accept方法在連接傳入之前一直阻塞。
            // 在for循環中accept和一個ip地址建立一個連接後,就會繼續偵聽下一個地址的連接。
            Socket socket = ss.accept();
            //連接成功後,獲取對方ip地址的字符串
            String remoteIp = ((InetSocketAddress)socket.getRemoteSocketAddress()).getAddress().getHostAddress();
            //獲取對方端口
            int remotePort = ((InetSocketAddress)socket.getRemoteSocketAddress()).getPort();

            //在控制檯打印出對方地址
            System.out.println(remoteIp + ":" + remotePort +"連接進來了!!");
            //開啓一個通信的線程
            new CommThread(remoteIp,remotePort,socket).start();
        }

    }
    //創建一個通信線程
    static class CommThread extends Thread{
        private String ip;
        private int port;
        private Socket sock;

        public CommThread(String ip, int port,Socket sock) {
            this.ip = ip;
            this.port = port;
            this.sock = sock;
        }
        public void run(){
            //獲取套接字地址的輸入流
            InputStream in = null;

            try {
                in =  sock.getInputStream();

                //將字節流強轉成字符流,按行讀取
                BufferedReader br = new BufferedReader(new InputStreamReader(in));
                String line  = "";
                while ((line = br.readLine()) != null){
                    System.out.println(ip + ":" + port + "說:" + line);//
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

客戶端

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;


public class SenderTest {
    public static void main(String[] args) throws IOException {
        //創建客戶端套接字
        Socket sock = new Socket("localhost"/*客戶端ip地址*/, 6666/*發送端口,與接受端口號一致*/);
        // 獲取此套接字的輸出流。
        OutputStream os = sock.getOutputStream();

        //創建一種循環發送消息的方法
        for(int index = 1;;index++){

            //數據報包傳輸的是字節數組,所以輸出流爲字節數組;
             /*os.write(("重要的事情說" + index + "遍").getBytes());//因爲服務器端輸入流是按行讀取,所以如
              *果定義的傳輸內容不含換行符,則服務器端br.readLine()會一直阻塞直到讀取到換行符語句纔會繼續向下執行*/
            os.write(("重要的事情說" + index + "遍"+"\r\n").getBytes());
            os.flush();
            /*DatagramPacket packet = new DatagramPacket();//自己第一次默寫的時候還想建立一個數據報包,
            * 但同學提醒我說,TCP傳輸已經建立數據流連接,不需要報包傳輸,所以只要將傳輸的字節寫入流就行了*/
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章