InetAddress
此类用来表示互联网协议(IP)地址
常用方法:
String getHostName()
获取此IP地址对应的主机名
String getHostAddress()
返回IP地址的字符串表现形式
代码表示:
package
com.czz.test09;
import
java.net.InetAddress;
public
class
InetAddressDemo {
public
static
void
main(String[]
args
)
throws
Exception {
//
获取
InetAddress
对象
InetAddress
address
= InetAddress.
getByName
(
"
丛中之
"
);
// InetAddress address = InetAddress.getByName("192.168.14.42");
//
获取对应的主机名
,
和
IP
地址
String
ip
=
address
.getHostAddress();
System.
out
.println(
ip
);
//192.168.14.21
String
hostName
=
address
.getHostName();
System.
out
.println(
hostName
);
}
}
UDP编程
发送端:
User Datagram protocol: 用户数据报协议
使用的类是
DatagramSocket
发送端发送数据步骤:
1.创建DatagramSocket对象
2.创建数据包
3.发送数据
4.关闭Socket
代码示例:
package
com.czz.test09;
import
java.net.DatagramPacket;
import
java.net.DatagramSocket;
import
java.net.InetAddress;
public
class
UdpSender {
public
static
void
main(String[]
args
)
throws
Exception {
//
创建
udp
协议发送端对象
DatagramSocket
sock
=
new
DatagramSocket();
//
创建数据报包
byte
[]
buf
=
"hell world"
.getBytes();
int
len
=
buf
.
length
;
//
在给定主机名的情况下确定主机的
IP
地址
InetAddress
address
= InetAddress.
getByName
(
"localhost"
);
int
port
= 3333;
DatagramPacket
pack
=
new
DatagramPacket(
buf
, 0,
len
,
address
,
port
);
//
调用
sock
的方法发送数据包
sock
.send(
pack
);
//
释放资源
sock
.close();
}
}
接收端
接收端接收数据步骤:
1.创建DatagramSocket对象
2.创建接收数据包
3.接收数据,做进一步的处理
4.关闭Socket
代码示例:
package
com.czz.test09;
import
java.net.DatagramPacket;
import
java.net.DatagramSocket
;
public
class
UdpReceiver {
public
static
void
main(String[]
args
)
throws
Exception {
//
创建
DatagramSocket
对象
DatagramSocket
sock
=
new
DatagramSocket
(
3333
);
//
创建数据报包
byte
[]
buf
=
new
byte
[1024 * 64];
//64kb
DatagramPacket
pack
=
new
DatagramPacket(
buf
,
buf
.
length
);
//
接收数据到数据报包中
sock
.receive(
pack
);
//
解析数据
byte
[]
data
=
pack
.getData();
//
获取真实数据的长度
int
len
=
pack
.getLength();
System.
out
.println(
new
String(
data
, 0,
len
));
//
释放资源
sock
.close();
}
}
UDP编程练习
发送端接收从键盘录入的数据,在接收端的控制台显示出来
当键盘录入886时,发送端结束发送
重点:接收端不能关闭,要一直等待发送端发送数据
发送端对键盘录入数据也是一个循环判断的过程
发送端代码:
package
com.czz.test02;
import
java.net.DatagramPacket;
import
java.net.DatagramSocket;
import
java.net.InetAddress;
import
java.util.Scanner;
/*
*
发送端发送数据步骤
:
1.
创建
DatagramSocket
对象
2.
创建数据包
3.
发送数据
4.
关闭
Socket
*/
public
class
UdpSender {
public
static
void
main(String[]
args
)
throws
Exception {
Scanner
sc
=
new
Scanner(System.
in
);
//
创建
sock
对象
DatagramSocket
sock
=
new
DatagramSocket();
DatagramPacket
pack
;
InetAddress
address
= InetAddress.
getByName
(
"
丛中之
"
);
while
(
true
) {
String
line
=
sc
.next();
if
(
line
.equals(
"886"
)) {
break
;
}
byte
[]
buf
=
line
.getBytes();
pack
=
new
DatagramPacket(
buf
,
buf
.
length
,
address
, 8888);
//
发送数据
sock
.send(
pack
);
}
//
释放资源
sock
.close();
}
}
接收端代码:
package
com.czz.test02;
import
java.net.DatagramPacket;
/*
*
接收端接收数据步骤
:
1.
创建
DatagramSocket
对象
2.
创建接收数据包
3.
接收数据
,
做进一步的处理
4.
关闭
Socket
*/
import
java.net.DatagramSocket;
public
class
UdpReceive {
public
static
void
main(String[]
args
)
throws
Exception {
//
创建
DatagramSocket
对象
DatagramSocket
sock
=
new
DatagramSocket(8888);
byte
[]
buf
=
new
byte
[1024 * 64];
DatagramPacket
pack
=
new
DatagramPacket(
buf
,
buf
.
length
);
while
(
true
) {
sock
.receive(
pack
);
//
解析数据包
byte
[]
data
=
pack
.getData();
int
length
=
pack
.getLength();
String
address
=
pack
.getAddress().getHostAddress();
String
hostName
=
pack
.getAddress().getHostName();
System.
out
.println(
"
发送端
IP
地址
: "
+
address
+
"
发送端主机名
: "
+
hostName
+
"
发送数据
:"
+
new
String(
data
,0,
length
));
}
}
}
Socket通信原理
广义上的Socket: 指网络上两个程序之间的通信(可能是TCP或UDP)
狭义上的Socket: 指的是TCP协议通信
定义:
网络上进行双向通信的两个程序中的一个端点,是对本主机IP地址和端口号的一个封装.即:socket = IP + port
TCP 协议
是一种可靠的网络协议,俗称"三次握手协议".它在通信的两端各自简历一个socket,从而在通信的两端形成一个虚拟的网络连接,一旦建立网络连接,两端就可以进行通信了.
socket对象包含了主机和端口,并可以产生IO流来进行网络间的通信.
TCP编程
示例:
客户端:
package
com.czz.test03;
/*
*
客户端发送数据步骤
:
* 1.
创建
socket
对象
* 2.
使用
socket
对象创建输出流
* 3.
向输出流中写入数据
* 4.
释放资源
*/
import
java.io.OutputStream;
import
java.net.Socket;
public
class
Client {
public
static
void
main(String[]
args
)
throws
Exception {
//
创建
socket
对象
Socket
sock
=
new
Socket(
"
丛中之
"
, 8888);
//
使用
socket
创建输出流
OutputStream
out
=
sock
.getOutputStream();
//
向输出流中写入数据
out
.write(
"
倪玲是美女吗
?"
.getBytes());
//
使用平台的默认字符集将此
String
编码为
byte
序列,并将结果存储到一个新的
byte
数组中
//
释放资源
out
.close();
sock
.close();
}
}
服务端:
package
com.czz.test03;
/*
*
服务端接收数据步骤
:
* 1.
创建
serversocket
对象
* 2.
使用
serversocket
对象接收客户端连接
* 3.
获取输入流
* 4.
从流中获取数据
* 5.
释放资源
*/
import
java.io.InputStream;
import
java.net.ServerSocket;
import
java.net.Socket;
public
class
Server {
public
static
void
main(String[]
args
)
throws
Exception {
//
创建
serversocket
对象
ServerSocket
ss
=
new
ServerSocket(8888);
//
接收客户端连接
Socket
sock
=
ss
.accept();
//
获取输入流
InputStream
in
=
sock
.getInputStream();
//
从流中获取数据
byte
[]
buf
=
new
byte
[1024 * 5];
int
len
=
in
.read(
buf
);
System.
out
.println(
new
String(
buf
,0,
len
));
//
释放资源
in
.close();
sock
.close();
ss
.close();
}
}
练习:
从客户端键盘录入数据,显示在服务端控制台上
客户端:
package
com.czz.test04;
/*
*
从客户端键盘录入数据,显示在服务端控制台上
键盘录入数据
,
需要自定义结束标记
*/
import
java.io.OutputStream;
import
java.net.Socket;
import
java.util.Scanner;
public
class
Client
{
public
static
void
main(String[]
args
)
throws
Exception {
Scanner
sc
=
new
Scanner(System.
in
);
//
创建
socket
对象
Socket
sock
=
new
Socket(
"
丛中之
"
, 7777);
//
使用
socket
创建输出流
OutputStream
out
=
sock
.getOutputStream();
while
(
true
) {
String
line
=
sc
.next();
//
阻塞式方法
if
(
line
.equals(
"886"
)) {
break
;
}
byte
[]
bs
=
line
.getBytes();
out
.write(
bs
);
}
out
.close();
sock
.close();
}
}
服务端:
package
com.czz.test04;
import
java.io.InputStream;
import
java.net.ServerSocket;
import
java.net.Socket;
public
class
Server
{
public
static
void
main(String[]
args
)
throws
Exception {
ServerSocket
ss
=
new
ServerSocket(7777);
Socket
sock
=
ss
.accept();
//
阻塞式方法
InputStream
in
=
sock
.getInputStream();
byte
[]
b
=
new
byte
[1024];
int
len
= 0;
while
((
len
=
in
.read(
b
)) != -1) {
System.
out
.println(
new
String(
b
,0,
len
));
}
}
}
从客户端键盘录入数据,显示在服务端控制台上(优化方案)
客户端:
package
com.Socket;
/*
*
从客户端键盘录入数据,显示在服务端控制台上
键盘录入数据
,
需要自定义结束标记
优化方案
*/
import
java.io.BufferedWriter;
import
java.io.OutputStreamWriter;
import
java.net.Socket;
import
java.util.Scanner;
public
class
Client {
public
static
void
main(String[]
args
)
throws
Exception {
Scanner
sc
=
new
Scanner(System.
in
);
//
创建
socket
对象
Socket
sock
=
new
Socket(
"
丛中之
"
, 6666);
//
使用
socket
对象创建输出流
BufferedWriter
bw
=
new
BufferedWriter(
new
OutputStreamWriter(
sock
.getOutputStream()));
while
(
true
) {
String
line
=
sc
.nextLine();
if
(
line
.equals(
"886"
)) {
break
;
}
bw
.write(
line
);
bw
.newLine();
bw
.flush();
}
bw
.close();
sock
.close();
}
}
服务端:
package
com.Socket;
import
java.io.BufferedReader;
import
java.io.InputStreamReader;
import
java.net.ServerSocket;
import
java.net.Socket;
public
class
Server {
public
static
void
main(String[]
args
)
throws
Exception {
//
创建
serversocket
对象
ServerSocket
ss
=
new
ServerSocket(6666);
Socket
socket
=
ss
.accept();
BufferedReader
br
=
new
BufferedReader(
new
InputStreamReader(
socket
.getInputStream()));
String
line
=
null
;
while
((
line
=
br
.readLine()) !=
null
) {
System.
out
.println(
line
);
}
}
}
从客户端发送一个文本文件到服务端,保存在服务端文件中(实际上就是上传文件到服务器)
发送端:
package
com.Socket2;
import
java.io.BufferedReader
;
import
java.io.BufferedWriter;
import
java.io.FileReader;
import
java.io.OutputStreamWriter;
import
java.net.Socket;
public
class
Client {
public
static
void
main(String[]
args
)
throws
Exception {
Socket
sock
=
new
Socket(
"
丛中之
"
, 5555);
BufferedReader
br
=
new
BufferedReader
(
new
FileReader(
"czz.txt"
));
BufferedWriter
bw
=
new
BufferedWriter(
new
OutputStreamWriter(
sock
.getOutputStream()));
String
line
=
null
;
while
((
line
=
br
.readLine()) !=
null
){
bw
.write(
line
);
bw
.newLine();
bw
.flush();
}
br
.close();
bw
.close();
sock
.close();
}
}
服务端:
package
com.Socket2;
import
java.io.BufferedReader;
import
java.io.BufferedWriter;
import
java.io.FileWriter;
import
java.io.InputStreamReader;
import
java.net.ServerSocket;
import
java.net.Socket;
public
class
Server {
public
static
void
main(String[]
args
)
throws
Exception {
ServerSocket
ss
=
new
ServerSocket(5555);
Socket
socket
=
ss
.accept();
BufferedReader
br
=
new
BufferedReader(
new
InputStreamReader(
socket
.getInputStream()));
BufferedWriter
bw
=
new
BufferedWriter(
new
FileWriter(
"nl.txt"
));
String
line
=
null
;
while
((
line
=
br
.readLine()) !=
null
) {
bw
.write(
line
);
bw
.newLine();
bw
.flush();
}
br
.close();
bw
.close();
}
}
在服务端接收完文件后,给客户端传递一个反馈信息:文件已成功接收
发送端:
package
com.czz.test09;
import
java.io.BufferedReader;
import
java.io.BufferedWriter;
import
java.io.FileReader;
import
java.io.InputStreamReader;
import
java.io.OutputStreamWriter;
import
java.net.Socket;
/*
*
在服务端接收完文件后
,
给客户端传递一个反馈信息
:
文件已成功接收
*/
public
class
Client {
public
static
void
main(String[]
args
)
throws
Exception {
Socket
sock
=
new
Socket(
"
丛中之
"
, 8888);
//
数据源
BufferedReader
br
=
new
BufferedReader(
new
FileReader(
"nl.txt"
));
//
封装字符流
BufferedWriter
bw
=
new
BufferedWriter(
new
OutputStreamWriter(
sock
.getOutputStream()));
//
流对考
String
line
=
null
;
while
((
line
=
br
.readLine()) !=
null
){
bw
.write(
line
);
bw
.newLine();
bw
.flush();
}
//
关闭输出流
sock
.shutdownOutput();
//
接收来自服务端的反馈信息
BufferedReader
br2
=
new
BufferedReader(
new
InputStreamReader(
sock
.getInputStream()));
String
message
=
br2
.readLine();
System.
out
.println(
message
);
//
释放资源
bw
.close();
br
.close();
sock
.close();
}
}
服务端:
package
com.czz.test09;
import
java.io.BufferedReader;
import
java.io.BufferedWriter;
import
java.io.FileWriter;
import
java.io.InputStreamReader;
import
java.io.OutputStreamWriter;
import
java.net.ServerSocket;
import
java.net.Socket;
public
class
Server {
public
static
void
main(String[]
args
)
throws
Exception {
ServerSocket
ss
=
new
ServerSocket(8888);
Socket
sock
=
ss
.
accept
();
//
阻塞方法
BufferedReader
br
=
new
BufferedReader(
new
InputStreamReader(
sock
.getInputStream()));
BufferedWriter
bw
=
new
BufferedWriter(
new
FileWriter(
"czz.txt"
));
String
line
=
null
;
while
((
line
=
br
.readLine()) !=
null
) {
bw
.write(
line
);
bw
.newLine();
bw
.flush();
}
BufferedWriter
bw2
=
new
BufferedWriter(
new
OutputStreamWriter(
sock
.getOutputStream()));
bw2
.write(
"
文件接收完毕
"
);
bw2
.close();
br
.close();
bw
.close();
sock
.close();
ss
.close();
}
}
上传图片到服务端
发送端:
package
com.czz.test10;
import
java.io.BufferedInputStream;
import
java.io.BufferedOutputStream;
import
java.io.FileInputStream;
import
java.net.Socket;
/*
*
上传图片到服务端
*/
public
class
Client {
public
static
void
main(String[]
args
)
throws
Exception {
Socket
sock
=
new
Socket(
"
丛中之
"
, 8888);
//
封装数据源
BufferedInputStream
bis
=
new
BufferedInputStream(
new
FileInputStream(
"E:\\
图片
\\
宝马
\\psb.jpg"
));
//
封装目的地
BufferedOutputStream
bos
=
new
BufferedOutputStream(
sock
.getOutputStream());
//
流的对考
int
b
= 0;
while
((
b
=
bis
.read()) != -1){
bos
.write(
b
);
bos
.flush();
//
不刷新也可以
,
关闭
bos
和
bis
}
// bos.close();
// bis.close();
sock
.close();
}
}
服务端:
package
com.czz.test10;
import
java.io.BufferedInputStream;
import
java.io.BufferedOutputStream;
import
java.io.FileOutputStream;
import
java.net.ServerSocket;
import
java.net.Socket;
public
class
Server {
public
static
void
main(String[]
args
)
throws
Exception {
ServerSocket
ss
=
new
ServerSocket(8888);
Socket
sock
=
ss
.accept();
//
封装数据源
BufferedInputStream
bis
=
new
BufferedInputStream(
sock
.getInputStream());
//
封装目的地
BufferedOutputStream
bos
=
new
BufferedOutputStream(
new
FileOutputStream(
"E:\\
图片
\\
宝马
\\psb1.jpg"
));
//
流的对考
int
b
= 0;
while
((
b
=
bis
.read()) != -1){
bos
.write(
b
);
}
//
释放资源
bos
.close();
bis
.close();
sock
.close();
ss
.close();
}
}