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

来源:互联网 发布:淘宝网笔袋图片 编辑:程序博客网 时间:2024/05/01 22:54

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

在java中网络程序有两种协议:TCP和UDP,TCP通过握手协议进行可靠的连接,UDP则是不可靠连接。

网络编程中两个主要的问题一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。

在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。

而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。

什么是Socket?(可以比作邮局或者码头)

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。

但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。



udp和tcp传输的区别:

UDP1,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。

            2,UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。

           3,UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方

TCP1,面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中需要连接

                时间。

            2,TCP传输数据大小限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大的  

                    数据。

             3,TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。



/*
udp的发送端:1,建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。2,明确要发送的具体数据。3,将数据封装成了数据包。4,用socket服务的send方法将数据包发送出去。5,关闭资源。
*/


import java.net.*;class  UdpSend{public static void main(String[] args)throws Exception {//1,建立udp的socket服务。DatagramSocket ds = new DatagramSocket(8888);//指定发送端口,不指定系统会随机分配。//2,明确要发送的具体数据。String text = "udp传输演示 哥们来了";byte[] buf = text.getBytes();//3,将数据封装成了数据包。DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000);//4,用socket服务的send方法将数据包发送出去。ds.send(dp);//5,关闭资源。ds.close();}}

/* 
udp的接收端:1,创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。2,定义数据包,用于存储接收到数据。3,通过socket服务的接收方法将收到的数据存储到数据包中。4,通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。5,关闭资源。
*/


class UdpRece {public static void main(String[] args) throws Exception{//1,创建udp的socket服务。DatagramSocket ds = new DatagramSocket(10000);//2,定义数据包,用于存储接收到数据。先定义字节数组,数据包会把数据存储到字节数组中。byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);//3,通过socket服务的接收方法将收到的数据存储到数据包中。ds.receive(dp);//该方法是阻塞式方法。//4,通过数据包的方法获取数据包中的具体数据内容,比如ip,端口,数据等等。String ip = dp.getAddress().getHostAddress();int port = dp.getPort();String text = new String(dp.getData(),0,dp.getLength());//将字节数组中的有效部分转成字符串。System.out.println(ip+":"+port+"--"+text);//5,关闭资源。ds.close();}}

TCP客户端:1,建立tcp的socket服务,最好明确具体的地址和端口。这个对象在创建时,就已经可以对指定ip和端口进行连接(三次握手)。2,如果连接成功,就意味着通道建立了,socket流就已经产生了。只要获取到socket流中的读取流和写入流即可,只要通过getInputStream和getOutputStream就可以获取两个流对象。3,关闭资源。


--------------------------------------------------------------
import java.net.*;import java.io.*;//需求:客户端给服务器端发送一个数据。class  TcpClient{public static void main(String[] args) throws Exception{Socket s = new Socket("10.1.31.69",10002);OutputStream out = s.getOutputStream();//获取了socket流中的输出流对象。out.write("tcp演示,哥们又来了!".getBytes());s.close();}}
//服务端
--------------------------------------------------------------
class  TcpServer{public static void main(String[] args) throws Exception{ServerSocket ss = new ServerSocket(10002);//建立服务端的socket服务Socket s = ss.accept();//获取客户端对象String ip = s.getInetAddress().getHostAddress();System.out.println(ip+".....connected");//可以通过获取到的socket对象中的socket流和具体的客户端进行通讯。InputStream in = s.getInputStream();//读取客户端的数据,使用客户端对象的socket读取流byte[] buf = new byte[1024];int len = in.read(buf);String text = new String(buf,0,len);System.out.println(text);//如果通讯结束,关闭资源。注意:要先关客户端,在关服务端。s.close();ss.close();}}


-----------------------------------------------------------------------------------------------
0 0
原创粉丝点击