socket網絡編程基礎示例

一.Socket的基礎知識
1.socket的位置作用與典型的TCP/IP模型結構

2.socket的分類(原始式套接字、流式套接字、數據報式套接字)
socket分類
二、TCP編程示例

package com.socket;
import java.io.Serializable;
/**
 * 序列化對象實體類
 * @author xue
 *
 */
public class Person implements Serializable {
    private String account;
    private String pwd;
    public String getAccount() {
        return account;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}
package com.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
/**
 *  多線程實現服務器與多客戶端之間的通信
 */
public class ThreadSocket extends Thread {
    protected Socket socket=null;
    public ThreadSocket(Socket socket){
        this.socket=socket;
    }
    public void run() {
        try {
            /*
             * 讀取信息
             */
            InputStream is=socket.getInputStream();//獲取輸入流
            ObjectInputStream obj=new ObjectInputStream(is);//對象流輸入
            try {
                Person p=(Person) obj.readObject();
                //用戶信息
                System.out.println("用戶賬號:"+p.getAccount()+"----------"+"用戶密碼:"+p.getPwd());
                InetAddress address=socket.getInetAddress();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            socket.shutdownInput();//關閉輸入流
            /*
             * 給客戶端返回信息
             */
            OutputStream os=socket.getOutputStream();
            PrintWriter pw=new PrintWriter(os);
            pw.write("歡迎用戶的到來.....");
            pw.flush();
            socket.shutdownOutput();
            is.close();
            pw.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
package com.socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/*
 * socket服務器
 */
public class Server {
    public static void main(String[] args) {
        getConn();
    }
    public static void getConn(){
        try {
            ServerSocket serverSocket=new ServerSocket(10086);//創建一個socket
            Socket socket=null;
            /*
             * 起用多線程監聽
             */
            int i=0;//用於統計有幾個用戶訪問該服務器
            while(true){
                //循環調用accept()等待客戶端連接
                socket=serverSocket.accept();
                ThreadSocket threadSocket=new ThreadSocket(socket);
                threadSocket.start();
                i++;
                System.out.println("一共有:"+i+"個人訪問該服務器");
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
/*
 * socket客戶端
 */
public class Client {
    public static void main(String[] args) {
        getConn();
    }
    public static void getConn(){
        try {
            Socket socket=new Socket("127.0.0.1",10086);
            /*
             * 發信息至服務器
             */
            OutputStream os=socket.getOutputStream();
            ObjectOutputStream oos=new ObjectOutputStream(os);
            Person p=new Person();
            p.setAccount("123445");
            p.setPwd("abcd");
            oos.writeObject(p);
            /*
             * 返回信息給服務端
             */
            InputStream is=socket.getInputStream();
            InputStreamReader isr=new InputStreamReader(is);
            BufferedReader br=new BufferedReader(isr);
            String replyInfo=null;
            while((replyInfo=br.readLine())!=null){
                System.out.println("客戶端讀取服務端發來的消息:"+replyInfo);
            }
            oos.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

通信流程:
通信的大概流程
多線程連接

三、UDP編程
1.UDP概述:
這裏寫圖片描述
2.示例

package com.socket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/**
 * UDP網絡編程
 */
public class UDPServer {
    public static void main(String[] args) {
        getUDPClientConn();

    }
    /*
     * 與客戶端進行通信
     */
    public static void getUDPClientConn(){
        try {
            //====================獲取客戶端發來的信息 =====================//
            //創建服務器端DatagramSocket,指定端口
            DatagramSocket socket=new DatagramSocket(10086);
            byte [] datagram=new byte[1024];
            //創建數據報,用於接受客戶端發送的數據
            DatagramPacket packetFromClient=new DatagramPacket(datagram, datagram.length);
            //接收客戶端發送的數據,此方法之前會發生阻塞
            socket.receive(packetFromClient);
            //獲取數據
            String info=new String(datagram, 0, datagram.length);
            System.out.println("客戶端發來了信息:"+info);

            //===================向客戶端響應發送信息====================//
            InetAddress address=packetFromClient.getAddress();//客戶端地址
            int port=packetFromClient.getPort();
            byte[] sendInfo="服務端返回信息:歡迎你".getBytes();//返回信息
            DatagramPacket packetToClient=new DatagramPacket(sendInfo, 0, sendInfo.length, address, port);
            socket.send(packetToClient);
            socket.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
package com.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
 * UDP網絡編程客戶端
 */
public class UDPClient {
    public static void main(String[] args) {
        getUDPServerConn();
    }
    public static void getUDPServerConn(){
        //================客戶端發送信息至服務器====================//
        try {
            InetAddress address=InetAddress.getByName("127.0.0.1");//服務器地址
            int port=10086;
            byte[] dataToServer="客戶端請求連接服務端".getBytes();
            DatagramPacket sendToServerPacket=new DatagramPacket(dataToServer, dataToServer.length, address, port);
            DatagramSocket socket=new DatagramSocket();
            socket.send(sendToServerPacket);
       //=================獲取服務端發過來的信息==================//
            byte[]dataFromServer=new byte[1024];
            DatagramPacket dataFromServerPacket=new DatagramPacket(dataFromServer, 0, dataFromServer.length);
            socket.receive(dataFromServerPacket);
            String info=new String(dataFromServer,0,dataFromServer.length);
            System.out.println("服務端發來的信息:"+info);
            socket.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

四、其他內容
1. InetAddress類用於標識網絡上的硬件資源,標識互聯網協議(IP)地址。
2. URL(Uniform Resource Locator)統一資源定位符,表示Internet上某一資源的地址,協議名:資源名稱
3. 示例:

package com.socket;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
/**
 * 1.InetAddress類用於標識網絡上的硬件資源,標識互聯網協議(IP)地址。 
 * 2.通過URL對象的openStream()方法可以得到指定資源的輸入流,通過流能夠讀取或訪問網頁上的資源
 */
public class SocketServer {
    public static void main(String[] args) {
        getLocalHost();
        getWebDateByUrl();
    }
    public static void getLocalHost(){
        try {
            //本地主機信息
            InetAddress address=InetAddress.getLocalHost();
            System.out.println("本地IP地址:"+address.getHostAddress());//Ip地址
            System.out.println("本地主機名:"+address.getHostName());//計算機名
            //其他主機信息
            InetAddress otherAddress=InetAddress.getByName("172.18.233.1");
            System.out.println(otherAddress.getHostName());

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    /*
     * 通過URL讀取網頁內容
     */
    public static void getWebDateByUrl(){
        try {
            URL url=new URL("http://www.baidu.com");
            InputStream is=url.openStream();//通過openStream獲取輸入流
            InputStreamReader isr=new InputStreamReader(is, "UTF-8");//輸入流轉爲字符流
            BufferedReader br=new BufferedReader(isr);//加入緩衝區
            String data=br.readLine();
            String html="";
            FileOutputStream fos=new FileOutputStream(new File("D://baidu.html"));//寫到網頁文件
            while(data!=null){
                System.out.println(data);
                html+=data;
                data=br.readLine();
            }
            fos.write(html.getBytes("UTF-8"));
            is.close();
            isr.close();
            br.close();
            fos.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
發佈了91 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章