1.操作 InetAddress地址
/**
*操作 InetAddress地址
* @author YZB
*/
publicclass IPDome {
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
try {
InetAddress i = InetAddress.getLocalHost();
System.out.println(i.toString());
System.out.println("address:"+i.getHostAddress());
System.out.println("name:"+i.getHostName());
InetAddress ia=InetAddress.getByName("193.168.1.110");
System.out.println("name:"+ia.getHostName());
System.out.println("address:"+ia.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
2.UDP
UDP协议的全称是用户数据包协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议
UDP的特性:
它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
比如我们聊天用的ICQ和QQ就是使用的UDP协议。
例1:
(1)接收端:
/**
* UDP接收端 需求:定义一个程序,用于接收UDP协议传输数据并处理
* 1.定义UDPSocket服务
* 2.定义一个数据包,因为要存储接收到的字节数据--因为数据包对象中有更多功能可以提前字节数据中的不同数据信息
* 3.通过Socket服务的receive方法将收到的字节数据存入已定义好的数据包中
* 4。通过数据包对象的特有功能将这些不同的数据取出,打印在控制台上
* 5.关闭资源
*@author YZB
*/
publicclass UDPRece {
publicstaticvoid main(String[] args) {
DatagramSocket ds = null;
try {
ds = new DatagramSocket(1000);
byte[] buf = newbyte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
try {
ds.receive(dp);
} catch (IOException e) {
e.printStackTrace();
}
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
int port = dp.getPort();
System.out.println("IP地址为:" + ip + "对你说:" + "::" + port);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//ds.close();
}
}
(2):发送端1
/**
* UDP发送端 需求:通过UDP传输方式,将一段文字数据发送出去。
* 1.建立UDPSocket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义数字标示,方便与明确那些数据过来该应用程序可以处理。
* 2.提供数据,并将数据封装到数据包中
* 3.通过socket服务的发送功能,将数据包发出去 4.关闭资源.
* @author YZB
*/
publicclass UDPSend {
publicstaticvoid main(String[] args) {
DatagramSocket ds = null;
try {
ds = new DatagramSocket();
// BufferedReader从字符输入流中读取文本,缓冲各个字符 ,InputStreamReader 是字节流通向字符流的桥梁
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = bufr.readLine()) != null) {
if ("886".equals(line)) {
ds.close();
break;
}
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName("192.168.1.100"), 1000);
ds.send(dp);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
例2:
/**
* 使用UDP编写一个聊天工具
* @author YZB
*
*/
publicclass UDP聊天 {
publicstaticvoid main(String[] args) {
try {
DatagramSocket SendSocket = new DatagramSocket();
DatagramSocket ReceSocket = new DatagramSocket(1000);
new Thread(new Send(SendSocket));
new Thread(new Rece(ReceSocket));
} catch (SocketException e) {
e.printStackTrace();
}
}
}
class Send implements Runnable {
private DatagramSocket ds;
public Send(DatagramSocket ds) {
this.ds = ds;
}
@Override
publicvoid run() {
try {
BufferedReader bufr = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
while ((line = bufr.readLine()) != null) {
if ("886".equals(line)) {
ds.close();
break;
}
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName("192.168.1.100"), 1000);
ds.send(dp);
}
} catch (IOException e) {
System.out.println("发送端失败!!");
e.printStackTrace();
}
}
}
class Rece implements Runnable {
private DatagramSocket ds;
public Rece(DatagramSocket ds) {
this.ds = ds;
}
@Override
publicvoid run() {
try {
while (true) {
byte[] buf = newbyte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
intport = dp.getPort();
System.out.println("IP地址为:" + ip + "对你说::" + data);
}
} catch (IOException e) {
System.out.println("接收失败!!");
e.printStackTrace();
}
}
}
3.TCP
TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议
例1:
/**
* 服务端
* 需求:定义端点接收数据并打印在控制台上
* @author YZB
*/
publicclass TCPSever {
publicstaticvoid main(String[] args) {
try {
// 1.建立服务端socket服务,并监听一个端口。
ServerSocket ss = new ServerSocket(1003);
// 2.通过accept方法获取连接过来的客户端对象
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + "连进来了!!");
// 3.获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据
InputStream in = s.getInputStream();
byte[] buf = newbyte[1024];
int len = in.read(buf);
System.out.println(new String(buf, 0, len));
Thread.sleep(10000);
OutputStream out = s.getOutputStream();
out.write("客户端我以收到!!".getBytes());
// 4.释放资源
s.close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 客户端
* 需求:创建Socket服务,并指定要连接的主机和端口
* @author YZB
*/
publicclass TCPClient {
publicstaticvoid main(String[] args) {
try {
//1.创建客户端socket服务,指定目的主机和端口
Socket s=new Socket("192.168.1.100",1003);
//2.为了发送数据,应该获取socket流中的输出流
OutputStream out=s.getOutputStream();
//3.写入数据
out.write("TCP 我来啦!!".getBytes());
InputStream in=s.getInputStream();
byte[]buf=newbyte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
//4.释放资源
s.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
例2:
/**
* 创建客户端,接收对象
* @author YZB
*/
publicclass TCPFuWuDuan {
publicstaticvoid main(String[] args) {
try {
ServerSocket serverscoket=null;//创建服务器端套接字
Socket clientsocket=null;//创建客户端套接字
String str=null;
DataOutputStream out=null;//创建DataOutputStream类对象
DataInputStream in=null;//创建DataInputStream类对象
serverscoket=new ServerSocket(4332);//实例化套接字对象
System.out.println("等待和客户机的连接!");
clientsocket=serverscoket.accept();//接受客户连接呼叫
//实例化DataInputStream对象
in=new DataInputStream(clientsocket.getInputStream());//获取套接字的输入流
out=new DataOutputStream(clientsocket.getOutputStream());//获取套接数的输出流
while(true){
str=in.readUTF();
out.writeUTF(str);//读取客户放入连接中的信息
System.out.println("服务器收到:"+str);
Thread.sleep(1000);//线程休眠
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 创建客户端
* @author YZB
*/
publicclass TCPKeHuDuan {
publicstaticvoid main(String[] args) {
try {
Socket clientSocket;//创建客户端套接字
DataInputStream in = null;
DataOutputStream out = null;
clientSocket = new Socket("localhost", 4332);
in = new DataInputStream(clientSocket.getInputStream());
out = new DataOutputStream(clientSocket.getOutputStream());
out.writeUTF("卧室客户机:");
String str = null;
int i = 0;
while (true) {
str = in.readUTF();// 读取流中的数据
out.writeUTF(i++ + "");// 向流中写入数据
System.out.println("客户端收到:" + str);// 输出信息
Thread.sleep(1000);// 线程休眠
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}