本帖最后由 sun2ice 于 2018-1-4 17:32 编辑
#day 12网编入门
* Soket---.套接字
##网络编程三要素:
* IP地址 : InetAddress 网络中设备的标识(1-254)
* 端口号 : 用于标识进程的逻辑地址,不同进程的标识
* cmd-->打开命令-->netstat -an
* 协议 : 规则,数据传递/交互规则.
* UDP 不需要建立连接 速度快 不可靠协议 数据传输 包大小限制64k(用户数据报协议)
* 使用场景 : 实时性要求高的 如 网路游戏 网路电话等
* TCP 需要建立连接 没有数据的大小限制 速度慢,安全(传输控制协议)
* 使用场景 : 要求准确性高的场景 如 金融系统,视频点播
* cmd-->打开命令-->ipconfig
##InetAAdress常用方法
* 调用静态方法获取对象
* 静态方法
* `static InetAddress getLocalHost()`: 获取本机的InetAddress对象
* `static InetAddress getByName(String host)`: 根据主机名或IP的字符串获取主机的InetAddress对象
* `static InetAddress getLoopbackAddress()`: 获取回环地址的InetAddress对象
* 成员方法
* `String getHostAddress()`: 返回主机的IP地址
* `String getHostName()`: 返回主机名
* `String getCanonicalHostName()`: 获取此IP地址的完全限定域名
##UDP协议发收数据
* UDP
* `DatagramSocket`类: 基于UDP协议的Socket
* 构造方法
* `DatagramSocket()`: 创建DatagramSocket对象, 随机分配端口号
* `DatagramSocket(int port)`: 创建DatagramSocket对象, 指定端口号
* 成员方法
* `void send(DatagramPacket p)`: 发送数据包
* `void receive(DatagramPacket p)`: 接收数据, 数据保存在DatagramPacket对象中
* `void close()`: 关闭通信, 释放资源
* `DatagramPacket`类: UDP数据包
* 构造方法
* `DatagramPackage(byte[] msg, int msgLength, InetAddress host, int port)`: 创建数据包对象, 指定数据, 目标主机对象, 端口
* `DatagramPacket(byte[] buf, int length)`: 创建数据包对象, 接收数据为length的数据, 存入byte数组中
* 成员方法
* `byte[] getData()`: 获取包中的数据, 以byte数组形式
* `int getLength()`: 获取数据包中数据的长度, 即byte数组的长度
* `int getPort()`: 获取发送方端口号
* `InetAddress getAddress()`: 获取数据包发送方的InetAddress对象
##UDP协议发数据
```
//创建发出端对象
DatagramSocket ds = new DatagramSocket();
//准备数据
byte[] buf = "Hello,I am comming".getBytes();
//获取本机IP地址
InetAddress ip = InetAddress.getLocalHost();
//创建数据包对象
DatagramPacket dp = new DatagramPacket(buf, buf.length, ip, 9999);
//发送数据
ds.send(dp);
//关闭资源\
ds.close();
```
##UDP协议收数据
```
//创建接受的对象
DatagramSocket ds = new DatagramSocket(9999);//要与发出端口号一致
//创建接收的数据包对象
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//接收
ds.receive(dp);
//获取来源发送端IP对象
InetAddress address = dp.getAddress();
//获取数据
byte[] data = dp.getData();
int length =dp.getLength();
String s = new String(data, 0, length);
//打印
System.out.println(address.getHostName() + "发来消息===>" + s);
ds.close()
```
##TCP常用方法
* `Socket`类: 基于TCP协议的Socket
* 构造方法
* `Socket(InetAddress add, int port)`
* 成员方法
* `OutputStream getOutputStream()`: 获取输出流对象, 用于发送数据
* `InputStream getInputStream()`: 获取输出流, 即接收数据
* `void close()`: 释放资源
* `ServerSocket`: TCP服务端
* 构造方法
* `ServerSocket(int port)`
* 成员方法
* `Socket accept()`: 监听数据, 会阻塞. 收到数据后返回Socket对象
* `void close()`: 关闭Socket
##TCP协议发送数据
```
//创建发送端Socket对象
Socket socket = new Socket(InetAddress.getByName("192.168.12.48"), 8888);
//通过Socket获取字节输出流对象
PrintWriter pw = new PrintWriter(accept.getOutputStream(),true);
//发送数据
pw.println("nishinagesansdkfa");
//释放资源
socket.close();
```
##TCP协议收数据
```
//创建接收端对象
ServerSocket ss = new ServerSocket(8888);//保证端口一致
//监听等待客户端连接
Socket socket = ss.accept();
//通过socke获取输入流
//获取输入流对象
BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream()));
//读取的字符串
String s=br.readLine();
//获取客户端信息
//System.out.println(socket.getInetAddress());//返或IP地址
//打印
System.out.println(socket.getInetAddress()+"===>"+s);
ss.close();
```
##TCP
```
//创建客户端的对象Socket
Socket socket = new Socket(InetAddress.getByName("SJY-PC"), 8888);
//根据Socket创建输出流对象
PrintWriter pw = new PrintWriter(accept.getOutputStream(),true);
//写出 发送数据
pw.println("falasdf;asd;fsa;fjsjf");
//根据Socket创建输入流对象
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//读取返回数据
String readLine = br.readLine();
//打印
System.out.println(readLine);
//释放资源
socket.close();
```
```
//创建服务端对象
ServerSocket ss = new ServerSocket(8888);
//监听
Socket accept = ss.accept();
//创建输入流根据Socket
BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream()));
//读数据
String string = br.readLine();
//转大写返回
string = string.toUpperCase();
//创建输出流 打印流
PrintWriter pw = new PrintWriter(accept.getOutputStream(),true);
//发送数据
pw.println(string);
//释放资源
accept.close();
```
|
|