//获取本机的InetAddress实例
InetAddress address = InetAddress.getLocalHost();
System.out.println("计算机名:"+ address.getHostName());
System.out.println("IP地址:"+address.getHostAddress());
//获取字节数组形式的IP地址
byte[] bytes = address.getAddress();
System.out.println("字节数组形式的IP:"+Arrays.toString(bytes));
System.out.println(address);
//根据主机名获取InetAddress实例
InetAddress address2 = InetAddress.getByName("localhost");
System.out.println("计算机名:"+ address2.getHostName());
System.out.println("IP地址:"+address2.getHostAddress());
//创建URL实例—————
URL urlString = new URL("http://www.baidu.com");
URL url = new URL(urlString, "/index.html?username = tom#test");
System.out.println("协议:"+url.getProtocol());
System.out.println("主机:"+url.getHost());
//未指定端口号 使用默认端口号 此时Por方法返回值是-1
System.out.println("端口:"+url.getPort());
System.out.println("文件路径:"+url.getPath());
System.out.println("文件名:"+url.getFile());
System.out.println("相对路径:"+url.getRef());
System.out.println("查询字符转:"+url.getQuery());
// 端口:-1
// 文件路径:/index.html
// 文件名:/index.html?username = tom
// 相对路径:test
// 查询字符转:username = tom
// 通过URL对象的openSteam()方法可以得到执行的资源输入流
// 通过输入流可以读取、访问网络上的数据
// 使用读取网页内容
URL urlS = new URL("http://www.baidu.com");
try {
// 通过URL的openSream方法获取URL对象所表示的资源字节输入
InputStream is = urlS.openStream();
// 将字节输入流转换为字节输入流
InputStreamReader isr = new InputStreamReader(is);
// 为字符输入流添加到缓冲
BufferedReader br = new BufferedReader(isr);
String data = br.readLine(); //读取数据
while (data!= null) {
System.out.println(data);
data = br.readLine();
}
br.close();
isr.close();
is.close();
Socket TCP编程
// Socket实现步骤
// 创建ServerSocket和Socket 打开连接到Socket的输入输出流
// 服务器端
// 1、创建ServerSocket对象,绑定监听端口 2、通过accept()方法监听客户端请求
// 3、连接建立后,通过输入流读取客户端发送的请求信息 4、通过输出流向客户点发送相应信息
// 5、关闭相关资源
// 客户端
// 1、创建Socket对象,指明需要连接的服务器的地址和端口号
// 2、连接建立后,通过输出流流向服务器端发送请求信息
// 3、通过输入流获取服务器相应的信息 4、关闭相关资源
//服务器线程处理类————
public class ServerThread extends Thread {
// 和本线程相关的socket
Socket socket = null;
public ServerThread(Socket socket){
this.socket = socket;
}
// 线程执行的操作, 响应客户端的请求
public void run() {
//
// 获取输入流 并读取客户端信息
InputStream is = null;
InputStreamReader isr= null;
// 为输入流添加缓冲
BufferedReader br = null;
// 获取输出流响应客户端的请求
OutputStream os = null;
PrintWriter pw = null;
try {
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String info = null;
while ((info = br.readLine()) != null) {// 循环读取客户端的信息
System.out.println("我是服务器, 客户端说:"+ info);
}
socket.shutdownInput();// 关闭输入流
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("hello lanuch");
pw.flush(); //将缓冲输出
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if(pw!=null)
// 关闭相关的资源
pw.close();
if(os!= null)
os.close();
if(br!= null)
br.close();
if(isr!= null)
isr.close();
if(is!= null)
is.close();
if(socket!= null)
socket.close();
//基于TCP协议的Socket通信实现登录=============
// 服务器端
// 创建服务器端Socket ServerSocket 指定绑定的端口号,并监听此端口
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
// 记录客户端的数量
int count = 0;
System.out.println("**服务器即将启动,等待客户端的连接***");
while(true){
// 调用accept()方法开始监听 等待客户端连接
socket = serverSocket.accept();
// 创建一个新线程
ServerThread serverThread = new ServerThread(socket);
// 启动线程
serverThread.start();
count++;
System.out.println("客户端的数量"+count);
}
获取输入流 并读取客户端信息
// InputStream is = socket.getInputStream(); //字节输入流
// InputStreamReader isr = new InputStreamReader(is); //将字节流转换为字符流
为输入流添加缓冲
// BufferedReader br = new BufferedReader(isr);
// String info = null;
// while ((info = br.readLine()) != null) {// 循环读取客户端的信息
//
// System.out.println("我是服务器, 客户端说:"+ info);
// }
// socket.shutdownInput();// 关闭输入流
//
获取输出流响应客户端的请求
// OutputStream os = socket.getOutputStream();
// PrintWriter pw = new PrintWriter(os); //包装打印流
// pw.write("hello lanuch");
// pw.flush(); //将缓冲输出
//
关闭相关的资源
// pw.close();
// os.close();
//
// br.close();
// isr.close();
// is.close();
// socket.close();
// serverSocket.close();
客户端——————————————————
1.创建客户端Socket 指定服务器地址和端口
Socket socket = new Socket("127.0.0.1", 8888);
// 2.获取输出流,向服务器端发送信息
OutputStream os = socket.getOutputStream(); //字节输出流
PrintWriter pw = new PrintWriter(os); //将输出流包装为打印流输出
pw.write("用户名:admin2 ;密码:1233");
pw.flush();
socket.shutdownOutput(); //关闭输出流
// 获取输入流读取服务器端的响应信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info = br.readLine() )!= null){
System.out.println("我是客户端 服务器说:"+info);
}
// 关闭资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
基于UDP的Socket编程
客户端
/ 1、定义发送信息 2、创建DatagramPacket包含将要发送的信息
// 3、创建DatagramSocket 4、发送数据
public static void main(String[] args) throws IOException {
// 向服务器端发送数据
// 1.定义服务器的地址、端口号、数据
InetAddress address = InetAddress.getByName("localhost");
int port = 8800;
byte[] data = "用户名: admin; 密码:123".getBytes();
// 创建数据报,包含发送的数据信息
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
// 创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
// 向服务器端发送数据报
socket.send(packet);
// 接收服务器端响应的数据
// 1、创建数据报 用于接收服务器端响应的数据
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
// 2/接收服务器响应的数据
socket.receive(packet2);
// 3、读取数据
String reply = new String(data2, 0, packet2.getLength());
System.out.println("我是客户端,服务器端说:"+reply);
// 关闭资源
socket.close();
}
服务器端————
/1、服务器端实现步骤 创建DatagramSocket指定端口号 2、创建DatagramPacket
// 3、接受客户端发送的数据信息 4、读取数据
public static void main(String[] args) throws IOException {
try {
// 接收客户端发送的数据
// 创建服务器端DatagramSocket 指定端口
DatagramSocket socket = new DatagramSocket(8800);
// 创建数据报 用于接受客户端发送的数据
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
// 接收客户端发送的数据
System.out.println("我是服务器启动 等待客户端。。。");
socket.receive(packet); //此方法在接收到数据报之前会一直阻塞
// 读取数据
String info = new String(data, 0, packet.getLength());
System.out.println("我是服务器,客户端说"+info);
// 向客户端相应数据
// 定义客户端的地址、端口号、数据
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 ="欢迎 !".getBytes();
// 创建数据报 包含相应的数据信息
DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
// 响应客户端
socket.send(packet2);
// 关闭资源
socket.close();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}