您的位置:首页 > 编程语言 > Java开发

JAVA Socket编程

2016-03-30 18:15 483 查看
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的技术。

针对网络通信的不同层次,Java提供了不同的API,其提供的网络功能有四大类:

1.InetAddress:用于标识网络上的硬件资源,主要是IP地址

2.URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据

3.Sockets:使用TCP协议实现的网络通信Socket相关的类
4.Datagram:使用UDP协议,将数据保存在用户数据报中,通过网络进行通信。

InetAddress

package com.maiya;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;

public class TestInetAddress {
public static void main(String[] args) {
try {
//使用getLocalHost()静态方法获取InetAddress
InetAddress inet=InetAddress.getLocalHost();
//获取主机名
String hostName=inet.getHostName();
//获取主机IP
String hostIp=inet.getHostAddress();
//获取主机字节数组形式的IP
byte[] ip=inet.getAddress();

System.out.println("InetAddress:"+inet);
System.out.println("hostName:"+hostName);
System.out.println("hostIp:"+hostIp);
System.out.println("byteIp:"+Arrays.toString(ip));

} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
这是输出信息(Ip这儿用*代替掉):
InetAddress:dell/172.16.**.***
hostName:dell
hostIp:172.16.**.***
byteIp:[172, 16, **, ***]

URL

package com.maiya;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class TestURL {
public static void main(String[] args) throws IOException {
try {
//创建URL
URL url=new URL("http://www.baidu.com/s?ie=utf-8&tn=94235251_hao_pg&word=java");
//获取协议名称
String protocal=url.getProtocol();
//获取主机名称
String host=url.getHost();
//获取端口号(如果未设置端口号,则返回 -1)
int port=url.getPort();
//获取文件名
String fileName=url.getFile();
//获取文件路径
String filePath=url.getPath();
//获取此 URL 的锚点(#后面的部分)
String ref=url.getRef();
//获取此 URL 的查询部分
String query=url.getQuery();

System.out.println("URL:"+url);
System.out.println("protocal:"+protocal);
System.out.println("host:"+host);
System.out.println("port:"+port);
System.out.println("fileName:"+fileName);
System.out.println("filePath:"+filePath);
System.out.println("ref:"+ref);
System.out.println("query:"+query);

//获取该URL的字节输入流,打印出该URL指向的文件内容
InputStream in=url.openStream();
//将字节流转换成字符流
InputStreamReader isr=new InputStreamReader(in);
//为字符流加缓冲
BufferedReader bis=new BufferedReader(isr);
String line=null;
StringBuffer str=new StringBuffer();
while((line=bis.readLine())!=null){
str.append(line);
}

System.out.println("输入流内容:"+str);
//关闭相应资源
bis.close();
isr.close();
in.close();

} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
//输出的信息
URL:http://www.baidu.com/s?ie=utf-8&tn=94235251_hao_pg&word=java
protocal:http
host:www.baidu.com
port:-1
fileName:/s?ie=utf-8&tn=94235251_hao_pg&word=java
filePath:/s
ref:null
query:ie=utf-8&tn=94235251_hao_pg&word=java
输入流的内容:<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">..........//太长了,这儿就不显示了

Socket

Socket是使用TCP实现的网络通信,它的核心类为:ServerSocket和Socket,分别代表服务端和客户端的Socket。这儿用一个客户端登录至服务端的例子说明,实现逻辑是:客户端向服务端发送登录信息,服务端接收到信息后打印输出。看代码:

package com.maiya;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import sun.print.resources.serviceui;

/**
* Socket的使用:服务端
* @author WHF
*/
public class Service {
public static void main(String[] args) {
try {
//创建一个服务端的Socket指定端口号
ServerSocket serverSocket=new ServerSocket(8080);
//开始监听客户端连接,此时服务端会处于阻塞状态
Socket socket=serverSocket.accept();

//获取客户端发送的消息,并输出打印
InputStream in=socket.getInputStream();
InputStreamReader reader=new InputStreamReader(in);
BufferedReader buffer=new BufferedReader(reader);
String info=null;
while((info=buffer.readLine())!=null){
System.out.println("我是服务器,客户端说:"+info);
}
//关闭Socket(直接关闭Socket即可,不用关闭传输流,因为关闭传输流的同时Socket也会随之关闭)
socket.close();
serverSocket.close();

} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.maiya;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
* Socket的使用:客户端
* @author WHF
*
*/
public class Client {
public static void main(String[] args) {
try {
//创建Socket,指定服务端主机名和端口号
Socket socket=new Socket("localhost",8080);
OutputStream out=socket.getOutputStream();
//将输出流包装成打印流
PrintWriter pw=new PrintWriter(out);
pw.write("用户名:maiya;密码:123");
pw.flush();
//关闭socket(直接关闭Socket即可,不用关闭传输流,因为关闭传输流的同时Socket也会随之关闭)
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

UDP

UDP是使用UDP实现的网络通信,其两个核心类为:DatagramSocket 端对端通信、DatagramPacket 数据报包。这儿继续使用客户端登录至服务端的例子说明,看代码:
package com.maiya;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
* UDP使用:服务端
* @author WHF
*/
public class UDPService {
public static void main(String[] args) {
try {
//创建服务器端的DatagramSocket,指定端口号
DatagramSocket datagrameSocket=new DatagramSocket(8080);
//创建一个字节数组接收数据报
byte[] data=new byte[1024];
//创建数据报,用来接收客户端发送的数据
DatagramPacket packet=new DatagramPacket(data,data.length);
//接收客户端发送的数据报(在接收到数据之前处于阻塞状态)
datagrameSocket.receive(packet);
//读取数据
String info=new String(data,0,packet.getLength());
System.out.println("我是服务器端,客户端说:"+info);

//关闭资源
datagrameSocket.close();

} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.maiya;

import java.io.IOException;
import
a243
java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/**
* UDP使用:客户端
* @author WHF
*/
public class UDPClient {
public static void main(String[] args) {
try {
//获取主机InetAddress
InetAddress address=InetAddress.getByName("localhost");
//创建客户端端的DatagramSocket
DatagramSocket datagrameSocket=new DatagramSocket();
//创建一个字节数组发送数据报
byte[] data="用户名:maiya,密码:456".getBytes();
//创建数据报,用来发送的数据,指定要发送数据的字节数组和长度以及服务器的InetAddress和端口号
DatagramPacket packet=new DatagramPacket(data,data.length,address,8080);
//发送数据报
datagrameSocket.send(packet);

//关闭资源
datagrameSocket.close();

} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息