您的位置:首页 > 理论基础 > 计算机网络

黑马程序员_网络编程(1)

2014-10-28 15:49 323 查看
------- android培训java培训、期待与您交流! ----------

/*
|-java.net
|-InetAddress
|-getByName(String host) 给定主机名 IP 地址。
|-getHostName() 返回IP地址主机
|-getLocalHost()返回本地主机
|-getHostAddress() 返回IP地址字符串
|-hashCode() 返回IP地址哈希码
|-toString() 将IP 地址转换为 String。返回主机名/字面值 IP 地址
|-DatagramSocket
|-receive(DatagramPacket p) 接收数据包
|-send(DatagramPacket p) 发送数据包
|-getInetAddress()
|-getLocalAddress()
|-getPort()
|-DatagramPacket
|-getAddress() 返回某台机器IP地址。
|-getData() 返回数据缓冲区。
|-getLength() 返回数据长度
|-getPort() 返回主机端口
|-Socket
|-getInputStream() 获取socket流中的输入流
|-getOutputStream() 获取socket流中的输出流
|-ServerSocket
|-accept() 获取连接的客户端对象
*/
1).网络参考模型:

OSI参考模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

TCP/IP参考模型:应用层、传输层、网际层、主机至网络层。

应用层:http ftp

传输层:TCP UDP 

网际层:IP

2).网络通讯三要素:IP地址、端口号、传输协议

IP地址:InetAddress

网络中设备的标识

不易记忆,可用主机名

本地回环地址:127.0.0.1  主机名:localhost

端口号

用于标识进程的逻辑地址,不同进程的标识

有效端口:0~65535,其中0~1024系统使用或保留端口。

备注:不是所谓的物理端口!

传输协议

通讯的规则

常见协议:TCP,UDP

//返回本地主机对象
InetAddress i = InetAddress.getLocalHost();
System.out.println("name/address:"+i.toString());
System.out.println("name:"+i.getHostName());//返回IP地址的主机
System.out.println("address:"+i.getHostAddress());//返回IP地址

InetAddress ia = InetAddress.getByName("127.0.0.1");
System.out.println("name:"+ia.getHostName());
System.out.println("address:"+ia.getHostAddress());

3).Socket

1.就是为网络服务提供的一种机制

2.通信两端都有Socket

3.网络通信就是Socket间的通信。

4.数据在两个Socket间通过IO传输。

====================
4).UDP传输:

1 面向无边连接:将数据包和目的封装成数据包中,不需要建立连接.

2 将数据封包:每个数据包的大小在64k内.

3 不可靠协议:因为无连接.

4 速度快:不需要建立连接.

例:对讲机就是UDP的,面向无连接(不管发送的数据对方是否接收)

UDP传输用到DatagramSocket,它具备发送和接受功能,

在进行udp传输时,需要明确一个是发送端,一个是接收端。

UDP的发送和接收:

接收端创建UDP的Socket服务。将数据封装成包。发送出去。

接收端创建UDP的Socket服务。接收数据包。得到信息。

import java.net.*;
class Send{
public static void main(String[] args) throws Exception{
//建立服务。设置发送端口是6666.不设置系统会自动添加一个
DatagramSocket ds = new DatagramSocket(6666);
//要发送的数据getBytes()转换到byte[]中
String str = "啼笑皆非";
byte[] buf = str.getBytes();
//将数据封包。(数组,长度,广播地址,接收端口)
//xxx.xxx.xxx.255 这个段里的广播地址,xxx.xxx.xxx.0	一个网络地址,网络段
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),8888);
//ds中send方法发送包
ds.send(dp);
//关闭资源;
ds.close();
}
}
class Rece{
public static void main(String[] args) throws Exception{
//建立服务。设置指定的接收端口8888
DatagramSocket ds = new DatagramSocket(8888);
//定义数据包存储数据。(数组,长度)
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//ds中receive接收数据存储到包中
ds.receive(dp);
//ps:发送端发送的数据及它的ip信息都存储到了dp中了

//接收到的数据,封装字符串。(getData(),0,getLength())
String data = new String(dp.getData(),0,dp.getLength());
//获取发送端主机名:getAddress().getHostName()
//获取发送端ip及主机名:getAddress().getLocalHost().toString()
String sendIp = dp.getAddress().getHostName();
//获取发送端的端口。
int sendPort = dp.getPort();
//打印接收数据的地址及内容
System.out.println(sendIp+": "+data+","+sendPort);
//关闭资源
ds.close();
}
}

5).例:编写一个聊天程序。

 1.有收数据的部分,和发数据的部分。

 2.这两部分需要同时执行。要用到多线程技术

 3.一个线程控制收,一个线程控制发。

 4.收和发动作是不一致的,定义两个run方法,封装到不同的类中

import java.io.*;
import java.net.*;
class Send implements Runnable {
private DatagramSocket ds;//创建Udp的Socket服务引用
public Send(DatagramSocket ds) {//接收DatagramSocket对象
this.ds = ds;
}
public void run() {//覆写run方法。
try {
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//获取键盘录入的数据,封装成包。发送出去

String line = null;
while ((line = bufr.readLine()) != null) {
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.255"), 10002);

ds.send(dp);
if ("886".equals(line))
break;
}
} catch (Exception e) {
throw new RuntimeException("发送端失败");
}
}
}
class Rece implements Runnable {
private DatagramSocket ds;
public Rece(DatagramSocket ds) {//接收DatagramSocket对象
this.ds = ds;
}
public void run() {
try {
while (true) {//一直建立连接。

//创建数组用来存储数据
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//receive方法接收数据存到数据包中

ds.receive(dp);
//获取数据包中数据
String ip = dp.getAddress().getHostAddress();

String data = new String(dp.getData(), 0, dp.getLength());

if ("886".equals(data)) {
System.out.println(ip + ",离开聊天室");
break;
}
System.out.println(ip + ": " + data);
}
} catch (Exception e) {
throw new RuntimeException("接收端失败");
}
}
}
public class ChatDemo {
public static void main(String[] args) throws Exception {
DatagramSocket sendSocket = new DatagramSocket();//创建Udp的Socket服务
DatagramSocket receSocket = new DatagramSocket(10002);//创建Udp的Socket服务,监听10002端口

new Thread(new Send(sendSocket)).start();//启动线程,运行run方法
new Thread(new Rece(receSocket)).start();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: