本帖最后由 chenyanchenyan 于 2017-12-4 15:05 编辑
网络编程
一、定义:可在网络间通信
二、网络通信3要素:
A:IP地址 公共地址 私有地址
B:端口号 设备进场地址,(软件之间连接的编号)
C:通信协议:UDP协议 不需连接,不区分客户端和服务端,速度快 不可靠。 TCP协议 要连接 区分客户端和服务端 效率 低 可靠
三、InetAddress类的常用方法:
static InetAddress getByname(String name);//通过主机名/IP地址构建一个InetAddress对象
Static getHostAddress();//返回IP地址
getHostName();//返回主机名
四、UDP协议:
发送端:创建发送端Socket对象->创建数据并打包->发送数据->释放资源
DatagramSocket:用来发送接收数据,基于UDP
DatagramSocket():
DatagramSocket(int port):
DatagramPacket(byte[] buf,int length,InetAddres address,int port)
//发送端
[Java] 纯文本查看 复制代码 public class UDPIPsendss {
public static void main(String[] args) throws IOException {
DatagramSocket dgs = new DatagramSocket();
//发送的内容
String s = "hello";
//转成字节数组
byte[] by = s.getBytes();
//获取字节数组长度
int len = by.length;
//获取发送的地址
InetAddress iad = InetAddress.getByName("127.0.0.1");
//指定设备端口号
int port = 8888;
//打包
DatagramPacket p = new DatagramPacket(by, len, iad, port);
//发送数据
dgs.send(p);
//释放资源
dgs.close();
}
}
接受端:创建接收端Socket对象->接收数据->解析数据->输出数据->释放资源
//接受端
[Java] 纯文本查看 复制代码 public class UDPipReceive {
public static void main(String[] args) throws IOException {
//创建接收到对象,并给定端口号
DatagramSocket ds = new DatagramSocket(8888);
//创建一个包用来存接收到的信息
byte[] by = new byte[1024];
int length = by.length;
DatagramPacket dp = new DatagramPacket(by, length);
//将信息传入包
ds.receive(dp);//阻塞
//获取发送端地址
InetAddress adress = dp.getAddress();
//获取接收到的数据
byte[] b = dp.getData();
//获取接收到的长度
int len = dp.getLength();
//打印信息
System.out.println("-->"+adress.getHostAddress());
System.out.println(new String(b,0,len));
//释放资源
ds.close();
}
}
注意事项:A:端口号错误,可发送,无异常,接收不到,B:端口号不能重复
五、TCP协议:
创建发送端(客户端)Socket对象->获取输出流对象->发送数据->释放资源
创建接受端(服务端)Socket对象(确认端口号)->监听(阻塞)->创建输入流对象->获取数据->输出对象->释放资源(可不关)
ServerSocket(int port);
Socket accept();
//发送端
[Java] 纯文本查看 复制代码 public class TcpSends {
public static void main(String[] args) throws IOException {
//创建发送端Socket对象
Socket s = new Socket(InetAddress.getByName("127.0.0.1"),9999);
//创建输出流
OutputStream os =s.getOutputStream();
String ss = "hello";
//发送数据
os.write(ss.getBytes());
//释放资源
os.close();
}
}
//接受端
[Java] 纯文本查看 复制代码 public class TcpReceive {
public static void main(String[] args) throws IOException {
//创建接受端(服务端)Socket对象(确认端口号)
ServerSocket ss = new ServerSocket(9999);
//监听(阻塞)
Socket s = ss.accept();
//创建输入流对象
InputStream is = s.getInputStream();
//准备一个数组用来存放接收到的字节
int len;
byte[] by = new byte[1024];
//获取数据
len = is.read(by);
InetAddress iad = s.getLocalAddress();
System.out.println("client-->"+iad);
//输出接收到的信息
System.out.println(new String(by,0,len));
s.close();
}
}
小案例
[Java] 纯文本查看 复制代码 //客户端读取本地一个图片并发送,服务端接收并存储
public class TCPSendZong {
public static void main(String[] args) throws IOException {
//创建Socket对象,给出发送的目的地址和端口号
Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 8888);
//创建输出流
OutputStream os = s.getOutputStream();
//提升至高效输出流
BufferedOutputStream bos = new BufferedOutputStream(os);
//创建高效输入流,读取本地图片
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("学习途.png"));
//读取数据
byte[] by = new byte[1024];
int len = by.length;
while((len = bis.read(by))!=-1){
//发送
bos.write(by,0,len);
}
//释放资源
s.close();
bos.close();
bis.close();
}
}
public class TCPSerZong {
public static void main(String[] args) throws IOException {
//创建服务端的Socket对象
ServerSocket ss = new ServerSocket(8888);
//服务端获取Socket对象,接收
Socket s = ss.accept();
//创建输入流
InputStream is = s.getInputStream();
//提高输入流高效级别
BufferedInputStream bis = new BufferedInputStream(is);
//创建输出流将接收到的图片保存到本地
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D://a.png"));
//接收到的信息
byte[] by = new byte[1024];
int len;
while((len=bis.read(by))!=-1){
//写入本地地址
bos.write(by,0,len);
}
//释放资源
s.close();
bis.close();
bos.close();
}
}
|