网络编程三要素:ip地址,端口,协议
两个DOS命令:ipconfig--查看本机ip地址 ping+ip地址--测试本机与指定ip地址间通信是否有问题
特殊ip地址:127.0.0.1--回环地址(表示本机) x.x.x.255--广播地址 x.x.x.0--网络地址
ip地址:
对ip地址的获取和操作,java提供InetAddress类:
没有构造方法:
三种情况会没有构造方法:成员全部是静态 单例设计模式 类中有静态方法返回该类的对象
InetAddress有4静态方法根据不同参数返回InetAddress对象,用这个对象获取和操作ip
端口号:
端口号是正在运行的程序的标识,有效端口从0到65535,其中0到1024是系统使用或保留端口
协议:
UDP:将数据源和目的封装在数据报中,不需要建立连接,每个数据报大小不超过64k,无连接,不可靠,速度快
TCP:建立连接,三次握手完成连接,可靠协议,效率稍低
一般一个软件既有UDP又有TCP
Socket:
网络上具有唯一标识的ip地址和端口号组合在一起才能构成唯一能识别的标识符套接字,即Sockt包含了IP地址+端口
网络编程也就是Socket编程
通信两端都有Socket,网络通信就是Socket间的通信,数据在两个Socket间通过IO传输
UDP和TCP使用不同的Socket
TCP Socket:
客户端套接字:java.net.Socket,直接子类:SSLSocket
服务端套接字:java.net.ServerSocket,直接子类:SSLServerSocket
UDP Socket:java.net.DatagramSocket,直接子类:MuticastSocket
UDP协议发送数据:
创建发送端Socket对象
创建数据并把数据打包
调用Socket对象的send方法发送数据包
释放资源
class UDPSendDemo{
public static void main(String[] args) throws IOException {
//创建发送端Socket对象
DatagramSocket ds = new DatagramSocket();
//创建数据并把数据打包
//通过DatagramPacket(byte[] buf, int length, IneAddress address, int port)打包数据
//要发送的具体数据
byte[] buf = "hello".getBytes();
//长度
int length = buf.length;
//远程主机ip地址对象
InetAddress address = InetAddress.getByName("192.168.12.92");
//远程主机端口号
int port = 10086;
DatagramPacket dp = new DatagramPacket(buf,length,address,port);
ds.send(dp);
ds.close();
}
}
UDP协议接收数据:
创建接收端Socket对象
创建一个数据包(接收容器)
调用Socket对象的接收方法接收数据
解析数据包,并显示
释放资源
class UDPReceiveDemo{
public static void main(String[] args) throws IOException{
//创建接收端Socket对象,因为是接收端,所以要指定一个端口号
DatagramSocket ds = new DatagramSocket(10086);
//创建一个数据包接收容器
byte[] buf = new byte[1024];
int length = buf.length;
DatagramPacket dp = new DatagramPacket(buf,length);
//调用Socket的接收方法接收数据
//阻塞式方法,接收端运行后,不接受到发送端数据报时,会一直运行着
ds.receive(dp);
//解析数据包并展示,获取ip,获取数据
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
byte[] buf2 = dp.getData();
int len = dp.getLength();
String s = new String(buf2,0,len);
System.out.println("发送的数据是"+ s);
//释放资源
ds.close();
}
}
TCP协议要一定要先开服务端
TCP发送数据:
创建发送端Socket对象,如果成功,说明连接已经建立
连接被拒绝:java.net.ConnectException:Connect refused:connect
获取输出流,写数据
释放资源
class TCPSendDemo{
public static void main(String[] args) throws IOException{
//创建发送端Socket对象
Socket s = new Socket("192.168.12.92",8888);
//获取输出流,写数据
OutputStream os = s.getOutputStream();
os.write("hello".getBytes());
//通知服务器发送完毕
s.shutdownOutput();
//释放资源
s.close();
}
}
TCP接收数据
创建接收端Socket对象
监听客户端连接,返回一个对应的Socket对象
获取输入流,读取数据并展示
释放资源
class TCPServerDemo{
public static void main(String[] args) throws IOException{
//创建接收端Socket对象
ServerSocket ss = new ServerSocket(8888);
//监听客户端连接,返回一个对应的Socket对象
//accept方法侦听并接收此套接字的连接,在连接传入前一直阻塞
Socket s = ss.accept();
//获取输入流,读取数据并展示
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);//阻塞式方法
String str = new String(buf,0,len);
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"-----"+str);
//释放资源
s.close();
}
}
释放资源