初涉通信编程
初涉通信编程
从两个罐头加一根线开始,人类就在探索如何利用工具进行远程通信,从飞鸽传书、鸿雁传信、烽火传音,百余年已经过去,人类的通信史依旧在不断的进化。而随着1831年,法拉第发现电磁感应这一现象之后,人类使用电进行信息传递的时代也逐渐开启。通讯技术关键性的变革发生在19世纪中期。1844年5月24日,美国艺术家兼发明家莫尔斯成功发出了世界上第一份长途电报。从此,千百年来人类千里传音的梦想终于得以实现。发展到今天,我们已经处于一个信息弥漫的时代,从互联网,移动互联网,物联网、?手机通信由1G、2G、2.5G、3G、4G?。。。
未来总是充满太多想象,而我们更能把握的只是现在,在蓝杰,我接触到了JAVA网络通信编程方面的知识,也算是我已经站在了通信世界的门口了。
TCP通信
TCP协议介绍
TCP是面向连接的通信协议,通过三次握手建立连接,只能用于点对点的通信。TCP提供的是一种可靠的数据流服务,采用差错重传技术来实现。TCP还可以进行流量控制,从而限制了发送方的速度。封装好的TCP数据服务包将向上传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号确认,所以未按照顺序收到的包可以排序,而损坏的包可以重新传输。TCP将它的通信信息传送到更高层的应用程序,例如Telent的服务程序和客户端。应用程序轮流信息送回TCP层,TCP层便将他们向下传送,设备驱动程序和物理介质,最后到接收方。是一个不断打包,包上加包,再不断拆包,一层接着一层的拆解的过程。在这里我理解为:具体到抽象,在由抽象到具体的实现过程。在这过程中由很多抽象层组成。
TCP三次握手:三次握手是指通过TCP客户机与服务器建立练习时,为了达到安全传输数据和确保连接而进行的三次同步作用的包。首先,发送一个同步消息,对方收到后加上一个确认消息回同步消息,己方收到后也又一次发送确认消息和同步消息的包。
2.TCP通信编程通信建立简要流程
A.创建服务器对象
ServerSokcet ss = new ServerSocket(9090);//设定本机上的一个端口给服务器程序使用。
Sockect client = new Socket(192.168.1.168,9090);//设置目标机器和IP和通信程序的通信端口。
while( true){Socket client =ss.accept();//这里让服务器在while中等待:阻塞状态。}//根据获取的不同的消息连接对象,就会创建不同的线程进行处理。 Thread td =New processThread(client);//这里我们把线 Td.start();
OutputStream os = client.getOutputStream();os.write("消息内容");IntputStream is = client.getIntputStream();Is.read("消息内容")java.net.DatagramSocket server=new java.net.DatagramSocket("192.168.1.168",13000);//包装本地IT地址和程序端口SocketAddress destAdd = new InetSocketAddress("192.168.1.188",140000);//包装目标机器Ip地址和程序端口Byte buffer[] = new ("消息内容").getBytes();//我们将数据打包成字节数组//创建要发送的数据包,指定内容,指定目标地址DatagramPacket dp = new DatagramPacket(buffer,buffer.length,destAdd );
server.send(dp);//利用Socket对象发送数据。
SocketAddress localAddr = new InetSocketAddress("192.168.1.188",14000);//包装本地数据地址DatagramPacket packet = new DatagramPacket(buffer,buffer.length);//这里装载的是字节数据包。
receiveSocket.receive(packet);//从接收的Socket对象中读取数据到数据包。
package UDPCOM;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;import java.net.SocketAddress;/** * UDP通信服务器 * @author DeopingXiong * */public class Sever {public static void main(String args[]){//程序入口try{//1.创建要来发送的本地地址对象SocketAddress localAddr = new InetSocketAddress("192.168.1.106",16000);//2.接收服务器UDP端口DatagramSocket recvSokect = new DatagramSocket(localAddr);while(true){ //3.指定接收缓冲区大小byte[] buffer = new byte[55];//4.创建接收数据包对象,指定接收大小DatagramPacket packet = new DatagramPacket(buffer,buffer.length);recvSokect.receive(packet);//因为阻塞所以循环接收发送方发送的消息//得到发送方的ip和端口SocketAddress address = packet.getSocketAddress();//转换接收到的数据为字符串String msg = new String(packet.getData()).trim();//接收到后,打印出接收到的数据System.out.println("客户端:"+msg+"from:"+address);}}catch(Exception e){e.printStackTrace();}}}