黑马程序员---------Java基础知识:网络编程
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
在现在的应用当中,有很多出现需要进行网络间的数据传输,因而也要求我们需要掌握网络编程。
网间通信目前我们学到的有两种,一种是UDP,一种是TCP。TCP我们都比较熟悉,在计算机里面经常可以看到有TCP/IP字样,而UDP则比较少了解。
先说说UDP协议,UDP是一个不安全的数据包通信协议。不安全是指不需要双方网络一定处于连接状态才可以发送数据。数据包通信则指的数计算机把数据打包成最大为64K的数据包发送出去。这个协议的好处在于速度快,不需要连接。
TCP协议是建立在网间连接形成数控传输通道,在数据通道中进行大量的数据传输。这种连接是安全的,但是因为需要通信双方必须形成通道,所以是比较安全的。缺点是效率比较低。
在网络编程中一个很重要的类时Socket.这是为网络服务提供的一种机制,只有在双方都有Socket的情况下,两台计算机之间才能进行通信。Socket就像是一个接口,在网间形成通道。
UDP传输编程过程如下。
1. UDP通信,数据在Datagramsocket 和DatagramPachet间传输,Datagramsocket主要用于接收数据,DatagramPachet用于将数据打包发送出去,所以第一步明白如何定义这两个对象。
2. 建立接收端和发送端
3. 建立数据包,就是将要发送的数据打包。
4. 调用Socket的发送接收方法,接收或发送数据。
5. 关闭socket.
需要注意的是发送端和接收端必须是两个独立的程序,就像两台电脑一样。下面就以一段程序示例这个过程。
/**
* 需求:通过UDP传输方式,将一段文字发送出去,
* 思路:建立udpsocket服务
* 提供数据,并将数据封装到数据包中
* 通过socket服务发送功能就数据包发送出去
* 关闭资源
* @throws SocketException
*/
public static void sendUDP() throws Exception //发送端
{
//建立服务。通过datagramsocket对象
DatagramSocket ds =new DatagramSocket();
//确定数据,并封装成数据包使用Datagrampacket
byte[] data ="这里是需要发送的数据".getBytes();
DatagramPacket dp =new DatagramPacket(data,data.length,InetAddress.getByName("10.198.1.10"),10000);//
//"10.198.1.10"是目的地的IP地址,10000是目的地的端口号
//通过socket发送数据
ds.send(dp);
//关资源
ds.close();
}
/**
* 需求:
* 定义一个应用程序,用于接收Udp协议传输的数据并处理
* 思路”
* 定义UDPSOCKET服务
* 定义socket服务时通常要监听一个端口,其实就是给则天接收网络应用程序定义数字标识
* 方便于明确哪些数据过来该应用数据应用程序
* 定义一个数据包,因为要存储接收到的字节数据,因为数据包邮更多功能可以提取字节数据包内数据
* 通过socket服务的rec方法将接收到的数据存入已定义好的数据包中;
* 通过数据包的对象的特有功能,将这些不同的数据提取出来
* 关闭资源
*/
public static void receUDP()throws Exception
{
//创建
DatagramSocket s= new DatagramSocket(10000);//一定要写监听端口。
//定义数据包用于存储数据
byte[] buf =new byte[1024];
DatagramPacket data = new DatagramPacket(buf,buf.length);
//通过服务的rece方法将接收到的数据传入数据包中
s.receive(data);
//通过方法处理数据
String ip = data.getAddress().getHostAddress();//获取IP
String data1 = new String (data.getData(),0,data.getLength());//获取数据
int port =data.getPort();//获取端口
System.out.println(ip+":"+data1+":"+port);
s.close();//记得关
}
其中还有几个语句是比较常用的:
InetAddress i =InetAddress.getLocalHost();//获取主机地址,主机名
System.out.println(i.toString());//PC-20141128EVUO/10.198.1.10
System.out.println("主机名:"+i.getHostName());//
System.out.println("主机地址:"+i.getHostAddress());
TCP传输编程过程如下。
1.TCP通信,数据在Socket 和ServerSocket间传输,Socket是客户端,ServerSocket则是服务器,先确定客户端做什么,服务器做什么。
2.建立客户端和服务端
3.建立连接后通过Socket中IO流进行数据传输。
4.关闭socket.
下面例程演示下这个过程
import java.net.*;
import java.io.*;
/**
* 演示TCP传输的客户端和服务端的互访
*
* 需求
* 客户端给服务端发送数据,服务端收到后给客户端反馈信息
*
*
* 客户端:
* 建立socket服务,指定要连接的主机和端口
* 2获取流中的输出流,将数据写到流中,发送数据
* 3获取输入流,将服务端反馈是数据获取,并打印
* 关闭客户资源
*
* @author Administrator
*
*/
class TCP2R{//客户端
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Socket s= new Socket("10.198.1.7",1004);//目的IP和端口
OutputStream out =s.getOutputStream();//使用输出流
out.write("我是客户".getBytes());//写数据
InputStream in = s.getInputStream();//使用输入流
byte[] buf= new byte[1024];
int line =in.read(buf);//读数据
System.out.println(new String(buf,0,buf.length));
s.close();
}
}
class TCP2Server{//服务端
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
ServerSocket ss=new ServerSocket(10004);//监控的端口
Socket s = ss.accept();//获取客户端对象
String ip =s.getInetAddress().getHostAddress();
System.out.println(ip+"连接");
InputStream in =s.getInputStream();//获取输入流
byte[] buf = new byte[1024];
int line =in.read(buf);
System.out.println(new String(buf,0,line));
OutputStream out =s.getOutputStream();
out.write("客户,我已经收到数据".getBytes());
s.close();
ss.close();
}
}
这个过程当中,必须先运行服务端,然后才能运行客户端,这样才能保证数据通信的正常。还有就是客户端目的端口一定要和服务端监控端口一致,否则采集不到数据。在编程过程中一定要明确客户端和服务端的作用。客户端和服务端的语句有点不一样,所以不要弄乱了。