Bài giảng Công nghệ Java - Chương 13: Java Socket Programming - Trần Quang Diệu
Java Sockets Programming
• The package java.net provides support for
sockets programming (and more).
• Typically you import everything defined in this
package with:
import java.net.*;
InetAddress class
• static methods you can use to create new
InetAddress objects.
– getByName(String host)
– getAllByName(String host)
– getLocalHost()
InetAddress x = InetAddress.getByName(
“cse.unr.edu”);
Throws UnknownHostException
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Công nghệ Java - Chương 13: Java Socket Programming - Trần Quang Diệu", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Công nghệ Java - Chương 13: Java Socket Programming - Trần Quang Diệu
4/7/2018 1
CÔNG NGHỆ JAVA
CH14. JAVA SOCKET PROGRAMMING
Quang Dieu Tran PhD.
Java Sockets Programming
• The package java.net provides support for
sockets programming (and more).
• Typically you import everything defined in this
package with:
import java.net.*;
24/7/2018
Classes
InetAddress
Socket
ServerSocket
DatagramSocket
DatagramPacket
34/7/2018
InetAddress class
• static methods you can use to create new
InetAddress objects.
– getByName(String host)
– getAllByName(String host)
– getLocalHost()
InetAddress x = InetAddress.getByName(
“cse.unr.edu”);
Throws UnknownHostException
44/7/2018
Sample Code: Lookup.java
• Uses InetAddress class to lookup hostnames
found on command line.
> java Lookup cse.unr.edu www.yahoo.com
cse.unr.edu:134.197.40.9
www.yahoo.com:209.131.36.158
54/7/2018
try {
InetAddress a = InetAddress.getByName(hostname);
System.out.println(hostname + ":" +
a.getHostAddress());
} catch (UnknownHostException e) {
System.out.println("No address found for " +
hostname);
}
es
4/7/2018 6
Socket class
• Corresponds to active TCP sockets only!
– client sockets
– socket returned by accept();
• Passive sockets are supported by a different class:
– ServerSocket
• UDP sockets are supported by
– DatagramSocket
74/7/2018
JAVA TCP Sockets
• java.net.Socket
– Implements client sockets (also called just “sockets”).
– An endpoint for communication between two machines.
– Constructor and Methods
• Socket(String host, int port): Creates a stream socket and connects it to the specified port number
on the named host.
• InputStream getInputStream()
• OutputStream getOutputStream()
• close()
• java.net.ServerSocket
– Implements server sockets.
– Waits for requests to come in over the network.
– Performs some operation based on the request.
– Constructor and Methods
• ServerSocket(int port)
• Socket Accept(): Listens for a connection to be made to this socket and accepts it. This method
blocks until a connection is made.
84/7/2018
Sockets
9
Client socket, welcoming socket (passive) and connection socket (active)
4/7/2018
Socket Constructors
• Constructor creates a TCP connection to a named
TCP server.
– There are a number of constructors:
Socket(InetAddress server, int port);
Socket(InetAddress server, int port,
InetAddress local, int localport);
Socket(String hostname, int port);
104/7/2018
Socket Methods
void close();
InetAddress getInetAddress();
InetAddress getLocalAddress();
InputStream getInputStream();
OutputStream getOutputStream();
• Lots more (setting/getting socket options,
partial close, etc.)
114/7/2018
Socket I/O
• Socket I/O is based on the Java I/O support
– in the package java.io
• InputStream and OutputStream are abstract
classes
– common operations defined for all kinds of
InputStreams, OutputStreams
124/7/2018
InputStream Basics
// reads some number of bytes and
// puts in buffer array b
int read(byte[] b);
// reads up to len bytes
int read(byte[] b, int off, int len);
Both methods can throw IOException.
Both return –1 on EOF.
134/7/2018
OutputStream Basics
// writes b.length bytes
void write(byte[] b);
// writes len bytes starting
// at offset off
void write(byte[] b, int off, int len);
Both methods can throw IOException.
144/7/2018
ServerSocket Class (TCP Passive Socket)
• Constructors:
ServerSocket(int port);
ServerSocket(int port, int backlog);
ServerSocket(int port, int backlog,
InetAddress bindAddr);
154/7/2018
ServerSocket Methods
Socket accept();
void close();
InetAddress getInetAddress();
int getLocalPort();
throw IOException, SecurityException
164/7/2018
Socket programming with TCP
Example client-server app:
• client reads line from standard
input (inFromUser stream) ,
sends to server via socket
(outToServer stream)
• server reads line from socket
• server converts line to
uppercase, sends back to client
• client reads, prints modified
line from socket
(inFromServer stream)
17
o
u
tT
o
S
e
rv
e
r
to network from network
in
F
ro
m
S
e
rv
e
r
in
F
ro
m
U
se
r
keyboard monitor
Process
clientSocket
input
stream
input
stream
output
stream
TCP
socket
Input stream:
sequence of bytes
into processoutput stream:
sequence of bytes
out of process
Client
process
client TCP
socket
4/7/2018
Client/server socket interaction: TCP
18
wait for incoming
connection request
connectionSocket =
welcomeSocket.accept()
create socket,
port=x, for
incoming request:
welcomeSocket =
ServerSocket()
create socket,
connect to hostid, port=x
clientSocket =
Socket()
close
connectionSocket
read reply from
clientSocket
close
clientSocket
Server (running on hostid) Client
send request using
clientSocketread request from
connectionSocket
write reply to
connectionSocket
TCP
connection setup
4/7/2018
TCPClient.java
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(String argv[]) throws Exception
{
String sentence;
String modifiedSentence;
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("hostname", 6789);
DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());
4/7/2018 19
TCPClient.java
BufferedReader inFromServer =
new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
clientSocket.close();
}
}
204/7/2018
TCPServer.java
import java.io.*;
import java.net.*;
class TCPServer {
public static void main(String argv[]) throws Exception
{
String clientSentence;
String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new
InputStreamReader(connectionSocket.getInputStream()));
4/7/2018 21
TCPServer.java
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
}
}
}
224/7/2018
Sample Echo Server
TCPEchoServer.java
Simple TCP Echo server.
Based on code from:
TCP/IP Sockets in Java
234/7/2018
UDP Sockets
• DatagramSocket class
• DatagramPacket class needed to specify the
payload
– incoming or outgoing
244/7/2018
Socket Programming with UDP
• UDP
– Connectionless and unreliable service.
– There isn’t an initial handshaking phase.
– Doesn’t have a pipe.
– transmitted data may be received out of order, or lost
• Socket Programming with UDP
– No need for a welcoming socket.
– No streams are attached to the sockets.
– the sending hosts creates “packets” by attaching the IP destination
address and port number to each batch of bytes.
– The receiving process must unravel to received packet to obtain the
packet’s information bytes.
254/7/2018
JAVA UDP Sockets
• In Package java.net
– java.net.DatagramSocket
• A socket for sending and receiving datagram
packets.
• Constructor and Methods
– DatagramSocket(int port): Constructs a datagram socket
and binds it to the specified port on the local host
machine.
– void receive( DatagramPacket p)
– void send( DatagramPacket p)
– void close()
264/7/2018
DatagramSocket Constructors
DatagramSocket();
DatagramSocket(int port);
DatagramSocket(int port, InetAddress a);
All can throw SocketException or
SecurityException
274/7/2018
Datagram Methods
void connect(InetAddress, int port);
void close();
void receive(DatagramPacket p);
void send(DatagramPacket p);
Lots more!
284/7/2018
Datagram Packet
• Contain the payload
– (a byte array
• Can also be used to specify the destination
address
– when not using connected mode UDP
294/7/2018
DatagramPacket Constructors
For receiving:
DatagramPacket( byte[] buf, int len);
For sending:
DatagramPacket( byte[] buf, int len
InetAddress a, int port);
304/7/2018
DatagramPacket methods
byte[] getData();
void setData(byte[] buf);
void setAddress(InetAddress a);
void setPort(int port);
InetAddress getAddress();
int getPort();
314/7/2018
Example: Java client (UDP)
32
se
n
d
P
a
ck
e
t
to network from network
re
ce
iv
e
P
a
c
k
e
t
in
F
ro
m
U
se
r
keyboard monitor
Process
clientSocket
UDP
packet
input
stream
UDP
packet
UDP
socket
Output: sends
packet (TCP sent
“byte stream”)
Input: receives
packet (TCP
received “byte
stream”)
Client
process
client UDP
socket
4/7/2018
Client/server socket interaction: UDP
33
close
clientSocket
Server (running on hostid)
read reply from
clientSocket
create socket,
clientSocket =
DatagramSocket()
Client
Create, address (hostid, port=x,
send datagram request
using clientSocket
create socket,
port=x, for
incoming request:
serverSocket =
DatagramSocket()
read request from
serverSocket
write reply to
serverSocket
specifying client
host address,
port umber
4/7/2018
UDPClient.java
import java.io.*;
import java.net.*;
class UDPClient {
public static void main(String args[]) throws Exception
{
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("hostname");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
4/7/2018 34
UDPClient.java
DatagramPacket sendPacket =
new DatagramPacket(sendData, sendData.length, IPAddress,
9876);
clientSocket.send(sendPacket);
DatagramPacket receivePacket =
new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentence =
new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();
}
}
354/7/2018
UDPServer.java
import java.io.*;
import java.net.*;
class UDPServer {
public static void main(String args[]) throws Exception
{
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
while(true)
{
DatagramPacket receivePacket =
new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String(receivePacket.getData());
4/7/2018 36
UDPServer.java
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
String capitalizedSentence = sentence.toUpperCase();
sendData = capitalizedSentence.getBytes();
DatagramPacket sendPacket =
new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
}
}
}
374/7/2018
Sample UDP code
UDPEchoServer.java
Simple UDP Echo server.
Test using nc as the client (netcat):
> nc –u hostname port
384/7/2018
Socket functional calls
• socket (): Create a socket
• bind(): bind a socket to a local IP address and port #
• listen(): passively waiting for connections
• connect(): initiating connection to another socket
• accept(): accept a new connection
• Write(): write data to a socket
• Read(): read data from a socket
• sendto(): send a datagram to another UDP socket
• recvfrom(): read a datagram from a UDP socket
• close(): close a socket (tear down the connection)
394/7/2018
Java URL Class
• Represents a Uniform Resource Locator
– scheme (protocol)
– hostname
– port
– path
– query string
404/7/2018
Parsing
• You can use a URL object as a parser:
URL u = new URL(“”);
System.out.println(“Proto:” + u.getProtocol());
System.out.println(“File:” + u.getFile());
414/7/2018
URL construction
• You can also build a URL by setting each part individually:
URL u = new URL(“http”,
www.cs.unr.edu,80,”/~mgunes/”);
System.out.println(“URL:” + u.toExternalForm());
System.out.println(“URL: “ + u);
424/7/2018
Retrieving URL contents
• URL objects can retrieve the documents they refer to!
– actually this depends on the protocol part of the URL.
– HTTP is supported
– File is supported (“file://c:\foo.html”)
– You can get “Protocol Handlers” for other protocols.
• There are a number of ways to do this:
Object getContent();
InputStream openStream();
URLConnection openConnection();
434/7/2018
Getting Header Information
• There are methods that return information extracted from
response headers:
String getContentType();
String getContentLength();
long getLastModified();
444/7/2018
URLConnection
• Represents the connection (not the URL itself).
• More control than URL
– can write to the connection (send POST data).
– can set request headers.
• Closely tied to HTTP
454/7/2018
File đính kèm:
bai_giang_cong_nghe_java_chuong_13_java_socket_programming_t.pdf

