网络编程
网络编程的三要素:
一、Ip地址:
是网络中的设备标识
不易记忆,可用主机名
本地回环地址:127.0.0.1,主机名:localhost
二、端口号:
用于标识进程的逻辑地址,不同进程的标识,有效端口0-65535,其中0-1024位系统使用
三、传输协议
通讯的规则,常见协议TCP、UDP。
描述IP地址的类为:
InetAddress:
无构造函数,通过静态方法getLocalHost()获取实例:InetAddress i=InetAddress.getLocalHost();
重要方法:
static InetAddress getByName(String host):获取指定主机的IP和主机名。
static InetAddress[] getAllByName(String host):在给定主机名的情况下,返回IP地址所组成的数组。返回对象不唯一时,用此方法。
String getHostAddress():返回IP地址字符串文本形式,以IP地址为主。
String getHostName():返回IP地址主机名。
package wangluo.packag;
import java.net.*;
public class InetAddressDemo {
public static void main(String[] args) throws Exception{
InetAddress i=InetAddress.getByName("www.baidu.com");
String ip=i.getHostAddress();
String name=i.getHostName();
sop(ip);
sop(name);
}
public static void sop(Object obj){
System.out.println(obj);
}
}
TCP和UDP
UDP:
将数据的源和目的封装到数据包中,不需要建立连接
每个数据包的大小限制在64k内
因无连接,不是不可靠协议
不需要建立连接,传输速度快
TCP:
建立连接,形成传输通道
在连接中进行大数据量传输
通过三方握手完成连接,是可靠连接
必须建立连接,效率会稍低
Socket
Socket就是为网络服务提供的一种机制。
通信的两端都有Socket
网络通信其实就是Socket的通信
数据在两个Socket通过IO传输
UDP传输
1.利用DatagramSocket与DatagramPacket
2.建立发送端和接收端
3.将数据封包
4.调用Socket的发送接收方法传输数据
5.关闭Socket
UDP传输发送端:
package xiaobing.net;
/*
* 需求:通过UPD将一段文字发送出去
* 思路:
* 1.建立Udp socket服务
* 2.将数据封包
* 3。通过socket服务的发送发送数据
* 4.关闭资源
*/
import java.net.*;
public class UdpSend {
public static void main(String[] args)throws Exception
{
//1,创建udp服务,通过DatagramSocket对象
DatagramSocket ds=new DatagramSocket();
//2.确定数据并封包,DatagramPacket对象
byte[] buf="upd fa song chu qu".getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.100"),300001);
//3通过socket方法发出数据
ds.send(dp);
//4.关闭资源
ds.close();
}
}
接收端:
package xiaobing.net;
import java.net.*;
/*
* 需求:建立一个引用程序,接收并处理upd协议数据
* 思路:
* 1.定义udpsocket服务
* 2.定义数据包(无数据)用于存储接受到的字节数据,因为数据包中有方法提取不同数据信息
* 3.通过socket的receive方法将受到的数据存入包中
* 4.通过数据包对象的特有功能,将数据去除
* 5.关闭资源
*/
public class UdpEece {
public static void main(String[] args)throws Exception
{
// TODO Auto-generated method stub
//1.建立udp ocket
DatagramSocket ds=new DatagramSocket(200001);
//2。定义数据包
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//3.调用receive方法接收数据
ds.receive(dp);
//4通过数据包的方法获取具体数据
String ip=dp.getAddress().getHostAddress();//获取ip
String data=new String(dp.getData(),0,dp.getLength());//获取数据
int port=dp.getPort();//获取端口
System.out.println(ip+".."+data+".."+port);
//5.关闭资源
ds.close();
}
}
Tcp传输
1.建立Socket和ServerSocket客户端和服务端
2.建立连接佳偶同伙Socket的I流进行数据的传输
3.关闭socket。
TCP传输客户端:
package xiaobing.net;
import java.net.*;
import java.io.*;
/*
* 1.tcp分为客户端和服务端
* 2.客户端对象时Socket
* 服务端是ServerSocket
*
*/
/*需求:给服务端发送一个文本数据
* 客户端建立:
* 该对象一建立就可以去连接指定主机
* 步骤:
* 1,创建sockt服务,指定主机和端口
* 2.获取输出流发出数据
* 3.关闭资源
*/
public class TcpClient {
public static void main(String[] args)throws Exception
{
//1.创建socket
Socket s=new Socket("192.168.1.100",30002);
//为了发送数据,应获取socket的输出流
OutputStream out=s.getOutputStream();
out.write("tcp ni hao".getBytes());
s.close();
}
}
服务端:
package xiaobing.net;
import java.io.*;
import java.net.*;
/*
* 需求:定义端点接收数据并打印
* 服务端:
* 1.建立服务端的socket服务,ServerSocket()
* 2.获取连接过来的客户端对象,通过accept方法,这个方法是阻塞式的,没有连接就会等
* 3.客户端如果发来数据,服务端就要获取到客户端的读取流得到数据
* 4.关闭资源(可选)
*/
public class TcpServerDemo {
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
//建立socket服务,并监听端口
ServerSocket ss=new ServerSocket(30002);
//连接链接过来的客户端
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println("连接过来的是"+ip);
//获取客户端发来的数据,先获取客户端的发送流
InputStream in=s.getInputStream();
//读取数据
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
}
}
实现客户端和服务端:
package xiaobing.net;
import java.net.*;
import java.io.*;
/*演示客户端和服务端的互访
* 需求:客户端发送数据,服务端受到后,回馈信息给客户端
*
*/
/*
* 客户端:
* 1.建立socket服务,指定主机和接口
* 2.获取输出流写入数据发送
* 3.获取输入流,将服务端反馈的数据获取到并打印
* 4.关闭资源
*/
public class TcpClilect2 {
public static void main(String[] args)throws Exception
{
//建立socket
Socket s=new Socket("192.168.1.100",20004);
//获取输出流输出数据
OutputStream out=s.getOutputStream();
out.write("服务端,你好".getBytes());
//获取写入流得到服务器反馈的信息
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,1,len));
}
}
public class TcpServer2 {
public static void main(String[] args)throws Exception
{
//建立socket
ServerSocket ss=new ServerSocket(20004);
//连接连接过来的客户端
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"连过来了");
//获取客户端的输出流得到数据
InputStream out=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,1,len));
//利用客户端的输出流回馈信息
OutputStream out=s.getOutputStream();
out.write("你也好".getBytes());
}
}