JAVA的Socket編程初步

1.服務器端啓動ServerSocket
2.客戶端使用Socket
3.客戶端與服務器端使用流通信
4.服務器端啓動多線程,accept函數爲阻塞接收,將接收到的socket對象開闢新的線程處理

程序結構
這裏寫圖片描述
對應客戶端程序,服務器端程序,線程處理程序

package com.houlu.socket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientPart {

    public static void main(String[] args){
        try {
            //1.創建客戶端Socket,指定服務器地址和端口號
            Socket socket = new Socket("localhost", 8888);
            //2.獲取輸出流
            OutputStream os = socket.getOutputStream();//字節輸出流
            OutputStreamWriter osw = new OutputStreamWriter(os); //字符流
            BufferedWriter bw = new BufferedWriter(osw);
            bw.write("用戶名:admin;密碼:123");
            bw.flush();
            socket.shutdownOutput();
            //3.獲取輸入流,讀取服務器端響應
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String receiveStr = null;
            while((receiveStr=br.readLine())!=null ){
                System.out.println("我是客戶端,服務器說:"+receiveStr);
            }
            //4.關閉輸出流,打開的資源
    //      socket.shutdownInput();
            socket.close();
            br.close();
            isr.close();
            is.close();
            bw.close();
            osw.close();
            os.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
package com.houlu.socket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerPart {

    public static void main(String[] args){
        try {
            //1.創建一個服務器端的SOCKET,綁定相應端口,監聽此端口
            ServerSocket serverSocket = new ServerSocket(8888);
            //2.調用accept()方法開始監聽,等待客戶端連接
            Socket socket = null;
            System.out.println("***服務器即將啓動,等待客戶端連接***");
            //3.統計連接客戶端數量
            int count=0;
            while(true){
                socket = serverSocket.accept();
                ServerThread serverThread = new ServerThread(socket);
                serverThread.start();
                count++;
                System.out.println("客戶端數量爲"+count);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
package com.houlu.socket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;

public class ServerThread extends Thread{

    private Socket socket;

    public ServerThread(Socket socket) {
        super();
        this.socket = socket;
    }

    @Override
    public void run() {
        InputStream is=null;
        InputStreamReader isr =null;
        BufferedReader br = null;
        String receiveStr = null;
        OutputStream os = null; 
        OutputStreamWriter osw = null;
        BufferedWriter bw = null; 
        try {
            InetAddress address = socket.getInetAddress();
            System.out.println("當前客戶端連接地址"+address.getHostAddress());

            //1.獲取輸入流,讀取客戶端信息
            is = socket.getInputStream();
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);

            System.out.println("服務器開始接收");
            while((receiveStr=br.readLine())!=null ){
                System.out.println("我是服務器,客戶說:"+receiveStr);
            }
            System.out.println("服務器接受結束");
        //  socket.shutdownInput();//關閉輸入流

            //2.獲取輸出流,響應客戶端請求
            os = socket.getOutputStream();
            osw = new OutputStreamWriter(os);
            bw = new BufferedWriter(osw);
            bw.write("歡迎您連接");
            bw.flush();
        //  socket.shutdownOutput();
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally{
            try {
                if(bw!=null)
                    bw.close();
                if(osw!=null)
                    osw.close();
                if(os!=null)
                    os.close();
                if(br!=null)
                    br.close();
                if(isr!=null)
                    isr.close();
                if(is!=null)
                    is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

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