黑马程序员技术交流社区

标题: 【石家庄校区】JavaEE个人学习总结day12-网编 [打印本页]

作者: sun2ice    时间: 2018-1-4 17:08
标题: 【石家庄校区】JavaEE个人学习总结day12-网编
本帖最后由 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();
```






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2