1. 程式人生 > >java 網路程式設計-java(6)

java 網路程式設計-java(6)

前言

計算機網路中學到了tcp/ip協議,重新拾起去年的java課本,學一學網路程式

正文

主要熟悉一下常用的有關網路的類,以及寫寫小程式實踐一下。

套接字

當兩個程式需要通訊時,可以使用Socket類建立套接字連線在一起。套接字包含了IP地址和埠號。埠號是0~65535之間的一個整數,0~1023被預先定義的服務通訊佔用,所以要選用1024~65535之間的整數。

客戶端Socket

  • 帶引數構造方法
Socket mySocket = new Socket(String host, int port);

獲得socket物件後,可以使用getInputStream()

getOutputStream()獲得輸入流,輸出流用來寫,讀資料。

  • 不帶引數構造方法
Socket mySocket = new Socket();

通過connect(ScoketAddress socketAddress)連線。可以使用ScoketAddress子類InetSocketAddress物件。InetSocketAddress構造方法為

InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress inetAddress,int port)

使用者端ServerSocket

通過ServerSocket物件可以獲得一個Socket物件,用於連線客戶端。其構造方法為:

ServerSocket serverForClicent = new ServerSocket(int port);

通過accept()獲得Socket物件。
編寫一個例子:
Client.java

package javanet;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {
    public static void main(String args[]) {
        String[] mess = {"1+1在什麼情況下等於2", "狗為什麼不生跳蚤", "什麼東西能吃能看能做"};
        Socket mySocket = new Socket();
        DataInputStream in = null;
        DataOutputStream out = null;
        try {
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            InetSocketAddress inetSocketAddress = new InetSocketAddress(inetAddress, 2010);
            mySocket.connect(inetSocketAddress);
            in = new DataInputStream(mySocket.getInputStream());
            out = new DataOutputStream(mySocket.getOutputStream());
            for (int i=0;i<mess.length;i++) {
                out.writeUTF(mess[i]);
                String s = in.readUTF();
                System.out.println("客戶收到伺服器回答: "+s);
                Thread.sleep(5000);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

Server.java

package javanet;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String args[]) {
        String[] answer = {"在算錯的情況下", "狗就能生狗", "電視麵包沙發"};
        ServerSocket serverForClicent = null;
        Socket socketOnServer = null;
        DataOutputStream out = null;
        DataInputStream in = null;
        try {
            serverForClicent = new ServerSocket(2010);
            socketOnServer = serverForClicent.accept();
            in = new DataInputStream(socketOnServer.getInputStream());
            out = new DataOutputStream(socketOnServer.getOutputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
        for (int i=0;i<answer.length;i++) {
            if (socketOnServer!=null) {
                try {
                    System.out.println("伺服器收到客戶問題: "+in.readUTF());
                    out.writeUTF(answer[i]);

                } catch (Exception e) {
                    e.printStackTrace();

                }
            }
        }
    }
}

UDP資料報

套接字是基於socket的網路通訊,是有連線的。通過connect()accept()連線,通過流來傳輸資料。UDP資料傳輸更快,但是無法確定資料是否到達目的主機,不提供可靠性保證。
UDP通訊基本模式為:

  • 資料打包,傳送資料包
  • 接收資料包並檢視

傳送資料包

DatagramPacket類將資料打包成資料包,DatagramSocket類傳送資料包

InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
DatagramPacket datagramPacket = new DatagramPacket(data, data.length, inetAddress, 2009);
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.send(datagramPacket);

接收資料包

DatagramSocket類接收資料包後並封裝在DatagramPacket物件中

DatagramSocket datagramSocket = new DatagramSocket(2009);
DatagramPacket datagramPacket = new DatagramPacket(data, len);
datagramSocket.receive(datagramPacket);

具體寫一個例子
Myhost.java傳送資料包

package udptest;

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

public class Myhost {
    public static void main(String args[]) {
        byte[] data = "今天是週日".getBytes();
        try {
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            DatagramPacket datagramPacket = new DatagramPacket(data, data.length, inetAddress, 2009);
            DatagramSocket datagramSocket = new DatagramSocket();
            datagramSocket.send(datagramPacket);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Youhost.java接收資料包

package udptest;


import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Youhost {
    public static void main(String args[]) {
        byte[] data = new byte[100];
        int len = 90;
        try {
            DatagramSocket datagramSocket = new DatagramSocket(2009);
            DatagramPacket datagramPacket = new DatagramPacket(data, len);
            datagramSocket.receive(datagramPacket);
            String me = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
            System.out.println(me);
            System.out.println(datagramPacket.getAddress());
            System.out.println(datagramPacket.getPort());
            System.out.println(datagramPacket.getSocketAddress());

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}