网络通讯要素:
Ip地址:
网络中的设备标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
例:
package com.java;
import java.net.InetAddress;
public class IPDemo {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//通过InetAddress 获取主机名 主机地址
InetAddress i = InetAddress.getLocalHost();
System.out.println(i.toString());
System.out.println("name:"+i.getHostName());
System.out.println("address:"+i.getHostAddress());
InetAddress i1= InetAddress.getByName("www.baidu.com");
System.out.println(i1.toString());
System.out.println(i1.getHostName());
}
}
端口号:
用于标识进程的逻辑地址,不同进程的标识
有效端口:0~65535,其中0~1024系统使用或保留端口。
传输协议:
常见协议:TCP,UDP
TCP和UDP
UDP:
将数据及源封装成数据包中,不需要建立连接。
每个数据包的大小限制在64K内。
因无连接,是不可靠协议。
不需要建立连接,速度快
TCP:
建立连接,形成传输数据的通道。
在连接中进行大数据传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
Socket
Socket就是为网络服务提供的一种机制。
通信两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
UDP传输
DatagramSocket与DataGramPacket
建立发送端,接收端
建立数据包
调用Socket的发送接收方法
关闭Socket
发送端与接收端是两个独立的运行程序
UDP发送端:
思路:
1、建立udpsocket服务。
2、提供数据,并将数据封装到数据包中。
3、通过socket服务的发送功能,将数据发送出去。
4,关闭资源。
package com.java;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpSend {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
DatagramSocket dSocket = new DatagramSocket(); //建立udpsocket服务
byte[] data = "UDP 发送".getBytes(); //提供数据,并封装成数据包
DatagramPacket dp=
new DatagramPacket(data,data.length,InetAddress.getByName("10.218.180.16"),9999);
dSocket.send(dp); //通过socket服务的发送功能,将数据发出。
dSocket.close();
}
}
UDP接收端:
定义UDP接收端:
思路:
1、定义udpsocket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义一个数字标识。
方便与明确那些数据过来该应用程序可以处理。
2、定义数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
3、通过Socket服务的receive方法将接收到的数据存入已定义好的数据包中。
4、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。
5、关闭资源。
package com.java;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpRec {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
DatagramSocket recSocket = new DatagramSocket(9999);
byte[] buf= new byte[1024];
DatagramPacket dp= new DatagramPacket(buf,buf.length);
recSocket.receive(dp);
String ip= dp.getAddress().getHostAddress();
String dataString = new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();
System.out.println(ip+":"+dataString+":"+port);
recSocket.close();
}
}
TCP传输:
1、建立客户端和服务器
2、建立连接后,通过socket中的IO流进行数据传输
3、关闭socket
客户端与服务器是两个独立的应用程序
TCP发送端:
通过查阅socket对象,发现在该对象建立时,就可以连接指定主机。
因为tcp是面向连接的,所以在建立socket服务时,就要有服务端的存在,并连接成功。形成通路后,在该通道进行数据传输。
步骤:
1、创建Socket服务,并指定要连接的主机和端口。
2、为了发送数据,应该获取socket流中的输出流。
3、关闭socket。
package com.java;
import java.io.OutputStream;
import java.net.Socket;
public class TcpSend {
/**
*通过查阅socket对象,发现在该对象创建时,就可以去连接指定的主机
*因为tcp是面向连接的,所以在建立socket对象时,就要有服务端的存在
*并连接成功,形成通路后,在该通路进行数据的传输。
*
*步骤:
*1,创建socket服务,并指定连接的主机和端口。
*
*/
public static void main(String[] args) throws Exception {
Socket s = new Socket("10.218.180.16",10001); //指定目标主机和端口
OutputStream outputStream = s.getOutputStream();
outputStream.write("tcphahhahahh".getBytes());
s.close();
}
}
TCP接收端:
1、建立服务端socket服务。ServerSocket();
并监听一个端口。
2、获取连接过来的客户端对象。
通过ServerSocket的accept方法。没有连接就会等,所以这个方法是阻塞式的。
3、客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端的读取来来获取该客户端发过来的数据。并打印到控制台上。
4、关闭服务端。
package com.java;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpRec {
/**
* @param args
*/
/*
* 1、建立服务器的socket服务,serverSocket();
* 并监听一个端口
* 2、获取连接过来的客户端对象
* 通过serverSocket的accept方法,没有连接就等,所以这个方法是阻塞的。
* 3、客户端如果发过来数据,那么服务器要使用对应的客户端对象,并获取到该客户端的对象的读取流来读取发过来的数据
* 并打印到控制台
* 4、关闭服务器。(可选操作)
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//建立服务器的socket服务,serverSocket();
ServerSocket ssServerSocket = new ServerSocket(10001);
Socket socket = ssServerSocket.accept();
String ip = socket.getInetAddress().getHostAddress();
System.out.println(ip);
InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[1024];
int len = inputStream.read(buf);
System.out.println(new String(buf,0,len));
ssServerSocket.close();
}
}