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

黑马程序员 网络编程1

2013-09-21 21:53 211 查看
------------------android培训 java培训、期待与您交流!-------------------

网络编程1
 

网络编程的目的就是指直接或间接地通过网
4000
络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。 

  目前较为流行的网络编程模型是客户机/服务器(C/S)结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。 

两类传输协议:TCP;UDP

1、 Udp(聊天)

将数据即源和目的封装在数据包中,不需要建立连接

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

无需连接,是不可靠协议

不需要建立,是可靠协议。

2、 Tcp(下载)

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

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

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

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

 

Socket是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。

 

通过udp传输方式,将一段文字数据发送到本地主机

 

//发送端代码:
package spr.internet;
import java.io.IOException;
import java.net.*;
public class UdpSend {
public static void main(String[] args) {
DatagramSocket ds = null;
try {
//1/创建udp服务,通过DatagramSocket对象。
ds = new DatagramSocket();
} catch (SocketException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
//2、确定数据,并封装成数据包。
byte[] buf ="你好!我是春哥".getBytes();
DatagramPacket dp = null;
try {
dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("localhost"), 8080);
} catch (UnknownHostException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
try {
//3、通过socket服务,将已有数据包发送出去。通过send方法。
ds.send(dp);
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
//4、关闭资源
ds.close();
}
}


 

//接收端代码:
package spr.internet;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpReceive{
public static void main(String[] args){
DatagramSocket ds = null;
try {
//1、创建udpsocket建立端点,监听一个端口
ds = new DatagramSocket(8080);
} catch (SocketException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
//2、定义数据包用于存储数据
byte[] buf =newbyte[1024*1024];
DatagramPacket dp= new DatagramPacket(buf, buf.length);
//3、通过服务的receive方法将接收到的数据存入数据包中
try {
ds.receive(dp);
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
//4、通过数据包的方法获取其中数据。
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();
System.out.println(ip+" :"+data+" : "+port);
//5、关闭资源
ds.close();
}
}


//运行结果:

127.0.0.1 : 你好!我是春哥 : 323

通过这样我们就可以写一个单向通信程序,加上线程即可实现双向通信

代码如下:

//发送端
package spr.internet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
public class UdpSend {
public static void main(String[] args) {
DatagramSocket ds = null;
try {
//1/创建udp服务,通过DatagramSocket对象。
ds = new DatagramSocket();
} catch (SocketException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
String line = null;
try {
while((line=bufr.readLine())!=null){
if("886".equals(line))
break;
//2、确定数据,并封装成数据包。
byte[] buf = line.getBytes();
DatagramPacket dp = null;
try {
dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("localhost"), 8080);
} catch (UnknownHostException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
try {
//3、通过socket服务,将已有数据包发送出去。通过send方法。
ds.send(dp);
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
//4、关闭资源
ds.close();
}
}


接收端:

package spr.internet;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpReceive{
public static void main(String[] args){
DatagramSocket ds = null;
try {
//1、创建udpsocket建立端点,监听一个端口
ds = new DatagramSocket(8080);
} catch (SocketException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
while(true){
//2、定义数据包用于存储数据
byte[] buf =newbyte[1024*1024];
DatagramPacket dp= new DatagramPacket(buf, buf.length);
//3、通过服务的receive方法将接收到的数据存入数据包中
try {
ds.receive(dp);
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
//4、通过数据包的方法获取其中数据。
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
int port = dp.getPort();
System.out.println(ip+" :"+data+" : "+port);
}
}
}

运行结果:
127.0.0.1 : 你好,我是春哥 : 3235
h哈哈127.0.0.1 : fgdfgd : 3237
127.0.0.1 : yfuyfikiuloijl :3239

TCP传输
Socket和ServerSocket
建立客服端和服务器端
建立连接后,通过Socket的IO流进行数据的传输
关闭资源
同样,客服端于服务端是两个独立的应用程序。
URL专用于接收主机地址,端口,目录,协议等信息。其中的openConnection是应用层方法,内部封装了Socket对象。可以建立服务器,返回URLConnction对象,URLConnction对象的getInputstream方法能获取服务器资源,但不会含响应头信息,其中打算openStream方法直接开流。

 ------------------android培训 java培训、期待与您交流!-------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: