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

黑马程序员-java基础 网络编程

2012-06-14 16:56 281 查看
---------------------- android培训java培训 、期待与您交流! ----------------------

 

 

网络编程:

如何连接网络中的计算机?

1 找到对方IP

2 数据要发送到对方指定的应用程序上,为了标识这些程序,所以这些网络程序都用

数字标识,这个数字就是端口号

3 定义协议 通信规则,这个通信规则称为协议。国际组织定义了通用协议 TCP/IP

网络模型:

osi参考模型

TCP/IP参考模型

UDP 

面向无连接

将数据及源和目的封装成数据包,不需要建立连接

每个数据包的大小限制在64k内

因为是无连接,所以是不可靠协议,但是速度快

通过UDP传输方式,发送数据思路

1 建立UDPSocket服务

2 提供数据,并把包数据封装成包

3 通过scoket服务的发送功能,将数据包发出去

4 关闭资源

 

public class UdpSend {

 public static void main(String[] args) throws IOException {

  //通过DatagramSocket对象创建udp服务

  DatagramSocket ds = new DatagramSocket();

  //确定要发送的数据

  byte[] buf = "abcdef".getBytes();

  //将要发送的数据封装成包

  DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.1.100"), 9999);

  //通过创建的udp对象的socket服务的send方法将已有的数据发送出去

  ds.send(dp);

  //关闭服务

  ds.close();

  

 }

}

通过UDP传输方式,接受数据思路

1 定义UDPSocket服务

2 定义一个数据包,因为要存储接受到的字节数据。而数据包对象中有更多的功能

可以提取字节数据中的不同数据信息

3 通过scoket服务的receive方法将收到的数据存入已定义好的数据包中

4 通过数据包的特有功能,将这些不同的数据取出,打印在控制台上

5 关闭资源

public class UdpRece {

 public static void main(String[] args) throws IOException {

  //创建UDP服务

  DatagramSocket ds = new DatagramSocket(9999);

  while(true){

   

   //定义数据包用于储存数据

   byte[]  buf = new byte[3];

   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());

   int port = dp.getPort();

   System.out.println(ip+"--"+data+"--"+port);

  }

  //ds.close();

 }

}

socket

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

通信两端都有socket

网络通信其实就是Scoket间通信

数据在两个Scoket间通过io传输

 

TCP

面向有连接

建立连接 形成传输数据的通道

在连接中进行大数据量传输

通过三次握手完成连接,是可靠协议

必须建立连接,效率会稍低

tcp传输

1 tcp分客户端和服务端

2 客户端对应的对象时Socket,该对象建立时,就可以去连接指定主机

因为TCP是面向连接的,所以在建立socket服务时,就要有服务端存在,并连接成功

形成通路后在该通道进行数据传输

3 服务端对应的是ServerSocket。

 

tcp传输步骤:

客户端

1 创建socket服务,并指定要连接的主机和端口

2 通过客户端对象的getOutputStream方法获取输出流

3 通过获取的输出流写入数据

4 关闭socket服务

public class SocketTest {

 public static void main(String[] args) throws IOException {

  //创建客户端Socket对象,并指定主机和端口

  Socket s = new Socket("192.168.1.100",11111);

  //通过客户端对象的getOutputStream方法获取输出流

  OutputStream os = s.getOutputStream();

  //写入数据

  os.write("aaaa".getBytes());

  //关闭客户端对象

  s.close();

  

 }

}

服务端

1 建立服务端的socket服务,ServerSocket()并监听一个端口

2 获取连接过来的客户端对象:通过ServerSocket的accept方法。没有连接就会等

所以这个方法是阻塞式的

3 客户端如果发过来数据,那么服务器端要使用对应的客户端对象,并收取到该客户端

对象的读取流来读取发过来的数据

4 关闭服务器(可选)

public class ServerSocketTest {

 public static void main(String[] args) throws IOException {

  //创建ServerSocket对象,并监听端口

  ServerSocket ss = new ServerSocket(11111);

  //通过accpet方法获取连接过来的客户端对象

  Socket s =ss.accept();

  //通过得到的客户端对象获取输入流

  InputStream in = s.getInputStream();

  //创建数组,存储得到数据

  byte[] buf = new byte[1024];

  //通过输入流对象把数据读取到数组中

  int line=in.read(buf);

  System.out.println(new String(buf,0,line));

  

 }

}

 

使用键盘录入,因为其有阻塞式方法,要注意回车符结束标记。当然也可用printStream 设置参数为true 自动刷新

shutdownOutput()  关闭输出流,相当于给流中加一个结束标记-1

url 类

String getFile();  获取url的文件名

String getHost();  获取url的主机名

String getPath();  获取url的路径部分

String getPort();  获取url的端口号

String getProtocol();  获取url的协议名称

String getQuery();  获取url的查询部

 

域名解析

浏览器发起请求,先去本机找域名解析文件,没有找到再去找公网找dns服务器解析域名,dns服务器解析域名后向浏览器返回相应的

ip地址,浏览器再向得到的ip地址发起请求

 

 

---------------------- android培训java培训 、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息