java networking. outline networking what is socket inetaddress 類別 url 類別 tcp socket socket...

41
JAVA NETWORKING

Upload: branden-underwood

Post on 19-Jan-2018

243 views

Category:

Documents


0 download

DESCRIPTION

NETWORK TCP/IP network protocal physical layer InterNet (Peer to Peer) Protocol interfaces

TRANSCRIPT

Page 1: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

JAVANETWORKING

Page 2: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

Page 3: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

NETWORK

TCP/IP network protocal

physical layer physical layer InterNet

(Peer to Peer) Protocol

interfaces

Page 4: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

SOCKET• process sends/receives messages to/from its socket

• socket analogous to door– sending process shoves message out door

– sending process relies on transport infrastructure on other side of door which brings message to socket at receiving process

process

TCP withbuffers,variables

socket

host

process

TCP withbuffers,variables

socket

server

Internet

controlledby OS

controlled byapp developer

Page 5: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

Berkeley UNIX 提出 Socket 的概念,將網路連線簡化為資料流( data stream )的概念,這個資料流在客戶端與伺服端各有一個接口( port ),而資料流就像是在一個連接兩接口的纜線中傳遞,程式設計人員使用 Socket 的概念來撰寫網路連線程式,只要處理主機資訊與連接埠,而不用關心底層的瑣碎運作。 Socket 將網路連線也視作一種輸出入的動作,資料的傳遞就像是將資料寫入與讀入。

SOCKET

Page 6: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

JAVA.NET

java.net這個 package 底下,也提供了類似socket的類別,讓我們不必處理底層網路的東西。

Java.net.InetAddress Java.net.socket Java.net.ServerSocket Java.net.DatagramSocket

Page 7: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

IP (Internet Protocol) address that can exist in two forms: DNS form: www.cs.nccu.edu.tw IP form: 140.119.162.53

Page 8: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

INETADDRESS 類別 可用來包裝與進行網址處理的相關操作 InetAddress 主要包括兩個欄位,即名稱與位址,名稱即像是 www.cs.nccu.edu.tw 這樣的名稱, 而位址則是 IP 位址,我們可以使用 getHostName()與 getHostAddress() 方法分別取得這兩個資訊。

Page 9: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

以下幾種靜態方法傳回 InetAddress 物件: public static InetAddress InetAddress.getLocalHost() 

public static InetAddress InetAddress.getByName(String hostname) 

public static InetAddress[] InetAddress.getAllByName(String hostname)

INETADDRESS 類別

Page 10: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

INETADDRESS 類別

Page 11: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

執行結果 :www.cs.nccu.edu.tw/140.119.162.53

String host = "www.cs.nccu.edu.tw";try {

InetAddress address = InetAddress.getByName(host);

System.out.println(address);} catch (UnknownHostException e) {

System.out.println("Could't find"+host);}

INETADDRESS 類別

Page 12: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

URL 類別 URL 類別可以提供 URL( Uniform Resource Locator) 的 Protocol、 Host、 Port、 File、 named

anchor與 URLStreamHandler 等資訊 URL 的建構有以下方法 :

public URL(String url)  public URL(String protocol, String host, String file)  public URL(String protocol, String host, int port, String

file)  public URL(URL u,String s)

Page 13: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

URL 類別可以由以下幾個方法取得資訊: public String getProtocol()  public String getHost()  public int getPort()  public String getFile()  public String getRef()

URL 類別有三個方法可以取得指定的 URL 資料: public final InputStream openStream()  public URLConnection openConnection()  public final Object getContent()

URL 類別

Page 14: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket
Page 15: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

TCP & UDP

TCP (Transmission Control Protocol) is a connection-based protocol that provides a reliable flow of data between two computers.

=>java.net.Socket

UDP (User Datagram Protocol) is a protocol that sends independent packets of data, called datagrams, from one computer to another with no guarantees about arrival. UDP is not connection-based like TCP.

=>java.net.DatagramSocket

Page 16: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

TCP SOCKET Interface

SocketImplFactory SocketOptions

Class java.net.ServerSocket java.net.Socket java.net.SocketImpl

Exception java.net.BindException java.net.ConnectException java.net.NoRouteToHostException java.net.ProtocolException java.net.SocketException

ServerSocket

accept

close

Socket

closeServer Client

write

read write

read

Page 17: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

JAVA.NET.SOCKET

Socket的建構有以下方法: public Socket(String host, int port) public Socket(InetAddress host, int port)  public Socket(String host, int port, InetAddress

interface, int localPort)  public Socket(InetAddress host, int port,

InetAddress interface, int localPort)

 

Page 18: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

在建立了 Socket 物件之後,可以取得 Socket 物件的相關資訊,例如:取得 Socket 連接對象位址 public InetAddress getInetAddress() 取得連接對象連接埠 public int getPort() 取得本機連接埠 public int getLocalPort() 取得本機位址 public inetAddress getLocalAddress()

JAVA.NET.SOCKET

Page 19: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

JAVA.NET.SERVERSOCKET

實作一個伺服器,可以使用 ServerSocket 類別,它包括了伺服器傾聽與客戶端連線的方法 ServerSocket的建構有以下方法:

public ServerSocket(int port)  public ServerSocket(int port, int

queuelength)  public ServerSocket(int port, int queuelength,

InetAddress bindAddress) port 是所指定要繫結的連接埠, queuelength 用來指定外來連線的佇列長度, bindAddress 指定要繫結至哪一個網路介面

Page 20: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

當要傾聽連線或關閉連線時,可以使用 accept()與close() 方法: public Socket accept()  public void close() 

accept() 傳回的是有關連線客戶端的 Socket 物件資訊,可以用它來取得客戶端的連線資訊,或關閉客戶端的連線。

JAVA.NET.SERVERSOCKET

Page 21: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

import java.io.IOException;import java.net.*;

public class SimpleServer {public static void main(String[] args) {

int listenPort = 8888;ServerSocket serverSocket = null;Socket clientSocket = null;

try {serverSocket = new ServerSocket(listenPort);// build a ServerSocket for listening the connection on port 8888System.out.println("the serversocket information:"

+ serverSocket.getLocalSocketAddress());System.out.println("wait to client....");clientSocket = serverSocket.accept();System.out.println("the client information:"

+ clientSocket.getRemoteSocketAddress());} catch (IOException e) {

System.out.println("some error:" + e.getMessage());}

}}

accept得到已建立連線的 socket 。

Page 22: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

import java.io.*;import java.net.Socket;import java.net.UnknownHostException;

public class SimpleClient {

public static void main(String[] args) {

String serverIP = "127.0.0.1";int serverPort = 8888;

try { Socket socket = new Socket(serverIP, serverPort);

System.out.println("client information:"+socket.getLocalSocketAddress()); System.out.println("Server information:"+socket.getRemoteSocketAddress()); socket.close();

} catch (UnknownHostException e) { System.out.println("Error:"+e.getMessage());

} catch (IOException e) { System.out.println("Error:"+e.getMessage());

}

}

}

與 Server連線的Socket

Page 23: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

SOCKET I/O 如果要取過 Socket 物件接受或輸出資訊,可以使用

getInputStream()與 getOutputStream() 兩個方法,就如同檔案 I/O 一樣,只要將它當作串流資料來處理即可。 public InputStream getInputStream() throws IOException

public OutputStream getOutputStream() throws IOException

可以再用 bufferedReader, bufferedWriter 包裝

Page 24: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

GETINPUTSTREAM() getInputStream 用以取得所連結的輸入資料流( Input

Stream),並以 java.io.InputStream 形式表示,通常會以DataInputStream或 BufferedReader 類別承接InputStream 資料流。 java.io.DataInputStream java.io.BufferedReader

DataInputStream din = new DataInputStream(socket.getInputStream());

BufferedReader bufin = new BufferedReader(new InputStreamReader(socket.getInputStream()));

Page 25: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

當輸入資料流建立之後,便可使用輸入資料流的 read 方法,讀取對方傳送來的資訊。DataInputStream: read readByte readChar readDouble readFloat readFully readInt readUTF ……

BufferedReader: read readLine

String inData = din.readUTF();

05/08/2325

String str = bufin.readLine();

GETINPUTSTREAM()

Page 26: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

GETOUTPUTSTREAM() 欲傳送資料至對方,需先以 getOutputStream 取得輸出資料流( Output Stream),此方法會以

java.io.OutputStream 形式表示,通常會以DataOutputStream、 BufferedWriter或 PrintStream 類別轉承 OutputStream 資料流: java.io.DataOutputStream java.io.BufferedWriter java.io.PrintStreamPrintStream out = new PrintStream(socket.getOutputStream());

DataOutputStream dout = new DataOutputStream(clientSocket.getOutputStream());

Page 27: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

當輸出資料流建立之後,便可使用輸出資料流的 write 方法,傳送資料至 Client 端。DataOutputStream: write writeBoolean writeByte writeBytes writeChar writeChars writeInt writeUTF ……

Bufferedwriter: write

PrintStream: println(String)

out.println(“Hello World”);

05/08/2327

dout.writeUTF(“Hello World”);

GETOUTPUTSTREAM()

Page 28: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

使用 OUTPUTSTREAM 送完一個字串後,請加 flush()這個方法,避免還留在 buffer裡頭。out.flush();

當不用時,請加 close()關閉來釋放資源。out.close();

05/08/2328

Page 29: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

Example:

client傳送字串給 server

server會回傳字串給 client。

SOCKET I/O

Page 30: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

import java.io.*;import java.net.*;

public class EchoTCPServer {public static void main(String[] args) {

int listenPort = 8888;ServerSocket serverSocket = null;Socket clientSocket = null;try { serverSocket = new ServerSocket(listenPort); System.out.println("wait to client...."); clientSocket = serverSocket.accept(); PrintStream out = new

PrintStream(clientSocket.getOutputStream()); BufferedReader in = new BufferedReader(new

InputStreamReader(clientSocket.getInputStream()));

String str = in.readLine(); System.out.println("the client comes message :" +

str); out.println(str);// 送回同樣的字串給 client out.flush(); out.close(); in.close(); clientSocket.close();

} catch (IOException e) { System.out.println("some error:" + e.getMessage()); }

}}

Page 31: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

import java.io.*;import java.net.Socket;import java.net.UnknownHostException;

public class SimpleClient {public static void main(String[] args) {

String serverIP = "127.0.0.1";// 或是 "localhost"int serverPort = 8888;try {

Socket socket = new Socket(serverIP, serverPort);

PrintStream out = new PrintStream(socket.getOutputStream());BufferedReader in = new BufferedReader(new

InputStreamReader(socket.getInputStream()));System.out.println("please key the message

to server: ");BufferedReader fromUser = new

BufferedReader(new InputStreamReader(System.in));

out.println(fromUser.readLine());out.flush();

Page 32: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

String str = in.readLine();System.out.println("the server comes message

: " + str);

out.close();in.close();

socket.close();

} catch (UnknownHostException e) {

System.out.println("Error:"+e.getMessage()); } catch (IOException e) {

System.out.println("Error:"+e.getMessage());

}

}

}

Page 33: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

CONCURRENT SERVER SOCKET

前面的 EchoTCPServer 只能處理一個 client ,所以當有很多 client同時向 Server 連線時,就無法處理了。為了要處理多人連線,我們的 Server 端程式就要用執行緒( Thread )為每一個 Client 端建立各自的執行緒,來處理每個要求。

Page 34: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

CONCURRENT SERVER SOCKET

Page 35: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

public class ConcurrentServer {

public static void main(String[] args) throws IOException {

int listenPort = 8888;ServerSocket serverSocket = null;Socket clientSocket = null;

try {

serverSocket = new ServerSocket(listenPort);// build a ServerSocket// for listening the// connection on port// 8888System.out.println("the server information:"+ serverSocket.getLocalSocketAddress());

Thread thread = null;while (true) {

System.out.println("wait to client....");clientSocket = serverSocket.accept();thread = new Thread(new ServerThread(clientSocket));thread.start();}

} catch (IOException e) {System.out.println("some error:" + e.getMessage());

} }

}

Page 36: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

class ServerThread implements Runnable {

Socket clientSocket = null;PrintStream out = null;BufferedReader in = null;

public ServerThread(Socket s) {this.clientSocket = s;}

public void run() {System.out.println("the client information :"+ clientSocket.getRemoteSocketAddress());

try {out = new PrintStream(clientSocket.getOutputStream());in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));String str = in.readLine();System.out.println("client comes message:" + str);out.println("I am Server");out.flush();out.close();in.close();clientSocket.close();

} catch (IOException e) {System.out.println("Error:"+e.getMessage());}

}}

Page 37: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

UDP SOCKET Interface

DatagramSocketImplFactory Class

java.net.DatagramPacket java.net.DatagramSocket java.net.DatagramSocketImpl java.net.MulticastSocket

Exception java.net.SocketException

DatagramSocket

DatagramPacket

close

receive

send

Page 38: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

與 TCP的 socket不同, UDP的 socket只有DatagramSocket。

而傳送資訊的方式也大不相同,它是把資訊封裝在DatagramPacket,再把這個 packet傳送出去。

DatagramSocket 也可以在廣播 ip 中發送廣播

UDP SOCKET

Page 39: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

Encapsulation of data(packet) to be received/transmitted and related information.

// for receiving packets DatagramPacket(byte[] data [ [, int offset] , int length]) // for sending packets DatagramPacket(byte[] data [ [, int offset], int length], InetAddress ia ,int port )

UDP SOCKET

Page 40: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

import java.io.*;import java.net.*;

public class UDPClient {public static void main(String args[]) throws Exception {

int portNo = 8888;BufferedReader uip = new BufferedReader( new InputStreamReader(System.in));InetAddress addr = InetAddress.getByName("localhost");System.out.print("please key the message to server :");String msg = uip.readLine();

byte buffer[] = new byte[256];buffer = msg.getBytes();DatagramPacket packet = new DatagramPacket( buffer, buffer.length, addr,portNo);DatagramSocket socket = new DatagramSocket();DatagramPacket dp = new DatagramPacket(new byte[256],

256);socket.send(packet);try {

socket.receive(dp);String s = new String(dp.getData(), 0,

dp.getLength());System.out.println("the server comes message : ["

+ s + "]");} catch (IOException ex) {

System.err.println(ex);}socket.close();

}}

receive

send

Page 41: JAVA NETWORKING. OUTLINE Networking What is Socket InetAddress 類別 URL 類別 TCP socket Socket I/O UDP socket

import java.io.IOException;import java.net.*;

public class EchoUDPServer {static final int BUFFERSIZE = 256;public static void main(String[] args) {

DatagramSocket sock;DatagramPacket pack = new DatagramPacket(

new byte[BUFFERSIZE],BUFFERSIZE);try {

sock = new DatagramSocket(8888);} catch (SocketException e) {

System.out.println(e);return;}// echo back everythingtry {

sock.receive(pack);sock.send(pack);

} catch (IOException ioe) {System.out.println(ioe);

}sock.close();

}}